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

Time Based walls

nystrom

New Member
Joined
Nov 17, 2009
Messages
269
Reaction score
0
hello i am making a quest, and i want to have levers to pull and when i pull the levers the wall will disappear.
yes it works but if some one stands on the wall spawn position when it is about to spawn so does it bugg and no wall will be spawned. and this leads to cheating and sutch.

this is my current script:
PHP:
function del(pos, id)
	local thing = getTileItemById(pos, id).uid
	if thing > 0 then
		doRemoveItem(thing)
	end
end

function reset_walls(pos, id)
	local thing = getTileItemById(pos, id).uid
	if thing < 1 then
		doCreateItem(id, 1, pos)
	end
end

function reset_lever(pos)
	local lev = getTileItemById(pos, 1946).uid
	if lev > 0 then
		doTransformItem(lev, 1945)
	end
end

local eventLever = 0
local eventDel = {}
local eventReset = {}

local pause = 5000 -- 5 sec.
local reset_after = 10 * 1000 -- 10 seconds
local wall_id = 1498 -- itemid of the walls
local walls = { -- wall positions
	{x=414, y=252, z=11}
}

function onUse(cid, item, fromPosition, itemEx, toPosition)
	if item.itemid == 1945 then
		doTransformItem(item.uid, 1946)
		for i  = 1, #walls do
			eventDel[i] = addEvent(del, pause * i, walls[i], wall_id)
			eventReset[i] = addEvent(reset_walls, reset_after + pause * i, walls[i], wall_id)
		end
		eventLever = addEvent(reset_lever, reset_after + pause * #walls, fromPosition)
	elseif item.itemid == 1946 then
		stopEvent(eventLever)
		for i = 1, #eventDel do
			stopEvent(eventDel[i])
		end
		for i = 1, #eventReset do
			stopEvent(eventReset[i])
		end
		for i = 1, #walls do
			reset_walls(walls[i], id)
		end
		doTransformItem(item.uid, 1945)
	end
	return true
end

Does some one know if it is posible to make some kind of reset, and that it checks if the wall is there or not?
thanks :P
 
Does some one know if it is posible to make some kind of reset, and that it checks if the wall is there or not?
thanks :P
it already did that with your script, but that's not what you need
Code:
local eventLever, eventDel, eventReset = 0, {}, {}

local pause = 5 * 1000
local reset_after = 10 * 1000

local wall_id = 1498
local walls = {
	{x=414, y=252, z=11} 
}

[COLOR="#FF0000"]local direction = EAST[/COLOR]

local function reset_walls(pos)
	[COLOR="#FF0000"]doRelocate(pos, getPosByDir({x=pos.x, y=pos.y, z=pos.z}, direction))[/COLOR]
	doCreateItem(wall_id, 1, pos)
end

local function del(pos, i)
	doRemoveItem(getTileItemById(pos, wall_id).uid)
	eventReset[i] = addEvent(reset_walls, reset_after, walls[i])
end

local function reset_lever(pos)
	doTransformItem(getTileItemById(pos, 1946).uid, 1945)
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
	if item.itemid == 1945 then
		for i = 1, #walls do
			eventDel[i] = addEvent(del, pause * i, walls[i], i)
		end
		eventLever = addEvent(reset_lever, reset_after + pause * #walls, fromPosition)
	else
		stopEvent(eventLever)
		for i = 1, #eventDel do
			if stopEvent(eventDel[i]) == false then
				stopEvent(eventReset[i])
				reset_walls(walls[i])
			end
		end
		eventLever, eventDel, eventReset = 0, {}, {}
	end
	return doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945)
end
 
Last edited:
this does not work :(

it already did that with your script, but that's not what you need
Code:
local eventLever, eventDel, eventReset = 0, {}, {}

local pause = 5 * 1000
local reset_after = 10 * 1000

local wall_id = 1498
local walls = {
	{x=497,y=543,z=9},
	{x=497,y=544,z=9},
}

[COLOR="#FF0000"]local direction = EAST[/COLOR]

local function reset_walls(pos)
	[COLOR="#FF0000"]doRelocate(pos, getPosByDir({x=pos.x, y=pos.y, z=pos.z}, direction))[/COLOR]
	doCreateItem(wall_id, 1, pos)
end

local function del(pos, i)
	doRemoveItem(getTileItemById(pos, wall_id).uid)
	eventReset[i] = addEvent(reset_walls, reset_after, walls[i])
end

local function reset_lever(pos)
	doTransformItem(getTileItemById(pos, 1946).uid, 1945)
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
	if item.itemid == 1945 then
		for i = 1, #walls do
			eventDel[i] = addEvent(del, pause * i, walls[i], i)
		end
		eventLever = addEvent(reset_lever, reset_after + pause * #walls, fromPosition)
	else
		stopEvent(eventLever)
		for i = 1, #eventDel do
			if stopEvent(eventDel[i]) == false then
				stopEvent(eventReset[i])
				reset_walls(walls[i])
			end
		end
		eventLever, eventDel, eventReset = 0, {}, {}
	end
	return doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945)
end
 
Code:
function onUse(cid, item, fromPosition, itemEx, toPosition)
	local cfg = {
		p = {
			wall_ = { x = 893, y = 785, z = 10 }, -- Where the wall is.
			tp = { x = 892, y = 786, z = 10 }, -- Where the teleport creates.
			to = { x = 1000, y = 1000, z = 7 }, -- Where the teleport takes the player.
			lever = { x = 908, y = 784, z = 10 } -- Where the lever is.
		},
		time = 120, -- Time the teleport remains open.
		level = 100, -- Level to pull the lever.
		wall_id = 1049, -- Wall item id.
		msg = "Success!" -- Message given after lever is pulled.
	}
	if(item.itemid == 1945) then
		local h = cfg.p
		if(getPlayerLevel(cid) >= cfg.level) then
			local function resetQuest() return doCreateItem(cfg.wall_id, 1, h.wall_) and doRemoveItem(getTileItemById(h.tp, 1387).uid) and doTransformItem(getTileItemById(h.lever, 1946).uid, 1945) end
			return doCreateTeleport(1387, h.to, h.tp) and doRemoveItem(getTileItemById(h.wall_, cfg.wall_id).uid) and doCreatureSay(cid, cfg.msg, TALKTYPE_ORANGE_1) and addEvent(resetQuest, cfg.time * 1000) and doTransformItem(getTileItemById(h.lever, 1945).uid, 1946)
		else
			doPlayerSendCancel(cid, "Sorry, you your level is too low.")
		end
	elseif(item.itemid == 1946) then
		doPlayerSendCancel(cid, "Sorry, not possible.")
		doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
	end
	return true
end
 
Back
Top