Hello guys, i got problems with Demon Oak. ^_^
When i use the axe on the "dead tree" i enter the area as it should. But then when im cutting on the Demon Oaks west arm, i can do it unlimited
there is no end, it just spawns more monsters. It should be a "poff" when that part is finnished but it doesnt?
How can i fix this? :huh:
Rep ++
When i use the axe on the "dead tree" i enter the area as it should. But then when im cutting on the Demon Oaks west arm, i can do it unlimited
there is no end, it just spawns more monsters. It should be a "poff" when that part is finnished but it doesnt?
How can i fix this? :huh:
Rep ++
Code:
function onUse(cid, item, fromPosition, itemEx, toPosition)
if blockingTree[itemEx.itemid] and itemEx.uid == blockingTree[itemEx.itemid][1] then
local tree = toPosition
if canEnter(cid, tree) ~= ERROR_NOERROR then
return doPlayerSendCancel(cid, getError(canEnter(cid, tree), tree)) and doSendMagicEffect(tree, CONST_ME_POFF)
end
doTransformItem(itemEx.uid, blockingTree[itemEx.itemid][2])
doSendMagicEffect(tree, CONST_ME_POFF)
doMoveCreature(cid, getDirectionTo(getCreaturePosition(cid), toPosition))
doCreatureSetStorage(cid, storages.treeCut, 1)
doCreatureSay(cid, "I AWAITED YOU! COME HERE AND GET YOUR REWARD!", TALKTYPE_MONSTER_YELL, false, cid, (positions.demonOak or getCreaturePosition(cid)))
return true
elseif isInArray(demonOak, itemEx.itemid) then
local get = getCreatureStorage(cid, itemEx.itemid)
if get == -1 then doCreatureSetStorage(cid, itemEx.itemid, 1) end
local k = 0
for i = demonOak[1], demonOak[table.maxn(demonOak)] do
if(getCreatureStorage(cid, i) == table.maxn(summons) + 1) then
k = k + 1
end
end
if killAllBeforeCut or k == table.maxn(demonOak) then
if getCreaturesInRange(TYPE_MONSTER, questAreaPosition[1], questAreaPosition[2], GET_COUNT) > 0 then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need to kill all monsters first.")
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
end
if(k == table.maxn(demonOak)) then
doTeleportThing(cid, positions.kick)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Tell Oldrak about your great victory against the demon oak.")
doCreatureSetStorage(cid, storages.done, 1)
return true
end
if getCreatureStorage(cid, itemEx.itemid) >= table.maxn(summons) + 1 then
return doSendMagicEffect(toPosition, CONST_ME_POFF)
end
if math.random(10) > 3 then
doSendMagicEffect(toPosition, CONST_ME_DRAWBLOOD)
doCreatureSay(cid, "-krrrrak-", TALKTYPE_MONSTER_YELL, false, cid, getThingPos(itemEx.uid))
doTargetCombatHealth(0, cid, floorDamage.type, -floorDamage.min, -floorDamage.max, floorDamage.effect)
return true
end
local deny = false
if summons[get] then
for i = 1, table.maxn(summons[get]) do
if monsterExists(summons[get][i]) then
local sPos = positions.summon[math.random(table.maxn(positions.summon))]
local thing = getTopCreature(sPos)
local area
if isMonster(thing.uid) then
area = getArea(sPos, 2, 2)
for _, pos in ipairs(area) do
if isCreature(getTopCreature(pos).uid) or not isInRange(pos, questAreaPosition[1], questAreaPosition[2]) then
deny = true
break
else
doCreateMonster(summons[get][i], pos)
break
end
end
else
doCreateMonster(summons[get][i], sPos)
end
end
end
if isLastCut(cid) then
doCreatureSay(cid, "HOW IS THAT POSSIBLE?!? MY MASTER WILL CRUSH YOU!! AHRRGGG!", TALKTYPE_MONSTER_YELL, false, cid, (positions.demonOak or getCreaturePosition(cid)))
else
doCreatureSay(cid, sounds[2][math.random(1, table.maxn(sounds[2]))], TALKTYPE_MONSTER_YELL, false, cid, (positions.demonOak or getCreaturePosition(cid)))
end
doSendMagicEffect(toPosition, CONST_ME_DRAWBLOOD)
if not deny then
doCreatureSetStorage(cid, itemEx.itemid, get + 1)
end
if math.random(100) >= 50 then
doTargetCombatHealth(0, cid, floorDamage.type, -floorDamage.min, -floorDamage.max, floorDamage.effect)
end
end
return false
end
end
Code:
_INFO =
{
UPDATED = "March 03 2011",
VERSION = "0.67",
REV = 44,
AUTHOR = "Darkhaos",
CONTACT = "http://otland.net/members/darkhaos/"
}
if getStorage(0x65535) < 1 then
doSetStorage(0x65536, os.clock())
print("\n>> Loading Demon Oak Lib V" .. (_INFO.VERSION or "?") .. " REV: " .. (_INFO.REV or "?") .. " (" .. (_INFO.UPDATED or "?") .. ") By " .. (_INFO.AUTHOR or "?") .. " (Contact: " .. (_INFO.CONTACT or "?") .. ")")
doSetStorage(0x65535, 1)
end
ITEM_DEADTREE = 2709
HALLOWEDAXE_PRICE = 1000
ERROR_NOERROR = 0
ERROR_TREEPOSITION = 1
ERROR_NOTENOUGHLEVEL = 2
ERROR_ALREADYDONE = 3
ERROR_ALREADYCUT = 4
ERROR_WAITFOR = 5
ERROR_MISSINGINFO = 6
TYPE_PLAYER = 1
TYPE_MONSTER = 2
TYPE_NPC = 3
TYPE_CREATURE = 4
GET_COUNT = 1
GET_UID = 2
STORAGE_LIB = 11257
STORAGE_THINK = 11258
DEMONOAKTHINK_TIME = 10000
DEMONOAKTHINK_CHANCE = 30
oneByQuest = true
killAllBeforeCut = false
enableOakThink = true
logEnabled = true
level = 120
positions =
{
kick = {x = 1059, y = 1097, z = 7},
summon =
{
{x = 1060, y = 1102, z = 7},
{x = 1066, y = 1100, z = 7},
{x = 1070, y = 1105, z = 7},
{x = 1068, y = 1107, z = 7},
{x = 1062, y = 1106, z = 7},
{x = 1070, y = 1108, z = 7},
{x = 1059, y = 1101, z = 7},
{x = 1064, y = 1108, z = 7}
},
rewardRoom = {x = 1069, y = 1087, z = 7},
demonOak = {x = 1065, y = 1105, z = 7}
}
summons =
{
[1] = {"Demon", "Grim Reaper", "Elder Beholder", "Demon Skeleton"},
[2] = {"Dark Torturer", "Banshee", "Betrayed Wraith", "Blightwalker"},
[3] = {"Bonebeast", "Braindeath", "Diabolic Imp", "Giant Spider"},
[4] = {"Hand Of Cursed Fate", "Lich", "Undead Dragon", "Vampire"},
[5] = {"Braindeath", "Demon", "Bonebeast", "Diabolic Imp"},
[6] = {"Demon Skeleton", "Banshee", "Elder Beholder", "Bonebeast"},
[7] = {"Dark Torturer", "Undead Dragon", "Demon", "Demon"},
[8] = {"Elder Beholder", "Betrayed Wraith", "Demon Skeleton", "Giant Spider"},
[9] = {"Demon", "Banshee", "Blightwalker", "Demon Skeleton"},
[10] = {"Grim Reaper", "Demon", "Diabolic Imp", "Braindeath"},
[11] = {"Banshee", "Grim Reaper", "Hand of Cursed Fate", "Demon"}
}
questAreaPosition =
{
{x = 1082, y = 1191, z = 7, stackpos = 255},
{x = 1098, y = 1200, z = 7, stackpos = 255}
}
demonOak = {8288, 8289, 8290, 8291}
storages =
{
done = 35712,
treeCut = 38551
}
blockingTree =
{
[ITEM_DEADTREE] = {32193, 3614}
}
floorDamage =
{
min = 250,
max = 310,
type = COMBAT_EARTHDAMAGE,
effect = CONST_ME_BIGPLANTS
}
rewards =
{
[12901] = {done = 12900, reward = 2495, count = 1},
[12902] = {done = 12900, reward = 8905, count = 1},
[12903] = {done = 12900, reward = 8918, count = 1},
[12904] = {done = 12900, reward = 8851, count = 1}
}
sounds =
{
[1] =
{
"Release me and you will be rewarded greatefully!",
"What is this? Demon Legs lying here? Someone might have lost them!",
"I'm trapped, come here and free me fast!!",
"I can bring your beloved back from the dead, just release me!",
"What a nice shiny golden armor. Come to me and you can have it!",
"Find a way in here and release me! Pleeeease hurry!",
"You can have my demon set, if you help me get out of here!"
},
[2] =
{
"MY ROOTS ARE SHARP AS A SCYTHE! FEEL IT?!?",
"CURSE YOU!",
"RISE, MINIONS, RISE FROM THE DEAD!!!!",
"AHHHH! YOUR BLOOD MAKES ME STRONG!",
"GET THE BONES, HELLHOUND! GET THEM!!",
"GET THERE WHERE I CAN REACH YOU!!!",
"ETERNAL PAIN AWAITS YOU! NICE REWARD, HUH?!?!",
"YOU ARE GOING TO PAY FOR EACH HIT WITH DECADES OF TORTURE!!",
"ARGG! TORTURE IT!! KILL IT SLOWLY MY MINION!!"
}
}
function canEnter(cid, tree)
if type(questAreaPosition) == "table" and type(questAreaPosition[1]) == "table" and type(questAreaPosition[2]) == "table" and level and type(storages) == "table" then
if isInRange(tree, questAreaPosition[1], questAreaPosition[2]) then
return ERROR_TREEPOSITION
elseif getPlayerLevel(cid) < level then
return ERROR_NOTENOUGHLEVEL
elseif getCreatureStorage(cid, storages.done) > 0 then
return ERROR_ALREADYDONE
elseif getCreatureStorage(cid, storages.treeCut) > 0 then
return ERROR_ALREADYCUT
elseif oneByQuest then
if getCreaturesInRange(TYPE_PLAYER, questAreaPosition[1], questAreaPosition[2], GET_COUNT) > 0 then
return ERROR_WAITFOR
end
end
else
return ERROR_MISSINGINFO
end
return ERROR_NOERROR
end
function getError(data, tree)
if data == ERROR_TREEPOSITION then
return print("[Warning - Action::Demon Oak Script] Dead tree position is inside the quest area positions.\nDead tree position: (x: " .. tree.x .. ", y: " .. tree.y .. ", z: " .. tree.z .. ")\nNorth-West area position (x: " .. questAreaPosition[1].x .. ", y: " .. questAreaPosition[1].y .. ", z: " .. questAreaPosition[1].z .. ")\nSouth-West area position (x: " .. questAreaPosition[2].x .. ", y: " .. questAreaPosition[2].y .. ", z: " .. questAreaPosition[2].z .. ")\nScript will not work correctly, please fix it.") and "Something is wrong, please contact a staff member."
elseif data == ERROR_NOTENOUGHLEVEL then
return "You need level " .. level .. " or higher to enter to the quest area."
elseif data == ERROR_ALREADYDONE then
return "You already done this quest."
elseif data == ERROR_ALREADYCUT then
return "You can not leave the quest area by here."
elseif data == ERROR_WAITFOR then
return "Wait until the player inside the quest area finish the quest."
elseif data == ERROR_MISSINGINFO then
return "Sorry, not possible."
end
return ""
end
function getCreaturesInRange(type, fromPos, toPos, get, countSummon)
local types =
{
[TYPE_PLAYER] = isPlayer,
[TYPE_MONSTER] = isMonster,
[TYPE_NPC] = isNpc,
[TYPE_CREATURE] = isCreature
}
local tmp = {}
local t = types[type]
if not t then
return print("[Warning - Function::getCreaturesInRange] Unknow type " .. (type or "(nil value)"))
end
local thing
local pos
for x = fromPos.x, toPos.x do
for y = fromPos.y, toPos.y do
for z = fromPos.z, toPos.z do
pos = {x = x, y = y, z = z}
thing = getTopCreature(pos)
if t(thing.uid) then
table.insert(tmp, thing.uid)
if not countSummon and isSummon(thing.uid) then
for i = 1, #tmp do
if tmp[i] == thing.uid then
table.remove(tmp, i)
break
end
end
end
end
end
end
end
if(get == GET_COUNT) then
return table.maxn(tmp)
elseif(get == GET_UID) then
return tmp
else
print("[Warning - Function::getCreaturesInRange] Unknow type to get " .. (get or "(nil value)"))
end
end
function monsterExists(name)
local file = "data/monster/monsters.xml"
local openFile = io.open(file, "r")
local m_name, getName, getFile, m_file = 0, 0, 0, 0
local monsterExists, fileExists = false, false
if openFile ~= nil then
for line in io.lines(file) do
if line:find('name=".*".*') and line:find('file=".*".*') then
getName = string.match(line, 'name=".*".*')
getFile = string.match(line, 'file=".*".*')
m_name = string.sub(getName, string.find(getName, '="') + 2, string.find(getName, '" ') - 1)
m_file = string.sub(getFile, string.find(getFile, '="') + 2, string.find(getFile, '"/') - 1)
if m_name == name then
monsterExists = true
mfile = io.open("data/monster/" .. m_file, "r")
if mfile ~= nil then
fileExists = true
mfile:close()
end
end
end
end
openFile:close()
end
return monsterExists and fileExists or false
end
function isSummon(cid)
return getCreatureMaster(cid) ~= cid or false
end
function isLastCut(cid)
local k, s = 0, 0
if not demonOak or type(demonOak) ~= "table" then
return false
end
for i = demonOak[1], demonOak[table.maxn(demonOak)] do
if getCreatureStorage(cid, i) == table.maxn(summons) + 1 then
k = k + 1
end
if getCreatureStorage(cid, i) == table.maxn(summons) then
s = s + 1
end
end
return (k == 3 and s == 1 and true or false)
end
function checkLib()
local final = "[" .. os.date() .. "]\n"
print("\n> Checking demon oak lib...")
local start = os.clock()
local r = 0
if type(summons) == "table" then
for k, v in pairs(summons) do
if v and type(v) == "table" then
for _, s in ipairs(v) do
if not monsterExists(s) then
print("[Warning - Lib::DemonOak] Table: summons, Id: " .. k .. ", Monster " .. s .. " does not exists.")
final = final .. " [Warning - Lib::DemonOak] Table: summons, Id: " .. k .. ", Monster " .. s .. " does not exists.\n"
r = r + 1
end
end
else
print("[Warning - Lib::DemonOak] Table: summons, Id: " .. k .. ", cannot load summons (table expected, got " .. (type(v) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Table: summons, Id: " .. k .. ", cannot load summons (table expected, got " .. (type(v) or "nil") .. ")\n"
r = r + 1
end
end
else
print("[Warning - Lib::DemonOak] Cannot load summons (table expected, got " .. (type(summons) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load summons (table expected, got " .. (type(summons) or "nil") .. ")\n"
r = r + 1
end
if type(positions) == "table" then
if type(positions.kick) ~= "table" then
print("[Warning - Lib::DemonOak] Invalid position for kick (table expected, got " .. (type(positions.kick) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Invalid position for kick (table expected, got " .. (type(positions.kick) or "nil") .. ")\n"
r = r + 1
elseif type(positions.rewardRoom) ~= "table" then
print("[Warning - Lib::DemonOak] Invalid position for reward room (table expected, got " .. (type(positions.rewardRoom) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Invalid position for reward room (table expected, got " .. (type(positions.rewardRoom) or "nil") .. ")\n"
r = r + 1
elseif type(positions.demonOak) ~= "table" then
print("[Warning - Lib::DemonOak] Cannot load demonOak position, scripts will use player position.")
final = final .. " [Warning - Lib::DemonOak] Cannot load demonOak position, scripts will use player position.\n"
r = r + 1
end
if type(positions.summon) == "table" then
for i = 1, table.maxn(positions.summon) do
if type(positions.summon[i]) ~= "table" then
print("[Warning - Lib::DemonOak] Invalid summon position on index " .. i .. " (table expected, got " .. (type(positions.summon[i]) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Invalid summon position on index " .. i .. " (table expected, got " .. (type(positions.summon[i]) or "nil") .. ")\n"
r = r + 1
end
end
else
print("[Warning - Lib::DemonOak] Cannot load summons position (table expected, got " .. (type(positions.summon) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load summons position (table expected, got " .. (type(positions.summon) or "nil") .. ")\n"
r = r + 1
end
else
print("[Warning - Lib::DemonOak] Cannot load positions (table expected, got " .. (type(positions) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load positions (table expected, got " .. (type(positions) or "nil") .. ")\n"
r = r + 1
end
if not questAreaPosition or type(questAreaPosition[1]) ~= "table" or type(questAreaPosition[2]) ~= "table" then
print("[Warning - Lib::DemonOak] Invalid area positions!")
final = final .. " [Warning - Lib::DemonOak] Invalid area positions!\n"
r = r + 1
end
if type(demonOak) ~= "table" then
print("[Warning - Lib::DemonOak] Cannot load 'demonOak' ids (table expected, got " .. (type(demonOak) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load 'demonOak' ids (table expected, got " .. (type(demonOak) or "nil") .. ")\n"
demonOak = {8288, 8289, 8290, 8291}
r = r + 1
end
if storages and storages.done and storages.treeCut then
if storages.done == storages.treeCut then
print("[Warning - Lib::DemonOak] Storage for dead tree (" .. storages.cutTree .. ") and storage to check if demonOak is finished (" .. storages.done .. ") are the same, change it or script will not work correctly.")
final = final .. " [Warning - Lib::DemonOak] Storage for dead tree (" .. storages.cutTree .. ") and storage to check if demonOak is finished (" .. storages.done .. ") are the same, change it or script will not work correctly.\n"
r = r + 1
end
else
print("[Warning - Lib::Demon Oak] Cannot load storages (table expected, got " .. (type(storages) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load storages (table expected, got " .. (type(storages) or "nil") .. ")\n"
r = r + 1
end
if type(blockingTree) == "table" then
for k, v in pairs(blockingTree) do
if type(v) ~= "table" then
print("[Warning - Lib::DemonOak] Cannot load info about dead tree id: " .. k .. " (table expected, got " .. (type(v) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load info about dead tree id: " .. k .. " (table expected, got " .. (type(v) or "nil") .. ")\n"
r = r + 1
end
end
else
print("[Warning - Lib::DemonOak] Cannot load info about dead tree (table expected, got " .. (type(blockingTree) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load info about dead tree (table expected, got " .. (type(blockingTree) or "nil") .. ")\n"
r = r + 1
end
if type(rewards) == "table" then
for k, v in pairs(rewards) do
if type(v) ~= "table" or not v.done or not v.reward or not v.count then
print("[Warning - Lib::DemonOak] Cannot load reward id " .. k .. "!")
final = final .. " [Warning - Lib::DemonOak] Cannot load reward id " .. k .. "!\n"
r = r + 1
end
end
else
print("[Warning - Lib::DemonOak] Cannot load rewards (table expected, got " .. (type(rewards) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load rewards (table expected, got " .. (type(rewards) or "nil") .. ")\n"
r = r + 1
end
if type(sounds) == "table" then
for k, v in pairs(sounds) do
if type(v) ~= "table" then
print("[Warning - Lib::DemonOak] Cannot load sounds on index " .. k .. " (table expected, got " .. (type(v) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load sounds on index " .. k .. " (table expected, got " .. (type(v) or "nil") .. ")\n"
r = r + 1
end
end
else
print("[Warning - Lib::DemonOak] Cannot load sounds (table expected, got " .. (type(sounds) or "nil") .. ")")
final = final .. " [Warning - Lib::DemonOak] Cannot load sounds (table expected, got " .. (type(sounds) or "nil") .. ")\n"
r = r + 1
end
print("> " .. r .. " problems loaded in " .. os.clock() - start .. " seconds.\n")
local logFile = "data/logs/demonOak.txt"
local f = io.open(logFile, "a+")
if logEnabled then
if f ~= nil then
f:write((r > 0 and final .. "\n\n" or ""))
f:close()
end
end
end
function demonOakThink()
if getGameState() == GAMESTATE_NORMAL then
if math.random(100) <= DEMONOAKTHINK_CHANCE then
if positions and positions.demonOak and type(positions.demonOak) == "table" and questAreaPosition and questAreaPosition[1] and type(questAreaPosition[1]) == "table" and questAreaPosition[2] and type(questAreaPosition[2]) == "table" then
local rangeX, rangeY = getDistanceBetween(positions.demonOak, questAreaPosition[1]) + 3, getDistanceBetween(positions.demonOak, questAreaPosition[2]) + 3
local list = getSpectators(positions.demonOak, rangeX, rangeY)
if list and #list > 0 then
for _, uid in ipairs(list) do
if isPlayer(uid) and not isInArea(getCreaturePosition(uid), questAreaPosition[1], questAreaPosition[2]) and getCreaturesInRange(TYPE_PLAYER, questAreaPosition[1], questAreaPosition[2], GET_COUNT) == 0 then
doCreatureSay(uid, sounds[1][math.random(table.maxn(sounds[1]))], TALKTYPE_MONSTER_YELL, false, uid, positions.demonOak)
end
end
end
end
end
end
addEvent(demonOakThink, DEMONOAKTHINK_TIME)
end
if getStorage(STORAGE_LIB) < 1 then
checkLib()
doSetStorage(STORAGE_LIB, 1)
end
if getStorage(STORAGE_THINK) < 1 and enableOakThink then
demonOakThink()
doSetStorage(STORAGE_THINK, 1)
end
if getStorage(0x65537) < 1 then
print(">> Demon Oak Lib loaded in " .. os.clock() - getStorage(0x65536) .. " seconds.\n")
doSetStorage(0x65537, 1)
end
Last edited: