• 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!

GlobalEvent [MOD]Full auto WAR-TeamBattle Event(with random rewards)

Doggynub

LUA / C++
Joined
Sep 28, 2008
Messages
2,541
Reaction score
186
[MOD]Full auto WAR-TeamBattle Event(Updated v2.0)

#Updated v2.0 : [Works 100%]

* For now it is tested on 0.3.6pl1 and 0.4 latest rev(should work on oldest too).

Code:
 Full auto Team BattleEvent(v2.0) for 0.3.6PL1 & 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 dislike the previous one , was tested on 0.3.6PL1 & 0.4 (latest) 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





* Both 0.4(later) and 0.3.6pl1 to adjust its starting time go to this line :
XML:
<globalevent name = "teamBattleStart" time="


* 0.3.6(PL1) version: just make a new xml file in mods folder and paste. All config & info inside
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.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="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}							--Place where the event tp will be created

waitRoomPlace = 	{x = 144, y = 41, 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 = 134, y = 31, z = 7}, 
							endPos = {x = 156, y = 53, z = 7}
							}
							

eventPlaceDimensions = {													--Enter the start pos[top left sqm] and end pos[bottom right sqm] of event place here
							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									-- 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 = true								-- This will balance number of players in both teams the extra player will be kicked out of event


removeTeleportOnEventEnd = false					-- 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="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="00:58" event="script"><![CDATA[
domodlib('teamFunctions')

function onTimer()
	resetEvent()
	if getTileItemById(teleporterPosition,1387).uid < 1 then
		tp = doCreateItem(1387,1,teleporterPosition)
		doItemSetAttribute(tp, "aid", 9990)
	end
	
	startRecruiting()
	for i = 0, recruitTime-1 do
		addEvent(doBroadcastMessage, i * 60* 1000,"Team-Battle event is recruting players by entering event tp. Fight begins in "..(i == 0 and recruitTime or recruitTime-i).." minutes.",MESSAGE_TYPES["warning"])
	end

	addEvent(startEvent, recruitTime * 60 * 1000)
	
	return true
end


 ]]></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>



*0.4 version :
Check it here






Report bugs.

Yours
~Doggynub~
 
Last edited:
ye , but doesnt work you missed some brackets and dots :)
 
Last edited:
* 0.4 version: just make a new xml file in mods folder and paste. All config & info inside
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}							--Place where the event tp will be created

waitRoomPlace = 	{x = 144, y = 41, 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 = 134, y = 31, z = 7}, 
							endPos = {x = 156, y = 53, z = 7}
							}
							

eventPlaceDimensions = {													--Enter the start pos[top left sqm] and end pos[bottom right sqm] of event place here
							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									-- 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 = true								-- This will balance number of players in both teams the extra player will be kicked out of event


removeTeleportOnEventEnd = false					-- 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="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>
 
Last edited:
hmm i tryed it and i get this:

[19/07/2010 00:13:30] mysql_real_query(): SELECT `blue` FROM `Teams` WHERE `id`='1 - MYSQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1' at line 1 (1064)

[19/07/2010 00:13:30] [Error - Npc interface]
[19/07/2010 00:13:30] data/npc/scripts/BattleNPC.lua:eek:nCreatureSay
[19/07/2010 00:13:30] Description:
[19/07/2010 00:13:30] data/lib/004-database.lua:60: [Result:getDataInt] Result not set!
[19/07/2010 00:13:30] stack traceback:
[19/07/2010 00:13:30] [C]: in function 'error'
[19/07/2010 00:13:30] data/lib/004-database.lua:60: in function <data/lib/004-database.lua:58>
[19/07/2010 00:13:30] (tail call): ?
[19/07/2010 00:13:30] data/npc/scripts/BattleNPC.lua:29: in function 'callback'
[19/07/2010 00:13:30] data/npc/lib/npcsystem/npchandler.lua:390: in function 'onCreatureSay'
[19/07/2010 00:13:30] data/npc/scripts/BattleNPC.lua:8: in function <data/npc/scripts/BattleNPC.lua:8>
 
Plz the post was updated from some time remake the functions and the
sql query
 
ok works great now except it doesnt broadcast when players die and are taken out of the arena ;o
 
ye would be too much broadcast like that :)
if you want so here you are
tested just replace the mod part
Code:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Team Event" version="1.0" author="Damadgerz" contact="[email protected]" enabled="yes">
 <description>
    
      This is a full auto Team BattleEvent(missing part for site) :
             1- Player will get the ability to talk to the npc event starter to start the event every x times(time between each event)
                 2- players will go to npc and say battle and then join their desired team(you adjust team names) , they also have ability to leave team
                 3- You have ability to set max players per each team, npc will not tp the players to arena except when both teams are full
                 4- Script automatically set the place of event to a pvp arena (players no lose items,levels,geet msg who killed them).Place cant be a non-pvp area.
                 5- if player logged out they will automatically be lifted out from event.
                 6- players in same team cant attack each others even with spells
                 7- each team will have a uniform :)
                 8-you choose where the first team be tped and where the second team be tped
                 9-when event start, you set a max time for event.So if ppl couldnt kill each other( if players in first team = players in second team when event times finish) They will automatically be sent to temple and no one will take reward and broadcast :)
                 10 -during event if max time didnt finish and player of team 1 killed all of those of team2 then players of team1 will be tped to temple broadcasting they won by killing all other members and will recieve a random reward taht you set
                 11 -Then the event will be on hold untill time between each event pass(you set that) , and when it pass a auto broadcast is made every minute to tell player that event is open.
   </description>
        




<config name="tutorial_m"><![CDATA[
       
     running1 = 12000                     --just add a non ussed storage
       running2 = 12001                     --just add a non ussed storage
        joined = 10000                      --just add a non ussed storage
                  sto = 1222                                 --just add a non ussed storage
                   
         redpotision = {x=968, y=1010, z=7}      --place where the red team player be teleported to
       blueposition = {x=983, y=1013, z=7}      --place where the blue team player be teleported to
       stoptime = 1                       --in minutes
       
     team1name = "Blue"                      --just put the name without <team>
        team2name = "Red" 
       timebetween = 5                         -- time between each event 
                
                arena = {{frompos = {x=968, y=1010, z=7}, topos = {x=983, y=1013, z=7}}}                  ----Put you event area here
        conf = {
                        
                        rewards_id = {2494, 2472, 2514, 2160}, -- Rewards ID
                    maxplayers = 1  ---maxplayers per team
                }
   

 ]]></config>
    
<event type="login" name="Tutorial Login" event="script"><![CDATA[
        function onLogin(cid)
                registerCreatureEvent(cid, "Log")
                   registerCreatureEvent(cid, "Arena")
               registerCreatureEvent(cid, "Attk")
        return true
    end

]]></event>
    <event type="combat" name="Attk" event="script"><![CDATA[
        domodlib('tutorial_m')
        function onCombat(cid, target)
        if getPlayerStorageValue(cid, joined) == 1 and getPlayerStorageValue(target, joined) == 1 then

                return false
        end
                if getPlayerStorageValue(cid, joined) == 2 and getPlayerStorageValue(target, joined) == 2 then

                return false
        end
        return true
end
]]></event>
 <event type="logout" name="Log" event="script"><![CDATA[
 domodlib('tutorial_m')
 function onLogout(cid)
  if getPlayerStorageValue(cid,joined) == 1 then
    doBroadcastMessage(""..getPlayerName(cid).." have left the War-Event")
    setPlayerStorageValue(cid,joined,-1)
        removeBlue()
   return true
   end
   if getPlayerStorageValue(cid,joined) == 2 then
    doBroadcastMessage(""..getPlayerName(cid).." have left the War-Event")
    setPlayerStorageValue(cid,joined,-1)
        removeRed()
   return true
   end
   return true
  end
        
]]></event>
<event type="statschange" name="Arena" event="script"><![CDATA[
domodlib('tutorial_m')
local 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

        local arenaID = 0
        for i = 1, #arena do
                if isInRange(getCreaturePosition(cid), arena[i].frompos, arena[i].topos) then
                        arenaID = i
                        break
                end
                if i == #arena then
                        return true
                end 
        end

            
              
       
  local corpse = doCreateItem(corpse_ids[getPlayerSex(cid)], 1, getThingPos(cid))
  doItemSetAttribute(corpse, "specialdescription", "You recognize " .. getCreatureName(cid) .. ". " .. (getPlayerSex(cid) == 0 and "She" or "He") .. " was killed by in War event.")  
         doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE)
        doSendMagicEffect(getCreaturePosition(cid), 10)
       
        doRemoveConditions(cid)
        doCreatureAddHealth(cid, getCreatureMaxHealth(cid) - getCreatureHealth(cid))
        doCreatureAddMana(cid, getCreatureMaxMana(cid) - getCreatureMana(cid))

        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You got killed by "..(isMonster(attacker) and "a "..string.lower(getCreatureName(attacker)) or isCreature(attacker) and getCreatureName(attacker) or "a field item").." in the war event.")
        if isPlayer(attacker) then
                doPlayerSendTextMessage(attacker, MESSAGE_STATUS_CONSOLE_BLUE, "You killed "..getCreatureName(cid).." in the war event.")
        end
                if getPlayerStorageValue(cid,10000) == 1 then
				removeBlue()
				  doBroadcastMessage(""..getPlayerName(cid).." Have died from the blue team during the War event. Now "..getBlue().." blue VS "..getRed().." red")
                   setPlayerStorageValue(cid,10000,-1)
                elseif getPlayerStorageValue(cid,10000) == 2 then
                   removeRed()
				    doBroadcastMessage(""..getPlayerName(cid).." Have died from the red team during the War event. Now "..getBlue().." blue VS "..getRed().." red")
                   setPlayerStorageValue(cid,10000,-1)
                  end
        return false

end

]]></event>
        <globalevent name="TeamBattle" interval="10" event="script"><![CDATA[
        domodlib('tutorial_m')

local redOutfit_male = {
lookType = math.random(128,134), 
lookHead = 94, 
lookBody = 94, 
lookLegs = 94, 
lookFeet = 94, 
lookTypeEx = 0, 
lookAddons = 3
}

local redOutfit_female = {
lookType = math.random(136,142),
lookHead = 94, 
lookBody = 94, 
lookLegs = 94, 
lookFeet = 94, 
lookTypeEx = 0, 
lookAddons = 3
}
local blueOutfit_male = {
lookType = math.random(128,134), 
lookHead = 88, 
lookBody = 88, 
lookLegs = 88, 
lookFeet = 88, 
lookTypeEx = 0, 
lookAddons = 3
}

local blueOutfit_female = {
lookType = math.random(136,142), 
lookHead = 88, 
lookBody = 88, 
lookLegs = 88, 
lookFeet = 88, 
lookTypeEx = 0, 
lookAddons = 3
}
function onStop()
setGlobalStorageValue(running1, -1)
setGlobalStorageValue(sto,1)
end
function onStopp()
  setGlobalStorageValue(running2,-1)
end
function onThink(interval, lastExecution)
local random_item = conf.rewards_id[math.random(1, #conf.rewards_id)]
 if (getBlue() == conf.maxplayers and getRed() == conf.maxplayers) then 
           if (getGlobalStorageValue(running1) == -1 and getGlobalStorageValue(sto) == -1) then
          setGlobalStorageValue(running1,1)
                 doBroadcastMessage("The Team Battle Event have started.And will end in "..stoptime.." minutes, unless one of the teams has killed all the oponents")
                  addEvent(onStop, stoptime * 60 * 1000)
              addEvent(onStopp, timebetween * 60 * 1000)
         for _, cid in ipairs(getPlayersOnline()) do
         
             if getPlayerStorageValue(cid, joined) == 1 then  
                     if getPlayerSex(cid) == 1 then
                        doCreatureChangeOutfit(cid, blueOutfit_male)
                elseif getPlayerSex(cid) ~= 1 then
                        doCreatureChangeOutfit(cid, blueOutfit_female)
                end
                   doTeleportThing(cid, blueposition, FALSE)
            doSendMagicEffect(blueposition, 10)
                 elseif getPlayerStorageValue(cid, joined) == 2 then 
                       if getPlayerSex(cid) == 1 then
                 doCreatureChangeOutfit(cid, redOutfit_male)
               elseif getPlayerSex(cid) ~= 1 then
                 doCreatureChangeOutfit(cid, redOutfit_female)
               end
                   doTeleportThing(cid, redpotision, FALSE)
            doSendMagicEffect(redpotision, 10)
                 end
                end
      end
        end
   if getGlobalStorageValue(running1) == 1 then
            setGlobalStorageValue(running2,1)
          for _, cid in ipairs(getPlayersOnline()) do
                if (getBlue() >= 1 and getRed() < 1) then
                  if getPlayerStorageValue(cid,joined) == 1 then
                     doBroadcastMessage("The War-Event has finished as the " ..team1name.. " team has killed all players in oponnent team ,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes")
             doTeleportThing(cid, {x=1000,y=1000,z=7}, FALSE)
                 doSendMagicEffect({x=1000,y=1000,z=7}, CONST_ME_TELEPORT)
                
                 doPlayerAddItem(cid, random_item, 1)
                        doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1)
                         setPlayerStorageValue(cid, joined,-1)
                         setGlobalStorageValue(running1,-1)
                         resetBlue()
                  end
                elseif (getBlue() < 1 and getRed() >= 1) then
                  if getPlayerStorageValue(cid,joined) == 2 then
                         doBroadcastMessage("The War-Event has finished as the " ..team2name.. "  team has killed all players in oponnent team,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes")
                 doTeleportThing(cid, {x=1000,y=1000,z=7}, FALSE)
                     doSendMagicEffect({x=1000,y=1000,z=7}, CONST_ME_TELEPORT)
                     
                    doPlayerAddItem(cid, random_item, 1)
                                doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1)
                                setGlobalStorageValue(running1,-1)
                                setPlayerStorageValue(cid, joined,-1)
                                resetRed()
           end
                end
          end
        end
return true
end
]]></globalevent>
<globalevent name="Team" interval="3" event="script"><![CDATA[
                domodlib('tutorial_m')

function onThink(interval, lastExecution)
local random_item = conf.rewards_id[math.random(1, #conf.rewards_id)]
if getGlobalStorageValue(sto) == 1 then
 if (getRed() > getBlue()) then
 doBroadcastMessage("The War-Event has finished as the " ..team2name.. "  team has killed all players in oponnent team,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes")
    for _, cid in ipairs(getPlayersOnline()) do
          if getPlayerStorageValue(cid,joined) == 2 then
                   doTeleportThing(cid, {x=1000,y=1000,z=7}, FALSE)
                   doSendMagicEffect({x=1000,y=1000,z=7}, CONST_ME_TELEPORT)
                                         doPlayerAddItem(cid, random_item, 1)
                                doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1)
                                setPlayerStorageValue(cid, joined,-1)

                
                        
         end    
       if getPlayerStorageValue(cid,joined) == 1 then
                   doTeleportThing(cid, {x=1000,y=1000,z=7}, FALSE)
                   doSendMagicEffect({x=1000,y=1000,z=7}, CONST_ME_TELEPORT)
                   doPlayerSendTextMessage(cid,24, "Your team has lost in the war event war event")
                   setPlayerStorageValue(cid, joined,-1)

                end                                      
        end
 end
  if (getRed() < getBlue()) then
 doBroadcastMessage("The War-Event has finished as the " ..team1name.. "  team has killed all players in oponnent team,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes")
    for _, cid in ipairs(getPlayersOnline()) do
          if getPlayerStorageValue(cid,joined) == 1 then
                   doTeleportThing(cid, {x=1000,y=1000,z=7}, FALSE)
                   doSendMagicEffect({x=1000,y=1000,z=7}, CONST_ME_TELEPORT)
                                         doPlayerAddItem(cid, random_item, 1)
                                doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1)
                                setPlayerStorageValue(cid, joined,-1)

                
                        
         end    
       if getPlayerStorageValue(cid,joined) == 2 then
                   doTeleportThing(cid, {x=1000,y=1000,z=7}, FALSE)
                   doSendMagicEffect({x=1000,y=1000,z=7}, CONST_ME_TELEPORT)
                   doPlayerSendTextMessage(cid,24, "Your team has lost in the war event war event")
                   setPlayerStorageValue(cid, joined,-1)

                end                                      
        end
 end
 if (getRed() == getBlue()) then
    for _, cid in ipairs(getPlayersOnline()) do
          if getPlayerStorageValue(cid,joined) == 2 or getPlayerStorageValue(cid,joined) == 1 then 
                   doTeleportThing(cid, {x=1000,y=1000,z=7}, FALSE)
                   doSendMagicEffect({x=1000,y=1000,z=7}, CONST_ME_TELEPORT)
                    setPlayerStorageValue(cid, joined,-1)
                        doBroadcastMessage("Event max time ended.And niether of the teams won the event.Event will be reopened in ".. timebetween .." minutes")
      end                       
    end
 end
 resetBlue()
 resetRed()
 setGlobalStorageValue(sto, -1)
end
return true
end
]]></globalevent>
        <globalevent name="Broad" interval="70" event="script"><![CDATA[
                domodlib('tutorial_m')

function onThink(interval, lastExecution)
  if getGlobalStorageValue(running2) == -1 then
    doBroadcastMessage("The Battle Event is reopened.Npc is gathering 2 teams to start event")
        return true
        end
return true
end
                
]]></globalevent>
</mod>
 
Last edited:
I have again this error... how to repair it

PHP:
mysql_real_query(): SELECT `blue` FROM `Teams` WHERE `id`='1 - MYSQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1' at line 1 (1064)

[Error - GlobalEvent Interface] 
buffer:onThink
Description: 
data/lib/004-database.lua:60: [Result:getDataInt] Result not set!
stack traceback:
	[C]: in function 'error'
	data/lib/004-database.lua:60: in function <data/lib/004-database.lua:58>
	(tail call): ?
	[string "loadBuffer"]:50: in function <[string "loadBuffer"]:48>
[Error - GlobalEvents::think] Couldn't execute event: TeamBattle
mysql_real_query(): SELECT `blue` FROM `Teams` WHERE `id`='1 - MYSQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1' at line 1 (1064)

[Error - GlobalEvent Interface] 
buffer:onThink
Description: 
data/lib/004-database.lua:60: [Result:getDataInt] Result not set!
stack traceback:
	[C]: in function 'error'
	data/lib/004-database.lua:60: in function <data/lib/004-database.lua:58>
	(tail call): ?
	[string "loadBuffer"]:50: in function <[string "loadBuffer"]:48>
[Error - GlobalEvents::think] Couldn't execute event: TeamBattle
mysql_real_query(): SELECT `blue` FROM `Teams` WHERE `id`='1 - MYSQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1' at line 1 (1064)

[Error - GlobalEvent Interface] 
buffer:onThink
Description: 
data/lib/004-database.lua:60: [Result:getDataInt] Result not set!
stack traceback:
	[C]: in function 'error'
	data/lib/004-database.lua:60: in function <data/lib/004-database.lua:58>
	(tail call): ?
	[string "loadBuffer"]:50: in function <[string "loadBuffer"]:48>
[Error - GlobalEvents::think] Couldn't execute event: TeamBattle
 
have you replace the function recently because i updated it from 20 min or smthng
 
well i seemed to have ran into a different issue while testing. itll run once, and i got time in between at 20 minutes, its been well over and it still wont go. =o
 
Back
Top