There is my demon oak, now rewrited in mod.
Update Log:
go to ...data/mod and create a file called demonOak.xml
Npc by Mazen (Oldrak.xml)
..data/npc/Oldrak.xml
..data/npc/scripts/oldrak.lua
Reserved ids:
Note: 11 cuts to each demon oak part, but there is a possibility of 10% that it is not necessary to do 11 cuts to that part, you can change the percentage here:
Enjoy!
Update Log:
Code:
[B]v0.1:[/B]
- Fixed bug with Oldrak.lua.
- Fixed hallowed axe price. (Before 250,000 gold pieces, now 1,000)
- Updated demonOakGravestone.lua (Now you need the confirmation from Oldrak to enter to the reward room)
[B]v0.2:[/B]
- Fixed bug checking area, now is working "onePerQuest"
- Fixed missing "end" in Oldrak.lua
[B]v0.3:[/B]
- A message is sended if player does not have the needed level.
- Updated to 0.3.5 (Crying Damson)
- Files changed: [data/actions/scripts/demonOak.lua, data/actions/scripts/demonOakGravestone.lua, data/actions/scripts/demonOakChests.lua, data/npc/scripts/oldrak.lua]
[B]v0.4:[/B]
- Rewrited script, now in mod.
- Added a cancel message if player is inside the quest and try to cut the tree again.
go to ...data/mod and create a file called demonOak.xml
XML:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="demonOakQuest" version="0.4" author="Darkhaos" contact="[email protected]" enabled="yes">
<description>
Working Demon Oak Quest for TFS 0.3.6
</description>
<config name="demonOak_config"><![CDATA[
onePerQuest = true
level = 120
positions =
{
reward = {x=99, y=123, z=7},
kick = { x = 571, y = 621, z = 7 },
summon =
{
{x=575, y=630, z=7},
{x=583, y=629, z=7},
{x=579, y=635, z=7},
{x=575, y=634, 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"}
}
areaPosition =
{
{x=568, y=624, z=7, stackpos = 255},
{x=589, y=640, z=7, stackpos = 255}
}
demonOak = {8288, 8289, 8290, 8291}
storages =
{
done = 35700,
cutTree = 36901
}
blockingTree =
{
[2709] = {32193, 3669}
}
uid =
{
[12901] = {done = 12900, reward = 2495, count = 1},
[12902] = {done = 12900, reward = 8905, count = 1},
[12903] = {done = 12900, reward = 2495, count = 1},
[12904] = {done = 12900, reward = 8905, count = 1}
}
areaDamage =
{
min = 270,
max = 310
}
]]></config>
<action itemid="8293" event="buffer"><![CDATA[
domodlib('demonOak_config')
if blockingTree[itemEx.itemid] and itemEx.uid == blockingTree[itemEx.itemid][1] then
local tree = toPosition
if isInRange(tree, areaPosition[1], areaPosition[2]) then
print("MOD>> [Warning - Error::Demon Oak] 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: " .. areaPosition[1].x .. ", y: " .. areaPosition[1].y .. ", z: " .. areaPosition[1].z .. ")\nSouth-West area position (x: " .. areaPosition[2].x .. ", y: " .. areaPosition[2].y .. ", z: " .. areaPosition[2].z .. ")\nScript will not work correctly, please fix it.")
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Something is wrong, please contact a gamemaster.")
return
end
if getPlayerLevel(cid) < level then
doPlayerSendCancel(cid, "You need level " .. level .. " or more to enter this quest.")
return true
end
if getPlayerStorageValue(cid, storages.done) > 0 then
doPlayerSendCancel(cid, "You already done this quest.")
return true
end
if getPlayerStorageValue(cid, storages.cutTree) > 0 then
return
end
if onePerQuest then
local players = getPlayersOnline()
for _, pid in ipairs(players) do
if isInRange(getCreaturePosition(pid), areaPosition[1], areaPosition[2]) then
doPlayerSendCancel(cid, "Wait until " .. getCreatureName(pid) .. " finish the quest.")
return true
end
end
end
doTransformItem(getThingFromPos(toPosition).uid, blockingTree[itemEx.itemid][2])
doSendMagicEffect(toPosition, CONST_ME_POFF)
doMoveCreature(cid, SOUTH)
doPlayerSetStorageValue(cid, storages.cutTree, 1)
return true
elseif isInArray(demonOak, itemEx.itemid) then
local get = getPlayerStorageValue(cid, itemEx.itemid)
if get == -1 then
doPlayerSetStorageValue(cid, itemEx.itemid, 1)
end
if(getPlayerStorageValue(cid, 8288) == 12 and getPlayerStorageValue(cid, 8289) == 12 and getPlayerStorageValue(cid, 8290) == 12 and getPlayerStorageValue(cid, 8291) == 12) then
doTeleportThing(cid, positions.kick)
doPlayerSetStorageValue(cid, storages.done, 1)
return true
end
if getPlayerStorageValue(cid, itemEx.itemid) > 11 then
doSendMagicEffect(toPosition, CONST_ME_POFF)
return true
end
if(math.random(100) <= 1) then
doPlayerSetStorageValue(cid, itemEx.uid, 12)
return true
end
if summons[get] then
for i = 1, #summons[get] do
doCreateMonster(summons[get][i], positions.summon[i])
doSendMagicEffect(positions.summon[i], CONST_ME_TELEPORT)
end
doSendMagicEffect(toPosition, CONST_ME_DRAWBLOOD)
doPlayerSetStorageValue(cid, itemEx.itemid, get + 1)
if math.random(100) >= 50 then
doTargetCombatHealth(0, cid, COMBAT_EARTHDAMAGE, -areaDamage.min, -areaDamage.max, CONST_ME_BIGPLANTS)
end
return
end
end
]]></action>
<action uniqueid="55100" event="buffer"><![CDATA[
domodlib('demonOak_config')
if getPlayerStorageValue(cid, 35700) > 1 then
doTeleportThing(cid, positions.reward)
doSendMagicEffect(positions.reward, CONST_ME_TELEPORT)
else
return
end
]]></action>
<action uniqueid="12901-12904" event="buffer"><![CDATA[
domodlib('demonOak_config')
if uid[item.uid] then
local t = uid[item.uid]
if(getPlayerStorageValue(cid, t.done) < 1) then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have found " .. getItemArticleById(t.reward) .. " " .. getItemNameById(t.reward) .. ".")
doPlayerAddItem(cid, t.reward, t.count)
doPlayerSetStorageValue(cid, t.done, 1)
else
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It's empty.")
end
else
return
end
]]></action>
<movevent type="StepOut" uniqueid="32193" event="script">
if item.uid == 32193 then
doTransformItem(item.uid, 2709)
end
</movevent>
<movevent type="StepIn" itemid="8292" event="script">
domodlib('demonOak_config')
if isPlayer(cid) and math.random(1, 24) == 1 then
doTargetCombatHealth(0, cid, COMBAT_EARTHDAMAGE, -areaDamage.min, -areaDamage.max, CONST_ME_BIGPLANTS)
end
</movevent>
<event type="logout" name="demonOakLogout" event="script"><![CDATA[
function onLogout(cid)
if getPlayerStorageValue(cid, 36901) > 0 and getPlayerStorageValue(cid, 35700) < 1 then
doPlayerSetStorageValue(cid, 36901, 0)
end
return true
end
]]></event>
<event type="death" name="demonOakDeath" event="script"><![CDATA[
function onDeath(cid, corpse)
if getPlayerStorageValue(cid, 36901) > 0 and getPlayerStorageValue(cid, 35700) < 1 then
doPlayerSetStorageValue(cid, 36901, 0)
end
return true
end
]]></event>
</mod>
Npc by Mazen (Oldrak.xml)
..data/npc/Oldrak.xml
XML:
<npc name="Oldrak" script="data/npc/scripts/oldrak.lua" walkinterval="2000" floorchange="0" access="3" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="57" head="115" body="113" legs="31" feet="38" addons="3" corpse="2212"/>
<parameters>
<parameter key="message_greet" value="Hello, |PLAYERNAME|!" />
<parameter key="message_needmoremoney" value="Try again when you have more money."/>
<parameter key="message_decline" value="Why would you tease me like that?"/>
</parameters>
</npc>
..data/npc/scripts/oldrak.lua
Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function creatureSayCallback(cid, type, msg)
if(not npcHandler:isFocused(cid)) then
return false
end
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
if msgcontains(msg, 'hallowed axe') then
selfSay('Do you want to buy a Hallowed Axe from me?', cid)
talkState[talkUser] = 1
elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then
local price = 1000
if getPlayerItemCount(cid, 2386) >= 1 and getPlayerMoney(cid) >= price then
if doPlayerRemoveMoney(cid, price) then
selfSay('Here you are. You can now defeat the demon oak with this axe.', cid)
doPlayerRemoveItem(cid, 2386, 1)
doPlayerAddItem(cid, 8293, 1)
talkState[talkUser] = 0
end
else
selfSay('I need an axe and ' .. price .. ' gold coins to make you a {hallowed axe}.', cid)
talkState[talkUser] = 0
end
elseif msgcontains(msg, 'demon oak') then
selfSay('Did you defeat the demon oak?', cid)
talkState[talkUser] = 2
elseif msgcontains(msg, 'yes') and talkState[talkUser] == 2 then
if getPlayerStorageValue(cid, 35700) == 1 then
selfSay('Good job!', cid)
doPlayerSetStorageValue(cid, 35700, 2)
talkState[talkUser] = 0
else
selfSay('Go defeat the demon oak first.', cid)
talkState[talkUser] = 0
end
elseif msgcontains(msg, 'no') and (talkState[talkUser] >= 1 and talkState[talkUser] <= 3) then
selfSay('Ok thanks.', cid)
talkState[talkUser] = 0
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Reserved ids:
Code:
2709 --id of dead tree
3669 --when you use axe in the dead tree, it will be transformed to mthis item
35700 --storage when finish the quest
36901 --storage when you cut the tree
32193 --uniqueid of the dead tree
12901 to 12904 --unique ids for the chests
12900 --storage for the chests
Note: 11 cuts to each demon oak part, but there is a possibility of 10% that it is not necessary to do 11 cuts to that part, you can change the percentage here:
Lua:
if(math.random(100) <= 10) then
doPlayerSetStorageValue(cid, itemEx.uid, 12)
return TRUE
end
Enjoy!
Last edited: