• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua Show how many players have entered the enveto.

anotapreta

New Member
Joined
Mar 12, 2010
Messages
104
Reaction score
0
Show how many players have entered the envent at time.
Show how many players have entered the envent at time.
Show how many players have entered the envent at time.


Lua:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Team Event" version="2.0" author="Damadgerz" contact="[email protected]" enabled="yes">
 <description>
 
Full auto Team BattleEvent(v2.0) for 0.4 :
 
                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 was tested on 0.4 latest one 4626, should work on lower rev too.
 
                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
 
   </description>
 
<config name="teamSetting"><![CDATA[
--[[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 = 96, y = 117, z = 7} 
 
waitRoomPlace = {x = 144, y = 41, z = 7} 
 
waitRoomDimensions = { 
                                                        startPos = {x = 134, y = 31, z = 7}, 
                                                        endPos = {x = 156, y = 53, z = 7}
                                                        }
 
 
eventPlaceDimensions = { 
                                                        startPos = {x = 176, y = 53, z = 7}, 
                                                        endPos = {x = 209, y = 74, z = 7}
                                                        }
blueTeamPos = {x = 180, y = 56, z = 7}
redTeamPos = {x = 204, y = 72, z = 7}
 
 
--// General settings
 
recruitTime = 1 
 
minimumPlayersJoins = 2 
 
balanceTeams = true 
 
 
removeTeleportOnEventEnd = false 
 
eventMaxTime = 5 
 
showEventSats = true  
 
sendLeftPlayers = true                  
intervalToSendLeftPlayers = 11 
 
 
countDownOnStart = true 
 
countDownFrom = 10                      
 
minJoinLevel = 50 
 
rewards = { 
 
                                        [65] = { {2476,1} , {"gold coin",500} },
                                        [25] = { {"golden armor",1} , {2152,90} },
                                        [10] = { {"dragon scale mail",1} , {"crystal coin",10} }
                                } 
 ]]></config>
 <lib name="teamFunctions"><![CDATA[
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
 
 
]]></lib>
 <event type="login" name="teambattleLogin" event="script"><![CDATA[
domodlib('teamFunctions')
 
function onLogin(cid)
        clearTeamEventStorages(cid)
        recieveLateReward(cid)
 
        registerCreatureEvent(cid, "teamEventStats")
        registerCreatureEvent(cid, "teambattleLogout")
        registerCreatureEvent(cid, "teambattleCombat")
        return true
end
]]></event>
<event type="combat" name="teambattleCombat" event="script"><![CDATA[
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
 
]]></event>
 <event type="logout" name="teambattleLogout" event="script"><![CDATA[
domodlib('teamFunctions')
 
function onLogout(cid)
        clearTeamEventStorages(cid)
        if thereIsAWinner() then
                endTeamEvent("KO")
        end
        return true
end
 
]]></event>
<event type="statschange" name="teamEventStats" event="script"><![CDATA[
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 
]]></event>
 
<globalevent name = "teamBattleStart" time="01:23:00" event="script"><![CDATA[
domodlib('teamFunctions')
 
function onTime()
        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
 
 
 ]]></globalevent>
 
<globalevent name = "teamBattletime" interval="1" event="script"><![CDATA[
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
 
 ]]></globalevent>
<movevent type="StepIn" actionid="9990" event="script"><![CDATA[
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
 
 
 
 
]]> </movevent>
</mod>

Show how many players have entered the envent at time.
Show how many players have entered the envent at time.
Show how many players have entered the envent at time.


i need change:
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"])

to:
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. Players Joined: [NUMBER_X]. Missing at least [NUMBER_Y] players to the event happening.",MESSAGE_TYPES["warning"])

--
i put:
Lua:
function onTime()
local minimumPlayersJoins = 10
local joinedsx = getJoiners()
local joineds = #members

local needmorex = minimumPlayersJoins - #members
local needmore = edmorex <= 0 and 0 or needmorex

        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. Players Joined: "..joineds..". Missing at least "..needmore.." players to the event happening.",MESSAGE_TYPES["warning"])
	end
 
        addEvent(startEvent, recruitTime * 60 * 1000)
 
        return true
end
                return true
        end

--
not working
all time return:
Team-Battle event is recruting players by entering event tp. Fight begins in 1 minutes. Players Joined: 0. Missing at least 10 players to the event happening.
"..#joinedsx.." and "..joineds.." and "..#members.." and "..needmore.." or "..needmorex.." all time return 0
--

help!!
REP+
 
Last edited:
Back
Top