• 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 [HELP WITH MOD] tfs 0.3.6 exp for killing

Provanya

New Member
Joined
Jan 20, 2017
Messages
22
Reaction score
1
I download (https://otland.net/threads/mod-full-auto-war-teambattle-event-with-random-rewards.92825/) good mod for auto team battle, but when at team fight one player kill else he not get exp. Can someone help what i must change.
I need get exp when i kill someone else at battle. And when die loss exp too.

XML:
<?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.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

</description>

<config name="teamSetting1"><![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 = 1093, y = 1152, z = 7} --Place where the event tp will be created

waitRoomPlace = {x = 1041, y = 1138, z = 7} --Place of the waitnig room (the place ppl will wait for team to be full)

waitRoomDimensions = { --Enter the start pos[top left sqm] and end pos[bottom right sqm] of waitnig room here
startPos = {x = 1033, y = 1130, z = 7},
endPos = {x = 1050, y = 1146, z = 7}
}


eventPlaceDimensions = { --Enter the start pos[top left sqm] and end pos[bottom right sqm] of event place here
startPos = {x = 1053, y = 1048, z = 7},
endPos = {x = 1130, y = 1104, z = 7}
}
blueTeamPos = {x = 1118, y = 1058, z = 7}
redTeamPos = {x = 1061, y = 1090, z = 7}


--// General settings

recruitTime = 1 -- Time in minutes to gather players to event, will broadcast event started each min

minimumPlayersJoins = 2 --If the number of layer joined is less than that then event would be cancelled

balanceTeams = false -- This will balance number of players in both teams the extra player will be kicked out of event


removeTeleportOnEventEnd = true -- if you want to remove the tp when the event finish set it to true, normally tp will just be diabled

eventMaxTime = 5 -- Time in minutes, this is the max time event will be running. After checks are caried winner is declared

showEventSats = true -- This is like a timer that is always there about event stats (time,oponents left, teammates left). It appears in the cancel messages place.

sendLeftPlayers = true -- Well this will send to all alive players the names& numebr of the oponents left each interval defined down
intervalToSendLeftPlayers = 11 -- interval(in seconds) to sendLeftPlayers , must be more than 10 sec


countDownOnStart = true -- Well this occurs when players are teleported to their places in the arena , so if this is true it start to count down to the joined players then when count down finish they can start killing each other(event really begins)

countDownFrom = 10 -- Starts count down from this number when event start, if above is set true

minJoinLevel = 50 -- minimm lvl that can join event

rewards = { --Example [%] = { {itemid/name, count} ,..........} count isnt more than 100

[65] = { {2476,1} , {"gold coin",500} },
[25] = { {"golden armor",1} , {2152,90} },
[10] = { {"dragon scale mail",1} , {"crystal coin",10} }
}

--[[ Note : make sure if you edited % that sum should be equal to 100, you can add more % elements to suit your needs also more items if you want in each %
[65],[25],[10] -> is the % of this item to be found the rest is clear ,items in each % and it will be chosen randomly]]--


]]></config>
<lib name="teamFunctions1"><![CDATA[
domodlib('teamSetting1')

--[[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('teamFunctions1')

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('teamFunctions1')

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('teamFunctions1')

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

]]></event>
<event type="statschange" name="teamEventStats" event="script"><![CDATA[
domodlib('teamFunctions1')

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 = "teamBattleStart1" time="19:25" event="script"><![CDATA[
domodlib('teamFunctions1')

function onTimer()
resetEvent()
if getTileItemById(teleporterPosition,1387).uid < 1 then
tp = doCreateItem(1387,1,teleporterPosition)
doItemSetAttribute(tp, "aid", 9991)
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 = "teamBattletime1" interval="1" event="script"><![CDATA[
domodlib('teamFunctions1')

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="9991" event="script"><![CDATA[
domodlib('teamFunctions1')

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>

to top

to top
 
Last edited by a moderator:
You can edit the Lua code inside
XML:
<event type="statschange" name="teamEventStats" event="script">
to add experience to the attacker, or take experience from the victim (cid).

Lua:
domodlib('teamFunctions1')

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
 
You can edit the Lua code inside
XML:
<event type="statschange" name="teamEventStats" event="script">
to add experience to the attacker, or take experience from the victim (cid).

Lua:
domodlib('teamFunctions1')

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
can you help me where i must write its, because i am new and i don't know where. help me plz
 
Last edited:
Not sure what correct function is, but here is a sample:
Lua:
domodlib('teamFunctions1')

corpse_ids = {
    [0] = 3065, -- female
    [1] = 3058 -- male
}
experience_gain = 5000
experience_loss = 5000

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))
           
            doPlayerAddExp(cid, -experience_loss)
            if isPlayer(attacker) {
                doPlayerAddExp(attacker, experience_gain)
            }

            if thereIsAWinner() then
                endTeamEvent("KO")
            end
            return false
        end
    end
    return true
end

Change the value of experience_gain or experience_loss to how much exp you should get / loose from killing or being killed in the event.
 
Not sure what correct function is, but here is a sample:
Lua:
domodlib('teamFunctions1')

corpse_ids = {
    [0] = 3065, -- female
    [1] = 3058 -- male
}
experience_gain = 5000
experience_loss = 5000

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))
      
            doPlayerAddExp(cid, -experience_loss)
            if isPlayer(attacker) {
                doPlayerAddExp(attacker, experience_gain)
            }

            if thereIsAWinner() then
                endTeamEvent("KO")
            end
            return false
        end
    end
    return true
end

Change the value of experience_gain or experience_loss to how much exp you should get / loose from killing or being killed in the event.
when I start server, he go off. something wrong.

(Microsoft visual C++ Runtime Library) (Program:..File:/luascript.h line 251) its i have when start server.
 
Last edited:
Here is the script repackaged into the mod:
XML:
<?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.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

</description>

<config name="teamSetting1"><![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 = 1093, y = 1152, z = 7} --Place where the event tp will be created

waitRoomPlace = {x = 1041, y = 1138, z = 7} --Place of the waitnig room (the place ppl will wait for team to be full)

waitRoomDimensions = { --Enter the start pos[top left sqm] and end pos[bottom right sqm] of waitnig room here
startPos = {x = 1033, y = 1130, z = 7},
endPos = {x = 1050, y = 1146, z = 7}
}


eventPlaceDimensions = { --Enter the start pos[top left sqm] and end pos[bottom right sqm] of event place here
startPos = {x = 1053, y = 1048, z = 7},
endPos = {x = 1130, y = 1104, z = 7}
}
blueTeamPos = {x = 1118, y = 1058, z = 7}
redTeamPos = {x = 1061, y = 1090, z = 7}


--// General settings

recruitTime = 1 -- Time in minutes to gather players to event, will broadcast event started each min

minimumPlayersJoins = 2 --If the number of layer joined is less than that then event would be cancelled

balanceTeams = false -- This will balance number of players in both teams the extra player will be kicked out of event


removeTeleportOnEventEnd = true -- if you want to remove the tp when the event finish set it to true, normally tp will just be diabled

eventMaxTime = 5 -- Time in minutes, this is the max time event will be running. After checks are caried winner is declared

showEventSats = true -- This is like a timer that is always there about event stats (time,oponents left, teammates left). It appears in the cancel messages place.

sendLeftPlayers = true -- Well this will send to all alive players the names& numebr of the oponents left each interval defined down
intervalToSendLeftPlayers = 11 -- interval(in seconds) to sendLeftPlayers , must be more than 10 sec


countDownOnStart = true -- Well this occurs when players are teleported to their places in the arena , so if this is true it start to count down to the joined players then when count down finish they can start killing each other(event really begins)

countDownFrom = 10 -- Starts count down from this number when event start, if above is set true

minJoinLevel = 50 -- minimm lvl that can join event

rewards = { --Example [%] = { {itemid/name, count} ,..........} count isnt more than 100

[65] = { {2476,1} , {"gold coin",500} },
[25] = { {"golden armor",1} , {2152,90} },
[10] = { {"dragon scale mail",1} , {"crystal coin",10} }
}

--[[ Note : make sure if you edited % that sum should be equal to 100, you can add more % elements to suit your needs also more items if you want in each %
[65],[25],[10] -> is the % of this item to be found the rest is clear ,items in each % and it will be chosen randomly]]--


]]></config>
<lib name="teamFunctions1"><![CDATA[
domodlib('teamSetting1')

--[[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('teamFunctions1')

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('teamFunctions1')

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('teamFunctions1')

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

]]></event>
<event type="statschange" name="teamEventStats" event="script"><![CDATA[
    domodlib('teamFunctions1')
     
    corpse_ids = {
        [0] = 3065, -- female
        [1] = 3058 -- male
    }
    experience_gain = 5000
    experience_loss = 5000
     
    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))
               
                doPlayerAddExp(cid, -experience_loss)
                if isPlayer(attacker) {
                    doPlayerAddExp(attacker, experience_gain)
                }
     
                if thereIsAWinner() then
                    endTeamEvent("KO")
                end
                return false
            end
        end
        return true
    end
]]></event>

<globalevent name = "teamBattleStart1" time="19:25" event="script"><![CDATA[
domodlib('teamFunctions1')

function onTimer()
resetEvent()
if getTileItemById(teleporterPosition,1387).uid < 1 then
tp = doCreateItem(1387,1,teleporterPosition)
doItemSetAttribute(tp, "aid", 9991)
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 = "teamBattletime1" interval="1" event="script"><![CDATA[
domodlib('teamFunctions1')

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="9991" event="script"><![CDATA[
domodlib('teamFunctions1')

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>
 
Here is the script repackaged into the mod:
XML:
<?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.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

</description>

<config name="teamSetting1"><![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 = 1093, y = 1152, z = 7} --Place where the event tp will be created

waitRoomPlace = {x = 1041, y = 1138, z = 7} --Place of the waitnig room (the place ppl will wait for team to be full)

waitRoomDimensions = { --Enter the start pos[top left sqm] and end pos[bottom right sqm] of waitnig room here
startPos = {x = 1033, y = 1130, z = 7},
endPos = {x = 1050, y = 1146, z = 7}
}


eventPlaceDimensions = { --Enter the start pos[top left sqm] and end pos[bottom right sqm] of event place here
startPos = {x = 1053, y = 1048, z = 7},
endPos = {x = 1130, y = 1104, z = 7}
}
blueTeamPos = {x = 1118, y = 1058, z = 7}
redTeamPos = {x = 1061, y = 1090, z = 7}


--// General settings

recruitTime = 1 -- Time in minutes to gather players to event, will broadcast event started each min

minimumPlayersJoins = 2 --If the number of layer joined is less than that then event would be cancelled

balanceTeams = false -- This will balance number of players in both teams the extra player will be kicked out of event


removeTeleportOnEventEnd = true -- if you want to remove the tp when the event finish set it to true, normally tp will just be diabled

eventMaxTime = 5 -- Time in minutes, this is the max time event will be running. After checks are caried winner is declared

showEventSats = true -- This is like a timer that is always there about event stats (time,oponents left, teammates left). It appears in the cancel messages place.

sendLeftPlayers = true -- Well this will send to all alive players the names& numebr of the oponents left each interval defined down
intervalToSendLeftPlayers = 11 -- interval(in seconds) to sendLeftPlayers , must be more than 10 sec


countDownOnStart = true -- Well this occurs when players are teleported to their places in the arena , so if this is true it start to count down to the joined players then when count down finish they can start killing each other(event really begins)

countDownFrom = 10 -- Starts count down from this number when event start, if above is set true

minJoinLevel = 50 -- minimm lvl that can join event

rewards = { --Example [%] = { {itemid/name, count} ,..........} count isnt more than 100

[65] = { {2476,1} , {"gold coin",500} },
[25] = { {"golden armor",1} , {2152,90} },
[10] = { {"dragon scale mail",1} , {"crystal coin",10} }
}

--[[ Note : make sure if you edited % that sum should be equal to 100, you can add more % elements to suit your needs also more items if you want in each %
[65],[25],[10] -> is the % of this item to be found the rest is clear ,items in each % and it will be chosen randomly]]--


]]></config>
<lib name="teamFunctions1"><![CDATA[
domodlib('teamSetting1')

--[[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('teamFunctions1')

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('teamFunctions1')

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('teamFunctions1')

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

]]></event>
<event type="statschange" name="teamEventStats" event="script"><![CDATA[
    domodlib('teamFunctions1')
   
    corpse_ids = {
        [0] = 3065, -- female
        [1] = 3058 -- male
    }
    experience_gain = 5000
    experience_loss = 5000
   
    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))
             
                doPlayerAddExp(cid, -experience_loss)
                if isPlayer(attacker) {
                    doPlayerAddExp(attacker, experience_gain)
                }
   
                if thereIsAWinner() then
                    endTeamEvent("KO")
                end
                return false
            end
        end
        return true
    end
]]></event>

<globalevent name = "teamBattleStart1" time="19:25" event="script"><![CDATA[
domodlib('teamFunctions1')

function onTimer()
resetEvent()
if getTileItemById(teleporterPosition,1387).uid < 1 then
tp = doCreateItem(1387,1,teleporterPosition)
doItemSetAttribute(tp, "aid", 9991)
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 = "teamBattletime1" interval="1" event="script"><![CDATA[
domodlib('teamFunctions1')

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="9991" event="script"><![CDATA[
domodlib('teamFunctions1')

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>
still not work. Same error. When i delete
Code:
doPlayerAddExp(cid, -experience_loss)
                if isPlayer(attacker) {
                    doPlayerAddExp(attacker, experience_gain)
                }
work but not give exp. With that server not work.

here is print scrin my eror (http://shot.qip.ru/00SdnD-41q1ISXSN/)

when i write
Code:
doPlayerAddExp(cid, -100000)
player die and lose 100000exp. but i still need make exp for killer.

and when i put here
Code:
function win(winners,type)
for _,cid in ipairs(winners) do
generateStatsMessage(cid, type, "win")
generateReward(cid)
doPlayerAddExp(cid, 50000)
end
whom win team fight can take 50000 exp like reward. But thay not take exp when kill players. need help with that.
 
Last edited by a moderator:
Back
Top