• 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!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

NPC The Oracle (No Island of Destiny)

BeniS

Advanced OT User
Senator
Joined
Aug 8, 2009
Messages
1,850
Reaction score
189
Location
New Zealand
[Updated] The Oracle | Fixed Capacity Issue (No Island of Destiny)

The Oracle NPC

Here's my Oracle script I made for just recently. Thought I'd release it for people, seeing as I don't have use for it :p

It adds Items for each vocation, everything can be configured in the Config section.

(The blocks of code I've commented out are examples for adding extra vocations and towns.)

EDIT: Upgraded the script to notify the players if he doesn't have enough cap to get the items and then when the player makes enough cap the player will get the items. It notifies the player every 10 seconds to make enough cap for his starting items.

Fixes the issue of not receiving his items.

oracle.lua: [Updated]
Lua:
--[[
	!---------------------------------!
	!---Created by Teh Maverick-------!
	!-------www.otland.net------------!
	!---------------------------------!
]]

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

local talktopic, town, vocation, destination, voc = {}, {}, {}, {}, {}

--!!Config!!--

--Vocation setup
local vocation1 = {name = "sorcerer", id = 1,
text = "Are you sure that a Sorcerer is what you wish to become? This decision is irreversible!"}

local vocation2 = {name = "druid", id = 2,
text = "Are you sure that a Druid is what you wish to become? This decision is irreversible!"}

local vocation3 = {name = "paladin", id = 3,
text = "Are you sure that a Paladin is what you wish to become? This decision is irreversible!"}

local vocation4 = {name = "knight", id = 4,
text = "Are you sure that a Knight is what you wish to become? This decision is irreversible!"}

--Item setup
local firstItems = {
  { -- sorcerer items
    {itemid=2457, count=1}, -- Steel Helmet
    {itemid=8819, count=1}, -- Magician's robe
    {itemid=2649, count=1}, -- Leather legs
    {itemid=2643, count=1}, -- Leather Boots
    {itemid=2521, count=1}, -- Dark Shield
    {itemid=2190, count=1}, -- Wand of vortex

    {itemid=2152, count=25}, -- Platinum Coins
    {itemid=2789, count=100}, -- Brown Mushrooms
  },
  { -- druid items
    {itemid=2457, count=1}, -- Steel Helmet
    {itemid=8819, count=1}, -- Magician's robe
    {itemid=2649, count=1}, -- Leather Legs
    {itemid=2643, count=1}, -- Leather Boots
    {itemid=2521, count=1}, -- Dark Shield
    {itemid=2182, count=1}, -- Snakebite Rod

    {itemid=2152, count=25}, -- Platinum Coins
    {itemid=2789, count=100}, -- Brown Mushrooms
  },
  { -- paladin items
    {itemid=2457, count=1}, -- Steel Helmet
    {itemid=2660, count=1}, -- Ranger's cloak
    {itemid=2507, count=1}, -- Ranger legs
    {itemid=2643, count=1}, -- Leather Boots
    {itemid=2521, count=1}, -- Dark Shield
    {itemid=2389, count=10}, -- Spears
	{itemid=2544, count=100}, -- Arrows
	{itemid=2456, count=1}, -- Bow

    {itemid=2152, count=25}, -- Platinum Coins
    {itemid=2789, count=100}, -- Brown Mushrooms
  },
  { -- knight items
    {itemid=2457, count=1}, -- Steel Helmet
    {itemid=2463, count=1}, -- Plate  Armor
    {itemid=2647, count=1}, -- Plate Legs
    {itemid=2643, count=1}, -- Leather Boots
    {itemid=2521, count=1}, -- Dark Shield
    {itemid=8602, count=1}, -- Jagged Sword
	{itemid=8601, count=1}, -- Steel Axe
	{itemid=2423, count=1}, -- Clerical Mace

    {itemid=2152, count=25}, -- Platinum Coins
    {itemid=2789, count=100}, -- Brown Mushrooms
  }
}

--Home Town setup
local city1 = {name = "avondale", id = 2, destination = {x=702, y=1016, z=7},
text = "Avondale, eh? So what vocation do you wish to become? {"..vocation1.name .."}, {"..vocation2.name .."}, {"..vocation3.name .."} or {"..vocation4.name .."}?"}

local city2 = {name = "calria", id = 3, destination = {x=1153, y=1139, z=7},
text = "Calria, eh? So what vocation do you wish to become? {"..vocation1.name .."}, {"..vocation2.name .."}, {"..vocation3.name .."} or {"..vocation4.name .."}?"}

local towntext = "What city do you wish to live in? {".. city1.name .."} or {".. city2.name .."}?"

--Text setup
	local requiredlevel = 8
	local lowlevel = "COME BACK WHEN YOU ARE LEVEL 8!"
	local refuse = "Then come back when you are ready."
	local refuse_voc = "Then what vocation do you want to become?"

----End Config-----

for _, items in ipairs(firstItems) do
	table.insert(items, item)
end

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 onThink() 					npcHandler:onThink()					end

function greetCallback(cid)

	if(getPlayerLevel(cid) < requiredlevel) then
		npcHandler:say(lowlevel, cid)
		return false
	else
		local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
		talktopic[talkUser], town[talkUser], vocation[talkUser], destination[talkUser], voc[talkUser] = 0, 0, 0, 0, 0
		return true
	end
end

function creatureSayCallback(cid, type, msg)

talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

	if(not npcHandler:isFocused(cid)) then
		return false
	end

	--Select Home Town control
		if talktopic[talkUser] == 0 and msgcontains(msg, "yes") then
			talktopic[talkUser] = 1 --question one, what city do you want?
			npcHandler:say(towntext, cid)
			
			elseif talktopic[talkUser] == 0 and msgcontains(msg, "no") then
				talktopic[talkUser] = 0
				npcHandler:unGreet(cid)
			
				elseif talktopic[talkUser] == 1 and msgcontains(msg, city1.name) then
					town[talkUser] = city1.id
					destination[talkUser] = city1.destination
					npcHandler:say(city1.text, cid)
					talktopic[talkUser] = 2 --question two, what vocation do you want?
					
				elseif talktopic[talkUser] == 1 and msgcontains(msg, city2.name) then
					town[talkUser] = city2.id
					destination[talkUser] = city2.destination
					npcHandler:say(city2.text, cid)
					talktopic[talkUser] = 2 --question two, what vocation do you want?
		end
		
	--Select Vocation control
		if talktopic[talkUser] == 2 and msgcontains(msg, vocation1.name) then
					talktopic[talkUser] = 3 --confirm dicision: are you sure you want to become...
					voc[talkUser] = vocation1.id
					npcHandler:say(vocation1.text, cid)
					
			elseif talktopic[talkUser] == 2 and msgcontains(msg, vocation2.name) then
					talktopic[talkUser] = 3 --confirm dicision: are you sure you want to become...
					voc[talkUser] = vocation2.id
					npcHandler:say(vocation2.text, cid)
					
			elseif talktopic[talkUser] == 2 and msgcontains(msg, vocation3.name) then
					talktopic[talkUser] = 3 --confirm dicision: are you sure you want to become...
					voc[talkUser] = vocation3.id
					npcHandler:say(vocation3.text, cid)
					
			elseif talktopic[talkUser] == 2 and msgcontains(msg, vocation4.name) then
					talktopic[talkUser] = 3 --confirm dicision: are you sure you want to become...
					voc[talkUser] = vocation4.id
					npcHandler:say(vocation4.text, cid)
		end
		
	--Confirm your choice control
		if talktopic[talkUser] == 3 and msgcontains(msg, 'yes') then
			talktopic[talkUser] = 4
			vocation[talkUser] = voc[talkUser]
			
		elseif talktopic[talkUser] == 3 and msgcontains(msg, 'no') then
			talktopic[talkUser] = 2
			npcHandler:say(refuse_voc, cid)
			voc[talkUser] = 0
		end
	
		if(destination[talkUser] ~= 0 and vocation[talkUser] ~= 0 and town[talkUser] ~= 0 and talktopic[talkUser] == 4) then
			if(getPlayerLevel(cid) < requiredlevel) then
				npcHandler:say('You must first reach level ' .. requiredlevel .. '!', cid)
				npcHandler:resetNpc()
			else
				if(getPlayerVocation(cid) > 0) then
					npcHandler:say('Sorry, You already have a vocation!', cid)
					npcHandler:resetNpc()
				else
					doPlayerSetVocation(cid, vocation[talkUser])
					doPlayerSetTown(cid, town[talkUser])
					npcHandler:resetNpc()

					local tmp = getCreaturePosition(cid)
					doTeleportThing(cid, destination[talkUser])
					doSendMagicEffect(tmp, CONST_ME_POFF)
					doSendMagicEffect(destination, CONST_ME_TELEPORT)
					
					itemThink(cid)
				end
			end
		end
	return true
end

function itemThink(cid)
talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
	local backpack = doCreateItemEx(1988, 1)
	local giveItems = firstItems[vocation[talkUser]]
	if giveItems ~= nil then
		for _, v in ipairs(giveItems) do
			doAddContainerItem(backpack, v.itemid, v.count or 1)
		end
		local addItem = doPlayerAddItemEx(cid, backpack, 0)
		if (addItem == RETURNVALUE_NOERROR and getPlayerStorageValue(cid,9011) < 1) then
			setPlayerStorageValue(cid,9011,1)
			doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,'You recieved items from the Oracle.')
			return true
		elseif addItem == RETURNVALUE_NOTENOUGHCAPACITY then
			doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,'you don\'t have enough capacity for your start items, please make capacity by dropping items.')
			addEvent(itemThink,10000,cid)
			return true
		end
	end
  return true
end

npcHandler:setMessage(MESSAGE_GREET, "Hello |PLAYERNAME|. Are you prepared to face your destiny?")
npcHandler:setMessage(MESSAGE_WALKAWAY, "Goodbye adventurer!")
npcHandler:setMessage(MESSAGE_FAREWELL, "come back when you are ready!")

npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

create a new file in your data/creaturescripts/scripts folder called oracle_check.lua and add the following code: [Added]
Lua:
	local oracleItems = 9011
	if getPlayerStorageValue(cid,oracleItems) < 1 then
	  itemThinker(cid)
	end
	
function itemThinker(cid)
	local backpack = doCreateItemEx(1988, 1)
	local giveItems = firstItems[getPlayerVocation(cid)]
	if giveItems ~= nil then
		for _, v in ipairs(giveItems) do
			doAddContainerItem(backpack, v.itemid, v.count or 1)
		end
		local addItem = doPlayerAddItemEx(cid, backpack, 0)
		if (addItem == RETURNVALUE_NOERROR and getPlayerStorageValue(cid,9011) < 1) then
			setPlayerStorageValue(cid,9011,1)
			doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,'You recieved items from the Oracle.')
			return true
		elseif (addItem == RETURNVALUE_NOTENOUGHCAPACITY and getPlayerStorageValue(cid,9011) < 1) then
			doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,'you don\'t have enough capacity for your start items, please make capacity by dropping items.')
			addEvent(itemThinker,10000,cid)
			return true
		end
	end
  return true
end

Add this to your creaturescripts.xml file: [Added]
PHP:
<event type="login" name="OracleCheck" event="script" value="oracle_check.lua"/>

The Oracle.xml:
PHP:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="The Oracle" script="oracle.lua" walkinterval="0" floorchange="0">
	<health now="100" max="100"/>
	<look typeex="8422" corpse="3128"/>
</npc>
(the looktype can be changed to any item you like)

Hope its useful! Rep++ if you like or if this helped you! :D
 
Last edited:

I don't know what you guys mean haha, could you explain?

:eek: pretty simple npc.
Yea i know, its supposed to be :p but the one I made for Peroxide is a lot better, makes it so if you don't have enough cap when you travel with the Oracle it prompts you saying you need cap and will give the equips when you do :p stuff like that haha.
 
After getting teleported, my player doesn't get items :( (using criyingdamson 0.36.pl1)
 
[18/07/2010 15:16:39] [Error - Npc interface]
[18/07/2010 15:16:39] In a timer event called from:
[18/07/2010 15:16:39] data/npc/scripts/The Oracle.lua:eek:nCreatureSay
[18/07/2010 15:16:39] Description:
[18/07/2010 15:16:39] (luaDoAddContainerItem) Item not found

[18/07/2010 15:16:51] [Error - Npc interface]
[18/07/2010 15:16:51] In a timer event called from:
[18/07/2010 15:16:51] data/npc/scripts/The Oracle.lua:eek:nCreatureSay
[18/07/2010 15:16:51] Description:
[18/07/2010 15:16:51] (luaDoAddContainerItem) Item not found
 
Would it be possible to ask the player (knight) to choose an axe,sword or club weapon?
 
i got error
xncj6t.jpg

how to fix that ?
 
Back
Top