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

[ACTION] Key+Door+Delay

krotus

New Member
Joined
Jul 15, 2009
Messages
65
Reaction score
3
Hi folks!
I'd like a script which adquired a key you can open the specific door and when you 'd used this key, it destroys itself and the door opened which has closed by X minutes/seconds(time enough the party enter to the room ).

The idea is get the key from a chest and you with your team go to the closed door to open it by X time, but the key has to destroy itself because if you go once more you'll need obtain a new one.

I hope that you understand it clearly! :D

Thanks in advance!

- - - Updated - - -

<@= bump@>
 
I choose to implement this feature into the actions/other/doors.lua file where all the logic for keys is placed.

This is my whole actions/other/doors.lua file. The green code is the added code.
Code:
[COLOR="#008000"]local AUTO_CLOSE_DOOR_ACTION_IDS = {6000, 6001} -- add the actionID of the key/door that you would like to apply the auto close feature to
local CLOSE_DELAY = 2 * 1000 -- the auto close delay 2 * 1000 = 2 sec

local function closeDoor(doorPos, toItemid)
	local door = getTileItemByType(doorPos, ITEM_TYPE_DOOR)
	if door ~= nil then
		if isInArray(verticalOpenDoors, toItemid) then
			doRelocate(doorPos, {x=doorPos.x, y=doorPos.y+1, z=doorPos.z})
		else
			doRelocate(doorPos, {x=doorPos.x+1, y=doorPos.y, z=doorPos.z})
		end
		doTransformItem(door.uid, toItemid)
	end
end[/COLOR]

function onUse(cid, item, fromPosition, itemEx, toPosition)
	if isInArray(questDoors, item.itemid) == TRUE then
		if getPlayerStorageValue(cid, item.actionid) ~= -1 then
			doTransformItem(item.uid, item.itemid + 1)
			doTeleportThing(cid, toPosition, TRUE)
		else
			doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "The door seems to be sealed against unwanted intruders.")
		end
		return TRUE
	elseif isInArray(levelDoors, item.itemid) == TRUE then
		if item.actionid > 0 and getPlayerLevel(cid) >= item.actionid - 1000 then
			doTransformItem(item.uid, item.itemid + 1)
			doTeleportThing(cid, toPosition, TRUE)
		else
			doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Only the worthy may pass.")
		end
		return TRUE
	elseif isInArray(keys, item.itemid) == TRUE then
		if itemEx.actionid > 0 then
			if item.actionid == itemEx.actionid then
				if doors[itemEx.itemid] ~= nil then
					doTransformItem(itemEx.uid, doors[itemEx.itemid])
					
					[COLOR="#008000"]if isInArray(AUTO_CLOSE_DOOR_ACTION_IDS, itemEx.actionid) then
						addEvent(closeDoor, CLOSE_DELAY, toPosition, itemEx.itemid)
						doRemoveItem(item.uid, 1)
						doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "The key broke.")
					end[/COLOR]
								
					return TRUE
				end
			end
			doPlayerSendCancel(cid, "The key does not match.")
			return TRUE
		end
		return FALSE
	elseif isInArray(horizontalOpenDoors, item.itemid) == TRUE then
		local newPosition = toPosition
		newPosition.y = newPosition.y + 1
		local doorPosition = fromPosition
		doorPosition.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE
		local doorCreature = getThingfromPos(doorPosition)
		if doorCreature.itemid ~= 0 then
			if getTilePzInfo(doorPosition) == TRUE and getTilePzInfo(newPosition) == FALSE and doorCreature.uid ~= cid then
				doPlayerSendCancel(cid, "Sorry, not possible.")
			else
				doTeleportThing(doorCreature.uid, newPosition, TRUE)
				if isInArray(openSpecialDoors, item.itemid) ~= TRUE then
					doTransformItem(item.uid, item.itemid - 1)
				end
			end
			return TRUE
		end
		doTransformItem(item.uid, item.itemid - 1)
		return TRUE
	elseif isInArray(verticalOpenDoors, item.itemid) == TRUE then
		local newPosition = toPosition
		newPosition.x = newPosition.x + 1
		local doorPosition = fromPosition
		doorPosition.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE
		local doorCreature = getThingfromPos(doorPosition)
		if doorCreature.itemid ~= 0 then
			if getTilePzInfo(doorPosition) == TRUE and getTilePzInfo(newPosition) == FALSE and doorCreature.uid ~= cid then
				doPlayerSendCancel(cid, "Sorry, not possible.")
			else
				doTeleportThing(doorCreature.uid, newPosition, TRUE)
				if isInArray(openSpecialDoors, item.itemid) ~= TRUE then
					doTransformItem(item.uid, item.itemid - 1)
				end
			end
			return TRUE
		end
		doTransformItem(item.uid, item.itemid - 1)
		return TRUE
	elseif doors[item.itemid] ~= nil then
		if item.actionid == 0 then
			doTransformItem(item.uid, doors[item.itemid])
		else
			doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.")
		end
		return TRUE
	end
	return FALSE
end
 
Last edited:
Back
Top