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

[MOD] Working Demon Oak Quest V0.4 [TFS 0.3.5]

Joined
Apr 17, 2008
Messages
1,922
Solutions
1
Reaction score
188
Location
Venezuela
There is my demon oak, now rewrited in mod.

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:
Yeah theres no example for npcs yet, dunno any of the params or format to put em in... and sometimes theres a bug in buffers.. :(
 
Gonna use this to learn a little bit of mods, for now, I hate them, hopefully that will change...
 
<mod>
blabla etc etc
<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>
</mod>

Really crappy setup, but that's how you can at least insert the npc in your mod. How to insert the script dunno, gotta trial and error for that.
 
Doesnt work for 0.4
demonoak04.png
 
Men Have Problem's ! :/

[Error - MoveEvents Interface]
Buffer:Onstepin Description: [string "loadbuffer"]:4: attempt to perfom arithmetic on a string value stack traceback: [string "loadbuffer"]:4: in function <[string "loadbuffer"]:1>
 
Last edited:
Man i got a problem when i use the hallowed axe on the tree.. i got this mensage:
[24/07/2010 14:37:24] [Error - Action Interface]
[24/07/2010 14:37:24] buffer
[24/07/2010 14:37:24] Description:
[24/07/2010 14:37:24] (luaDoCreateMonster) Cannot create monster: Elder Beholder

[24/07/2010 14:37:24] [Error - Action Interface]
[24/07/2010 14:37:24] buffer
[24/07/2010 14:37:24] Description:
[24/07/2010 14:37:24] (luaDoCreateMonster) Cannot create monster: Betrayed Wraith

[24/07/2010 14:37:24] [Error - Action Interface]
[24/07/2010 14:37:24] buffer
[24/07/2010 14:37:24] Description:
[24/07/2010 14:37:24] (luaDoCreateMonster) Cannot create monster: Demon Skeleton

[24/07/2010 14:37:24] [Error - Action Interface]
[24/07/2010 14:37:24] buffer
[24/07/2010 14:37:24] Description:
[24/07/2010 14:37:24] (luaDoCreateMonster) Cannot create monster: Giant Spider

[24/07/2010 14:37:24] [Error - Action Interface]
[24/07/2010 14:37:24] buffer
[24/07/2010 14:37:24] Description:
[24/07/2010 14:37:24] [string "loadBuffer"]:97: attempt to perform arithmetic on a string value

[24/07/2010 14:37:26] [Error - Action Interface]
[24/07/2010 14:37:26] buffer
[24/07/2010 14:37:26] Description:
[24/07/2010 14:37:26] (luaDoCreateMonster) Cannot create monster: Hand of Cursed Fate

[24/07/2010 14:37:26] [Error - Action Interface]
[24/07/2010 14:37:26] buffer
[24/07/2010 14:37:26] Description:
[24/07/2010 14:37:26] (luaDoCreateMonster) Cannot create monster: Lich

[24/07/2010 14:37:26] [Error - Action Interface]
[24/07/2010 14:37:26] buffer
[24/07/2010 14:37:26] Description:
[24/07/2010 14:37:26] (luaDoCreateMonster) Cannot create monster: Undead Dragon

[24/07/2010 14:37:26] [Error - Action Interface]
[24/07/2010 14:37:26] buffer
[24/07/2010 14:37:26] Description:
[24/07/2010 14:37:26] (luaDoCreateMonster) Cannot create monster: Vampire

[24/07/2010 14:37:27] [Error - MoveEvents Interface]
[24/07/2010 14:37:27] buffer:eek:nStepIn
[24/07/2010 14:37:27] Description:
[24/07/2010 14:37:27] [string "loadBuffer"]:4: attempt to perform arithmetic on a string value
[24/07/2010 14:37:27] stack traceback:
[24/07/2010 14:37:27] [string "loadBuffer"]:4: in function <[string "loadBuffer"]:1>

[24/07/2010 14:37:29] [Error - Action Interface]
[24/07/2010 14:37:29] buffer
[24/07/2010 14:37:29] Description:
[24/07/2010 14:37:29] (luaDoCreateMonster) Cannot create monster: braindeath

[24/07/2010 14:37:29] [Error - Action Interface]
[24/07/2010 14:37:29] buffer
[24/07/2010 14:37:29] Description:
[24/07/2010 14:37:29] (luaDoCreateMonster) Cannot create monster: Demon

[24/07/2010 14:37:29] [Error - Action Interface]
[24/07/2010 14:37:29] buffer
[24/07/2010 14:37:29] Description:
[24/07/2010 14:37:29] (luaDoCreateMonster) Cannot create monster: Bonebeast

[24/07/2010 14:37:29] [Error - Action Interface]
[24/07/2010 14:37:29] buffer
[24/07/2010 14:37:29] Description:
[24/07/2010 14:37:29] (luaDoCreateMonster) Cannot create monster: Diabolic Imp

[24/07/2010 14:37:29] [Error - Action Interface]
[24/07/2010 14:37:29] buffer
[24/07/2010 14:37:29] Description:
[24/07/2010 14:37:29] [string "loadBuffer"]:97: attempt to perform arithmetic on a string value
 
Check the monster names in data/monsters/-.xml, check that the name inside the monster file is equal than the monster name in the script, example:

Will work if..
Lua:
--monster file
<monster name="Dark Torturer"...

--script
[x] = {x, x, "Dark Torturer"}

Won't work if...
Lua:
--monster file
<monster name="dark torturer"...

--script
[x] = {x, x, "Dark Torturer"}
 
Back
Top