--[[
movements.xml
<movevent type="StepIn" actionid="45001-45002" event="script" value="onStepIn_xikini_dungeon_system.lua"/>
--]]
local function dungeon_system_updater(cid, storage, timer, index, bossSpawned)
if not isCreature(cid) then
if cid == index[1][1] then
index[1][1] = 0 -- if player dies or logs out, reset player data to indicate dungeon is empty.
end
return true
end
-- checks if the player is still inside the dungeon (so if player has completed dungeon but not yet left the dungeon, we can continue timer until auto-kick)
local creature_pos = getPlayerPosition(cid)
if creature_pos.x >= index[3][2].x and creature_pos.x <= index[3][3].x and creature_pos.y >= index[3][2].y and creature_pos.y <= index[3][3].y and creature_pos.z >= index[3][2].z and creature_pos.z <= index[3][3].z then
else
if cid == index[1][1] then
index[1][1] = 0 -- if player leaves the dungeon, reset player data to indicate dungeon is empty.
end
return true
end
-- check if any monsters have died, and update player storage.
local new_count = -1
for i = #index[2], 1, -1 do
if not isCreature(index[2][i]) then
new_count = getPlayerStorageValue(cid, storage) - 1
setPlayerStorageValue(cid, storage, new_count)
table.remove(index[2], i)
end
end
-- tell player that monsters have died.
if new_count > 0 then
local monster_count = #index[4]
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have killed [" .. (monster_count - new_count) .. " / " .. monster_count .."]")
elseif new_count == 0 then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have killed all the creatures in this dungeon. Go open the chest for your reward.")
end
-- spawn boss
if not bossSpawned and new_count == 1 then
bossSpawned = true
local boss = doCreateMonster(index[4][#index[4]][1], index[4][#index[4]][2])
table.insert(index[2], boss)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Boss of this dungeon has been spawned! Slay them!")
end
-- timeout timer stuff
timer = timer + 0.5 -- timer counts every 0.5 seconds, to check if player has run out of time.
if timer < dungeon_system_config[storage].timeout then
addEvent(dungeon_system_updater, 500, cid, storage, timer, index, bossSpawned)
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Out of time! You've been removed from the Dungeon.")
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
setPlayerStorageValue(cid, storage, -1)
index[1][1] = 0
end
end
function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
local storage = item.actionid
local dungeon = dungeon_system_config[storage]
if not dungeon then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "LUA ERROR: Contact Administrator. Error code: Xikini_1") -- actionid on tile is incorrect or not in table.
return true
end
dungeon = dungeon.area_info -- re-using local when possible, to make script cleaner
-- check if player is already in a dungeon, and teleport them out.
for i = 1, #dungeon do
if dungeon[i][1][1] == cid then
local cur_storage = getPlayerStorageValue(cid, storage)
if cur_storage == -1 then
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Dungeon Completed Successfully.")
return true
else
if cur_storage == 0 then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You must collect your reward before exiting the dungeon.")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "There is still " .. cur_storage .. " monsters that need to be killed in this dungeon.")
end
doTeleportThing(cid, fromPosition)
return true
end
end
end
-- find a dungeon that is empty.
local area = 0
for i = 1, #dungeon do
if not isCreature(dungeon[i][1][1]) then
area = i
break
end
local creature_pos = getPlayerPosition(dungeon[i][1][1])
if creature_pos.x >= dungeon[i][3][2].x and creature_pos.x <= dungeon[i][3][3].x and creature_pos.y >= dungeon[i][3][2].y and creature_pos.y <= dungeon[i][3][3].y and creature_pos.z >= dungeon[i][3][2].z and creature_pos.z <= dungeon[i][3][3].z then
else
area = i
break
end
end
-- if no dungeons empty
if area == 0 then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Sorry, no dungeons are empty. Try again later.")
doTeleportThing(cid, fromPosition)
return true
end
dungeon = dungeon[area]
dungeon[1][1] = cid -- hold player data for later checking if dungeon is empty
local monster_count = #dungeon[4]
setPlayerStorageValue(cid, storage, monster_count) -- player storage is set as max monsters, and count down to 0 later.
-- remove any monsters that are still alive in dungeon. (if a player died in the dungeon or timed out)
for i = #dungeon[2], 1, -1 do
if isCreature(dungeon[2][i]) then
doRemoveCreature(dungeon[2][i])
end
end
dungeon[2] = {}
-- add all monsters into the dungeon, and store creatureids in table.
for i = 1, monster_count - 1 do
local monster = doCreateMonster(dungeon[4][i][1], dungeon[4][i][2])
table.insert(dungeon[2], monster)
end
-- addEvent for timer and creature death tracking.
addEvent(dungeon_system_updater, 500, cid, storage, 0, dungeon, false)
doTeleportThing(cid, dungeon[3][1])
return true
end