• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Request: Script that prevents players from using spells or runes in a certain area

Cristian2387

New Member
Joined
Oct 2, 2014
Messages
34
Reaction score
0
Hi, i recently added a zombie event to my server x) and its flawless the thing is that today me and my friend we're playing and he started using runes mw and wild growth rune he would stay in the same place forever xD and he was also usin that one spell that turns you invisible so yeah i dont want him or any player to use spells or runes in the zombie arena someone please help me with the script thank you xd
 
Code:
local areafrom = {x=xxx,y=yyy,z=zzz}
local areato = {x=xxx,y=yyy,z=zzz}
if isInArea(getPlayerPosition(cid), areafrom, areato) then
return false
end
 
Code:
local areafrom = {x=xxx,y=yyy,z=zzz}
local areato = {x=xxx,y=yyy,z=zzz}
if isInArea(getPlayerPosition(cid), areafrom, areato) then
return false
end
i dont understand can you please explain a little bit more ? like where do i put this script what tags do i add? sorry im a newby xd
 
I do the same thing that @owned suggested.

I go into the Spells folder and find which spells can be abused in the event like: Magic Wall, Earth Wall, Invisible, etc. and just add in a cancel if the player is in the event area:

Example:

data/spells/support/magic wall rune.lua

Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, ITEM_MAGICWALL)

function onCastSpell(cid, var)
local fromPos, toPos = {x = 32204, y = 32186, z = 7}, {x = 32239, y = 32210, z = 7}
  if isInRange(getPlayerPosition(cid), fromPos, toPos) or isInRange(getPlayerPosition(cid), survival1, survival2)  then
          return false, doPlayerSendCancel(cid, "You cannot use any runes in here.")
end
    return doCombat(cid, combat, var)
end
 
I do the same thing that @owned suggested.

I go into the Spells folder and find which spells can be abused in the event like: Magic Wall, Earth Wall, Invisible, etc. and just add in a cancel if the player is in the event area:

Example:

data/spells/support/magic wall rune.lua

Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, ITEM_MAGICWALL)

function onCastSpell(cid, var)
local fromPos, toPos = {x = 32204, y = 32186, z = 7}, {x = 32239, y = 32210, z = 7}
  if isInRange(getPlayerPosition(cid), fromPos, toPos) or isInRange(getPlayerPosition(cid), survival1, survival2)  then
          return false, doPlayerSendCancel(cid, "You cannot use any runes in here.")
end
    return doCombat(cid, combat, var)
end
okay so
Code:
 local fromPos, toPos = {x = 32204, y = 32186, z = 7}, {x = 32239, y = 32210, z = 7}
the first one is top left corner right? the other one is bottom right ?
 
what script are you using for your event?
im using this script
Code:
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 = 10167, y = 10051, z = 5, stackpos = 1}, -- Where the teleport will be created
    teleportToPosition = {x = 32548, y = 32619, 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 = "event 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 = 32534, y = 32618, z = 7}, -- top left cornor of the playground
    toPosition = {x = 32561, y = 32645, 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 5 minutes! The teleport will close when the event starts!", 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)
        doPlayerSendTextMessage(getPlayers.uid, MESSAGE_EVENT_ADVANCE, "The first zombie will spawn in " .. config.timeBetweenSpawns .. " seconds! Good luck!")
       
        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 are currently " .. getGlobalStorageValue(config.zombieCount) .. " zombies in the zombie event!", MESSAGE_STATUS_CONSOLE_RED)
        addEvent(spawnZombie, config.timeBetweenSpawns * 1000)
    end
end
 
im using this script
Code:
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 = 10167, y = 10051, z = 5, stackpos = 1}, -- Where the teleport will be created
    teleportToPosition = {x = 32548, y = 32619, 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 = "event 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 = 32534, y = 32618, z = 7}, -- top left cornor of the playground
    toPosition = {x = 32561, y = 32645, 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 5 minutes! The teleport will close when the event starts!", 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)
        doPlayerSendTextMessage(getPlayers.uid, MESSAGE_EVENT_ADVANCE, "The first zombie will spawn in " .. config.timeBetweenSpawns .. " seconds! Good luck!")
      
        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 are currently " .. getGlobalStorageValue(config.zombieCount) .. " zombies in the zombie event!", MESSAGE_STATUS_CONSOLE_RED)
        addEvent(spawnZombie, config.timeBetweenSpawns * 1000)
    end
end
well that dont help but u also check storages in spells and done
 
I do the same thing that @owned suggested.

I go into the Spells folder and find which spells can be abused in the event like: Magic Wall, Earth Wall, Invisible, etc. and just add in a cancel if the player is in the event area:

Example:

data/spells/support/magic wall rune.lua

Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, ITEM_MAGICWALL)

function onCastSpell(cid, var)
local fromPos, toPos = {x = 32204, y = 32186, z = 7}, {x = 32239, y = 32210, z = 7}
  if isInRange(getPlayerPosition(cid), fromPos, toPos) or isInRange(getPlayerPosition(cid), survival1, survival2)  then
          return false, doPlayerSendCancel(cid, "You cannot use any runes in here.")
end
    return doCombat(cid, combat, var)
end
jk it didnt work '-' i did what you told me and put the coordinates etc and yeah it works i cant use the spell or rune but guess what i cant use them at all like not even in temple =( this is what i did
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497)

function onCastSpell(cid, var)
local fromPos, toPos = {x = 32524, y = 32614, z = 7}, {x = 32572, y = 32650, z = 7}
  if isInRange(getPlayerPosition(cid), fromPos, toPos) or isInRange(getPlayerPosition(cid), survival1, survival2)  then
          return false, doPlayerSendCancel(cid, "Você não pode usar esta runa aqui.")
end
    return doCombat(cid, combat, var)
end
 
Last edited:
jk it didnt work '-' i did what you told me and put the coordinates etc and yeah it works i cant use the spell or rune but guess what i cant use them at all like not even in temple =( this is what i did
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497)

function onCastSpell(cid, var)
local fromPos, toPos = {x = 32524, y = 32614, z = 7}, {x = 32572, y = 32650, z = 7}
  if isInRange(getPlayerPosition(cid), fromPos, toPos) or isInRange(getPlayerPosition(cid), survival1, survival2)  then
          return false, doPlayerSendCancel(cid, "Você não pode usar esta runa aqui.")
end
    return doCombat(cid, combat, var)
end

Which TFS version do you use?

Try this:
Code:
function onCastSpell(cid, var)
local fromPos, toPos = {x = 32524, y = 32614, z = 7}, {x = 32572, y = 32650, z = 7}
  if isInRange(getCreaturePosition(cid), fromPos, toPos) then
          return false, doPlayerSendCancel(cid, "Você não pode usar esta runa aqui.")
end
    return doCombat(cid, combat, var)
end

I changed getPlayerPosition(cid) to getCreaturePosition(cid)
I deleted or isInRange(getPlayerPosition(cid), survival1, survival2) because that wasn't meant to be part of your script. I forgot to delete it from my own spell script.
 
Last edited:
or go with doAddCondition(cid, condition)
jk it didnt work '-' i did what you told me and put the coordinates etc and yeah it works i cant use the spell or rune but guess what i cant use them at all like not even in temple =( this is what i did
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497)

function onCastSpell(cid, var)
local fromPos, toPos = {x = 32524, y = 32614, z = 7}, {x = 32572, y = 32650, z = 7}
  if isInRange(getPlayerPosition(cid), fromPos, toPos) or isInRange(getPlayerPosition(cid), survival1, survival2)  then
          return false, doPlayerSendCancel(cid, "Você não pode usar esta runa aqui.")
end
    return doCombat(cid, combat, var)
end
Which TFS version do you use?

Try this:
Code:
function onCastSpell(cid, var)
local fromPos, toPos = {x = 32524, y = 32614, z = 7}, {x = 32572, y = 32650, z = 7}
  if isInRange(getCreaturePosition(cid), fromPos, toPos) then
          return false, doPlayerSendCancel(cid, "Você não pode usar esta runa aqui.")
end
    return doCombat(cid, combat, var)
end

I changed getPlayerPosition(cid) to getCreaturePosition(cid)
I deleted or isInRange(getPlayerPosition(cid), survival1, survival2) because that wasn't meant to be part of your script. I forgot to delete it from my own spell script.

All that's needed is to get rid of the second isInRange as far as you changing getPlayerPosition(cid) to getCreaturePosition(cid) is completely unneccessary considering he is trying to prevent Players from using said spells.
 
Back
Top