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

Zombie Event Bug (mod)

Marilyekon

New Member
Joined
Feb 23, 2010
Messages
47
Reaction score
0
Hello! When I'm starting my Server 8.6 (0.3.6) I get this bug in the console:

HTML:
> Loading Zombie Event.xml...mods/Zombie Event.xml:96: parser error : StartTag:Invalid element name if get GlobalStorageValue<config.playerCount> <^config.maxPlayers then (Error - ScriptingManager:: loadFromXm)) Cannot load mod mods/Zombie Event.xml Line: 96, Info: Invalid element name 

failed!

I don't know how to fix it, and I hope that someone of you guys could help me. I wil rep the one helping me! Here's the script:

PHP:
<?xml version="1.0" encoding="UTF-8"?> 
<mod name="Zombie Event" version="1.00" author="kawon" contact="otland.net" enabled="yes"> 
    <description> 
Scripts by Gatupojk 
Mods by Kawon 
    </description> 
<globalevent name="zombieevent" time="15:00" event="buffer"> 
local config = { 
    playerCount = 2001, -- Global storage for counting the players left/entered in the event 
    zombieCount = 2002, -- Global storage for counting the zombies in the event 
    teleportActionId = 2000, -- Action id of the teleport needed for the movement script 
    teleportPosition = {x = 3003, y = 2997, z = 7, stackpos = 1}, -- Where the teleport will be created 
    teleportToPosition = {x = 2034, y = 2024, z = 7}, -- Where the teleport will take you 
    teleportId = 1387, -- Id of the teleport 
    timeToStartEvent = 5, -- Minutes, after these minutes the teleport will be removed and the event will be declared started 
    timeBetweenSpawns = 20, -- Seconds between each spawn of zombie 
    zombieName = "Zombie", -- Name of the zombie that should be summoned 
    playersNeededToStartEvent = 2, -- Players needed before the zombies can spawn. 
     
    -- Should be the same as in the creaturescript! 
    -- The zombies will spawn randomly inside this area 
    fromPosition = {x = 2018, y = 2021, z = 7}, -- top left cornor of the playground 
    toPosition = {x = 2051, y = 2051, z = 7}, -- bottom right cornor of the playground 
    } 

function onTimer() 
    local tp = doCreateTeleport(config.teleportId, config.teleportToPosition, config.teleportPosition) 
    doItemSetAttribute(tp, "aid", config.teleportActionId) 
    doBroadcastMessage("Zombie event starting in " .. config.timeToStartEvent .. " minutes! The teleport will be closed when the event start!", MESSAGE_STATUS_WARNING) 
    setGlobalStorageValue(config.playerCount, 0) 
    setGlobalStorageValue(config.zombieCount, 0) 
    addEvent(startEvent, config.timeToStartEvent * 1000 * 60) 
    print(getGlobalStorageValue(2001)) 
end 

function startEvent() 
    local get = getThingfromPos(config.teleportPosition) 
    if get.itemid == config.teleportId then 
        doRemoveItem(get.uid, 1) 
    end 
     
    local fromp, top = config.fromPosition, config.toPosition 

    if getGlobalStorageValue(config.playerCount) >= config.playersNeededToStartEvent then 
        addEvent(spawnZombie, config.timeBetweenSpawns * 1000) 
        doBroadcastMessage("Good luck in the zombie event people! The teleport has closed!", MESSAGE_STATUS_WARNING) 
         
        for x = fromp.x, top.x do 
            for y = fromp.y, top.y do 
                for z = fromp.z, top.z do 
                    areapos = {x = x, y = y, z = z, stackpos = 253} 
                    getPlayers = getThingfromPos(areapos) 
                    if isPlayer(getPlayers.uid) then 
                        doPlayerSendTextMessage(getPlayers.uid, MESSAGE_EVENT_ADVANCE, "The first zombie will spawn in " .. config.timeBetweenSpawns .. " seconds! Good luck!") 
                    end 
                end 
            end 
        end 
    else 
        doBroadcastMessage("The Zombie event could not start because of to few players participating.\n At least " .. config.playersNeededToStartEvent .. " players is needed!", MESSAGE_STATUS_WARNING) 
        for x = fromp.x, top.x do 
            for y = fromp.y, top.y do 
                for z = fromp.z, top.z do 
                    areapos = {x = x, y = y, z = z, stackpos = 253} 
                    getPlayers = getThingfromPos(areapos) 
                    if isPlayer(getPlayers.uid) then 
                        doTeleportThing(getPlayers.uid, getTownTemplePosition(getPlayerTown(getPlayers.uid)), false) 
                        doSendMagicEffect(getPlayerPosition(getPlayers.uid), CONST_ME_TELEPORT) 
                    end 
                end 
            end 
        end 
    end 
end 

function spawnZombie() 
    if getGlobalStorageValue(config.playerCount) >= 2 then 
        pos = {x = math.random(config.fromPosition.x, config.toPosition.x), y = math.random(config.fromPosition.y, config.toPosition.y), z = math.random(config.fromPosition.z, config.toPosition.z)} 
        doSummonCreature(config.zombieName, pos) 
        doSendMagicEffect(pos, CONST_ME_MORTAREA) 
        setGlobalStorageValue(config.zombieCount, getGlobalStorageValue(config.zombieCount)+1) 
        doBroadcastMessage("A zombie has spawned! There is currently " .. getGlobalStorageValue(config.zombieCount) .. " zombies in the zombie event!", MESSAGE_STATUS_CONSOLE_RED) 
        addEvent(spawnZombie, config.timeBetweenSpawns * 1000) 
    end 
end         
    ]=]=></globalevent> 
     
<movevent type="StepIn" actionid="2000" event="buffer"> 
local config = { 
    playerCount = 2001, -- Global storage for counting the players in the event 
    maxPlayers = 20, -- Max players who can participate 
     
    } 
     
function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) 
    if getGlobalStorageValue(config.playerCount) < config.maxPlayers then 
        setGlobalStorageValue(config.playerCount, getGlobalStorageValue(config.playerCount)+1) 
        if getGlobalStorageValue(config.playerCount) == config.maxPlayers then 
            doBroadcastMessage("The Zombie event is now full [" .. getGlobalStorageValue(config.playerCount) .. " players]! The event will soon start.") 
        else     
            doBroadcastMessage(getPlayerName(cid) .. " entered the Zombie event! Currently " .. getGlobalStorageValue(config.playerCount) .. " players have joined!", MESSAGE_STATUS_CONSOLE_RED) 
        end     
    else 
        addEvent(tpBack, 1000, cid, fromPosition) 
        doPlayerSendCancel(cid, "The event is full. There is already " .. config.maxPlayers .. " players participating in the quest.") 
        return false 
    end 
    print(getStorage(config.playerCount) .. " Players in the zombie event.") 
    return true 
end 

function tpBack(cid, fromPosition) 
    doTeleportThing(cid, fromPosition, true) 
    doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT) 
end         
    ]=]=></movevent> 
<event type="statschange" name="zombieevent" event="script"> 
local config = { 
    playerCount = 2001, -- Global storage for counting the players left/entered in the event 
     
    goblet = 5805, -- id of the gold goblet you'll get when finishing the event. 
    rewards = {2195, 2152, 2160}, -- You will get this +  a gold goblet with your name on. 
    --        {moneyId, count, using? 1 for using moneyReward, 0 for not using.} 
    moneyReward = {2160, 10, 1}, -- second collumn(count) 0 if you don't want money to be used. or a stackable item you want more than 1 of. 
     
    -- Should be same as in the globalevent! 
    -- The zombies will spawn randomly inside this area 
    fromPosition = {x = 2018, y = 2021, z = 7}, -- top left cornor of the playground 
    toPosition = {x = 2051, y = 2051, z = 7}, -- bottom right cornor of the playground 
    } 

function onStatsChange(cid, attacker, type, combat, value) 
    if isPlayer(cid) and isMonster(attacker) then 
        if isInArea(getPlayerPosition(cid), config.fromPosition, config.toPosition) then 
            if getGlobalStorageValue(config.playerCount) >= 2 then 
                doBroadcastMessage(getPlayerName(cid) .. " have been eated by Zombies!", MESSAGE_STATUS_CONSOLE_RED) 
                local corpse = doCreateItem(3058, 1, getPlayerPosition(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")..".") 
                doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) 
                doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), false) 
                doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT) 
                setGlobalStorageValue(config.playerCount, getGlobalStorageValue(config.playerCount)-1) 
            elseif getGlobalStorageValue(config.playerCount) == 1 then 
                if isInArea(getPlayerPosition(cid), config.fromPosition, config.toPosition) then 
                    doBroadcastMessage(getPlayerName(cid) .. " won the Zombie event! Congratulations!", MESSAGE_STATUS_WARNING) 
                    local goblet = doPlayerAddItem(cid, config.goblet, 1) 
                    doItemSetAttribute(goblet, "description", "Awarded to " .. getPlayerName(cid) .. " for winning the Zombie event.") 
                    local corpse = doCreateItem(3058, 1, getPlayerPosition(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")..".") 
                    doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) 
                    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), false) 
                    doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT) 
                    for _,items in ipairs(config.rewards) do 
                        doPlayerAddItem(cid, items, 1) 
                    end 
                    if config.moneyReward[3] == 1 then 
                        doPlayerAddItem(cid, config.moneyReward[1], config.moneyReward[2]) 
                    end 
                end 
                         
                for x = config.fromPosition.x, config.toPosition.x do 
                    for y = config.fromPosition.y, config.toPosition.y do 
                        for z = config.fromPosition.z, config.toPosition.z do 
                            areapos = {x = x, y = y, z = z, stackpos = 253} 
                            getMonsters = getThingfromPos(areapos) 
                            if isMonster(getMonsters.uid) then 
                                doRemoveCreature(getMonsters.uid) 
                            end 
                        end 
                    end 
                end 
            end 
            return false 
        end 
    end 
return true 
end 
    ]=]=></event> 

            <event type="login" name="zombieRegister" event="script"> 
        function onLogin(cid) 
    registerCreatureEvent(cid, "zombieevent") 
        return true 
end]=]=></event> 
</mod>
 
Code:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Zombie Event" version="1.00" author="kawon" contact="otland.net" enabled="yes">
<description>
	Scripts by Gatupojk
	Mods by Kawon
</description>

<globalevent name="zombieevent" time="15:00" event="buffer"><![CDATA[
local config = {
	playerCount = 2001, -- Global storage for counting the players left/entered in the event
	zombieCount = 2002, -- Global storage for counting the zombies in the event
	teleportActionId = 2000, -- Action id of the teleport needed for the movement script
	teleportPosition = {x = 3003, y = 2997, z = 7, stackpos = 1}, -- Where the teleport will be created
	teleportToPosition = {x = 2034, y = 2024, z = 7}, -- Where the teleport will take you
	teleportId = 1387, -- Id of the teleport
	timeToStartEvent = 5, -- Minutes, after these minutes the teleport will be removed and the event will be declared started
	timeBetweenSpawns = 20, -- Seconds between each spawn of zombie
	zombieName = "Zombie", -- Name of the zombie that should be summoned
	playersNeededToStartEvent = 2, -- Players needed before the zombies can spawn.
	
	-- Should be the same as in the creaturescript!
	-- The zombies will spawn randomly inside this area
	fromPosition = {x = 2018, y = 2021, z = 7}, -- top left cornor of the playground
	toPosition = {x = 2051, y = 2051, z = 7}, -- bottom right cornor of the playground
}

function onTimer()
	local tp = doCreateTeleport(config.teleportId, config.teleportToPosition, config.teleportPosition)
	doItemSetAttribute(tp, "aid", config.teleportActionId)
	doBroadcastMessage("Zombie event starting in " .. config.timeToStartEvent .. " minutes! The teleport will be closed when the event start!", MESSAGE_STATUS_WARNING)
	setGlobalStorageValue(config.playerCount, 0)
	setGlobalStorageValue(config.zombieCount, 0)
	addEvent(startEvent, config.timeToStartEvent * 1000 * 60)
	print(getGlobalStorageValue(2001))
end

function startEvent()
	local get = getThingfromPos(config.teleportPosition)
	if get.itemid == config.teleportId then
		doRemoveItem(get.uid, 1)
	end
	
	local fromp, top = config.fromPosition, config.toPosition

	if getGlobalStorageValue(config.playerCount) >= config.playersNeededToStartEvent then
		addEvent(spawnZombie, config.timeBetweenSpawns * 1000)
		doBroadcastMessage("Good luck in the zombie event people! The teleport has closed!", MESSAGE_STATUS_WARNING)
		
		for x = fromp.x, top.x do
			for y = fromp.y, top.y do
				for z = fromp.z, top.z do
					areapos = {x = x, y = y, z = z, stackpos = 253}
					getPlayers = getThingfromPos(areapos)
					if isPlayer(getPlayers.uid) then
						doPlayerSendTextMessage(getPlayers.uid, MESSAGE_EVENT_ADVANCE, "The first zombie will spawn in " .. config.timeBetweenSpawns .. " seconds! Good luck!")
					end
				end
			end
		end
	else
		doBroadcastMessage("The Zombie event could not start because of to few players participating.\n At least " .. config.playersNeededToStartEvent .. " players is needed!", MESSAGE_STATUS_WARNING)
		for x = fromp.x, top.x do
			for y = fromp.y, top.y do
				for z = fromp.z, top.z do
					areapos = {x = x, y = y, z = z, stackpos = 253}
					getPlayers = getThingfromPos(areapos)
					if isPlayer(getPlayers.uid) then
						doTeleportThing(getPlayers.uid, getTownTemplePosition(getPlayerTown(getPlayers.uid)), false)
						doSendMagicEffect(getPlayerPosition(getPlayers.uid), CONST_ME_TELEPORT)
					end
				end
			end
		end
	end
end

function spawnZombie()
	if getGlobalStorageValue(config.playerCount) >= 2 then
		pos = {x = math.random(config.fromPosition.x, config.toPosition.x), y = math.random(config.fromPosition.y, config.toPosition.y), z = math.random(config.fromPosition.z, config.toPosition.z)}
		doSummonCreature(config.zombieName, pos)
		doSendMagicEffect(pos, CONST_ME_MORTAREA)
		setGlobalStorageValue(config.zombieCount, getGlobalStorageValue(config.zombieCount)+1)
		doBroadcastMessage("A zombie has spawned! There is currently " .. getGlobalStorageValue(config.zombieCount) .. " zombies in the zombie event!", MESSAGE_STATUS_CONSOLE_RED)
		addEvent(spawnZombie, config.timeBetweenSpawns * 1000)
	end
end
]]></globalevent>

<movevent type="StepIn" actionid="2000" event="buffer"><![CDATA[
local config = {
	playerCount = 2001, -- Global storage for counting the players in the event
	maxPlayers = 20 -- Max players who can participate
}

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
	if getGlobalStorageValue(config.playerCount) < config.maxPlayers then
		setGlobalStorageValue(config.playerCount, getGlobalStorageValue(config.playerCount)+1)
		if getGlobalStorageValue(config.playerCount) == config.maxPlayers then
			doBroadcastMessage("The Zombie event is now full [" .. getGlobalStorageValue(config.playerCount) .. " players]! The event will soon start.")
		else
			doBroadcastMessage(getPlayerName(cid) .. " entered the Zombie event! Currently " .. getGlobalStorageValue(config.playerCount) .. " players have joined!", MESSAGE_STATUS_CONSOLE_RED)
		end
	else
		addEvent(tpBack, 1000, cid, fromPosition)
		doPlayerSendCancel(cid, "The event is full. There is already " .. config.maxPlayers .. " players participating in the quest.")
		return false
	end
	print(getStorage(config.playerCount) .. " Players in the zombie event.")
	return true
end

function tpBack(cid, fromPosition)
	doTeleportThing(cid, fromPosition, true)
	doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT)
end
]]></movevent>

<event type="statschange" name="zombieevent" event="script"><![CDATA[
local config = {
	playerCount = 2001, -- Global storage for counting the players left/entered in the event
	
	goblet = 5805, -- id of the gold goblet you'll get when finishing the event.
	rewards = {2195, 2152, 2160}, -- You will get this +  a gold goblet with your name on.
	--        {moneyId, count, using? 1 for using moneyReward, 0 for not using.}
	moneyReward = {2160, 10, 1}, -- second collumn(count) 0 if you don't want money to be used. or a stackable item you want more than 1 of.
	
	-- Should be same as in the globalevent!
	-- The zombies will spawn randomly inside this area
	fromPosition = {x = 2018, y = 2021, z = 7}, -- top left cornor of the playground
	toPosition = {x = 2051, y = 2051, z = 7} -- bottom right cornor of the playground
}

function onStatsChange(cid, attacker, type, combat, value)
	if isPlayer(cid) and isMonster(attacker) then
		if isInArea(getPlayerPosition(cid), config.fromPosition, config.toPosition) then
			if getGlobalStorageValue(config.playerCount) >= 2 then
				doBroadcastMessage(getPlayerName(cid) .. " have been eated by Zombies!", MESSAGE_STATUS_CONSOLE_RED)
				local corpse = doCreateItem(3058, 1, getPlayerPosition(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")..".")
				doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
				doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), false)
				doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT)
				setGlobalStorageValue(config.playerCount, getGlobalStorageValue(config.playerCount)-1)
			elseif getGlobalStorageValue(config.playerCount) == 1 then
				if isInArea(getPlayerPosition(cid), config.fromPosition, config.toPosition) then
					doBroadcastMessage(getPlayerName(cid) .. " won the Zombie event! Congratulations!", MESSAGE_STATUS_WARNING)
					local goblet = doPlayerAddItem(cid, config.goblet, 1)
					doItemSetAttribute(goblet, "description", "Awarded to " .. getPlayerName(cid) .. " for winning the Zombie event.")
					local corpse = doCreateItem(3058, 1, getPlayerPosition(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")..".")
					doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
					doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), false)
					doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT)
					for _,items in ipairs(config.rewards) do
						doPlayerAddItem(cid, items, 1)
					end
					if config.moneyReward[3] == 1 then
						doPlayerAddItem(cid, config.moneyReward[1], config.moneyReward[2])
					end
				end
						
				for x = config.fromPosition.x, config.toPosition.x do
					for y = config.fromPosition.y, config.toPosition.y do
						for z = config.fromPosition.z, config.toPosition.z do
							areapos = {x = x, y = y, z = z, stackpos = 253}
							getMonsters = getThingfromPos(areapos)
							if isMonster(getMonsters.uid) then
								doRemoveCreature(getMonsters.uid)
							end
						end
					end
				end
			end
			return false
		end
	end
	return true
end
]]></event>

<event type="login" name="zombieRegister" event="buffer"><![CDATA[
	registerCreatureEvent(cid, "zombieevent")
]]></event>

</mod>
 
Now when I've tested it, the following error came in the console:

PHP:
(Error - CreatureScript Interface)
buffer:onStatsChange
Description:
data/lib/032-position.lua:2: attempt to index global 'position' <a nil value> stack trackeback
data/lib/032-position.lua:2: in function 'isInArea'
(string "loadBuffer"):17: in function <(string "LoadBuffer"):15>
Also the monsters do no damage to me.
 
Last edited:
the error is a bug in default 0.3.6 libs

Code:
[FONT="Fixedsys"]function isInRange([COLOR="red"][B]pos[/B][/COLOR], fromPosition, toPosition)
	return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.z >= fromPosition.z and position.x <= toPosition.x and position.y <= toPosition.y and position.z <= toPosition.z)
end[/FONT]
pos -> position
 
<globalevent name="zombieevent" time="15:00" event="buffer"><![CDATA[
to
<globalevent name="zombieevent" interval="3600" event="buffer"><![CDATA[
and
function onTimer()
to
function onThink()
 
Back
Top