• 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 Hunting Assistance

Status
Not open for further replies.

chojrak

Banned User
Joined
Oct 25, 2008
Messages
5,832
Solutions
2
Reaction score
160
Hello, I wrote to you interesting NPC.

Functions:
Code:
[LIST][*]Healer
[*]Mana Restore
[*]Rune Shoot
[*]Spell Use
[*]Anty Paralyze
[/LIST]

Configuration
Code:
[B]_- Basic -_[/B]
[B]ownerName[/B] - Your character name.

[B]_- Healer -_[/B]
[B]enabled[/B] - Do you want to use healer?
[B]sayWord[/B] - Do you want to NPC say 'exura sio "your name'?
[B]healthToHeal[/B] - NPC will use healing spell when your health is minor than this value.
[B]min[/B] - Min. healing damage.
[B]max[/B] - Max. healing damage.

[B]_- Mana Restorer -_[/B]
[B]enabled[/B] - Do you want to use restorer?
[B]manaToRestore[/B] - NPC will restore your mana when mana point is minor than this value.
[B]min[/B] - Min. mana restore value.
[B]max[/B] - Max. mana restore value.

[B]_- Rune Shooter -_[/B]
[B]enabled[/B] - Do you want to use rune shooter?
[B]delay[/B] - Interval between hits. (In seconds.)
[B]effect[/B] - Rune's hit effect.
[B]shootEffect[/B] - Rune's shoot effect.
[B]combat[/B] - Rune's combat type.
[B]min[/B] - Min. rune's damage.
[B]max[/B] - Max. rune's damage

[B]_- Spell Caster -_[/B]
[B]enabled[/B] - Do you want to use spell caster?
[B]sayWord[/B] - Do you want to NPC say 'spell word'?
[B]delay[/B] - Interval between casts.
[B]combat[/B] - Spell's combat type.
[B]area[/B] - Spell's area.
[B]word[/B] - Spell word.
[B]effect[/B] - Spell's effect.
[B]min[/B] - Min. spell's damage.
[B]max[/B] - Max. spell's damage.

[B]_- Anty Paralyze -_[/B]
[B]enabled[/B] - Do you want to use anty paralyze?

[B]_- Magic Keywords -_[/B]
[B]disappear[/B] - NPC will disappear.
[B]kick[/B] - NPC will kick you.




Mastah.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Mastah" script="data/npc/scripts/mastah.lua" speed="1200" walkinterval="0" floorchange="0">
	<health now="1500" max="1500"/>
	<look type="289" addons="3" head="0" body="0" legs="0" feet="0" corpse="2317"/>
</npc>

mastah.lua:
Code:
-- Load spell area's data.
dofile(getDataDir() .. "spells/lib/spells.lua")

-- Basic Config
local basic = {
	ownerName = "Meeow" -- Your character name.
}

-- Healer Config
local healer = {
	enabled = TRUE,
	sayWord = TRUE,
	healthToHeal = 4000,
	min = 700,
	max = 1200
}
-- Mana Restore Config
local manaRestore = {
	enabled = TRUE,
	manaToRestore = 800,
	min = 150,
	max = 300
}
-- Rune Config
local rune = {
	enabled = TRUE,
	lastShoot = os.clock(), -- Don't touch!
	delay = 1,
	effect = CONST_ME_MORTAREA,
	shootEffect = CONST_ANI_SUDDENDEATH,
	combat = COMBAT_DEATHDAMAGE,
	min = 750,
	max = 1100
}
-- Spell Config
local spell = {
	enabled = TRUE,
	sayWord = TRUE,
	lastCast = os.clock(), -- Don't touch!
	delay = 3,
	combat = COMBAT_ICEDAMAGE,
	area = createCombatArea(AREA_CROSS5X5),
	word = "Exevo Gran Mas Frigo",
	effect = CONST_ME_ICETORNADO,
	min = 700,
	max = 1000
}
-- Anty Paralyze
local antyPara = {
	enabled = TRUE
}

-- Don't touch below!
local owner = 0
local target = FALSE

local function findOwner()
	local list = getSpectators(getNpcPos(), 9, 9, false)
	if (#list > 0) then
		for i = 1, #list do
			local _target = list[i]
			if (_target ~= 0) then
				if (getCreatureName(_target) == basic.ownerName) then
					selfSay("Hi ".. basic.ownerName .."!")
					selfFollow(_target)
					owner = _target
				end
			end
		end
	end
end

local function doHealOwner()
	if (getCreatureHealth(owner) < healer.healthToHeal) then
		if (healer.sayWord) then
			doCreatureSay(getNpcCid(), "Exura Sio \"".. basic.ownerName, TALKTYPE_ORANGE_1)
		end
		doCreatureAddHealth(owner, math.random(healer.min, healer.max))
		doSendMagicEffect(getCreaturePosition(getNpcCid()), CONST_ME_MAGIC_BLUE)
		doSendMagicEffect(getCreaturePosition(owner), CONST_ME_MAGIC_GREEN)
	end
end

local function doRestoreMana()
	if (getPlayerMana(owner) < manaRestore.manaToRestore) then
		doPlayerAddMana(owner, math.random(manaRestore.min, manaRestore.max))
		doSendMagicEffect(getCreaturePosition(owner), CONST_ME_MAGIC_BLUE)
	end
end

local function doUseRune()
	target = FALSE
	local shooted = FALSE
	local r_list = getSpectators(getNpcPos(), 9, 9, false)
	if (#r_list > 0) then
		for i = 1, #r_list do
			local r_target = r_list[i]
			if (isPlayer(r_target) == FALSE and isNpc(r_target) == FALSE and getNpcCid() ~= r_target and shooted == FALSE) then
				local tPos = getCreaturePosition(r_target)
				doSendMagicEffect(tPos, rune.effect)
				doSendDistanceShoot(getCreaturePosition(getNpcCid()), tPos, rune.shootEffect)
				doTargetCombatHealth(getNpcCid(), r_target, rune.combat, -rune.min, -rune.max, rune.effect)
				shooted = TRUE
				target = TRUE
			end
		end
	end
end

local function doCastSpell()
	if (spell.sayWord) then
		doCreatureSay(getNpcCid(), spell.word, TALKTYPE_ORANGE_1)
	end

	doAreaCombatHealth(getNpcCid(), spell.combat, getCreaturePosition(getNpcCid()), spell.area, -spell.min, -spell.max, spell.effect)
end

local function doRemovePara()
	if (hasCondition(owner, CONDITION_PARALYZE)) then
		doRemoveCondition(owner, CONDITION_PARALYZE)
		doSendMagicEffect(getCreaturePosition(owner), CONST_ME_MAGIC_GREEN)
	end
end

function onCreatureDisappear(cid)
	if (cid == owner) then
		owner = 0
	end
end

function onCreatureSay(cid, type, msg)
	if (cid == owner) then
		if  (msg == "disappear") then
			selfSay("Good bye ;)")
			doHealOwner()
			doRestoreMana()
			doRemoveCreature(getNpcCid())
		elseif (msg == "kick") then
			doRemoveCreature(cid)
		end
	end
end

function onThink()
	-- Try to find owner, if he's not already found.
	if (owner == 0) then
		findOwner()
		return
	end

	-- Update following
	selfFollow(owner)

	-- On floor change ;)
	local myPos = getCreaturePosition(getNpcCid())
	local ownerPos = getCreaturePosition(owner)
	if (myPos.z ~= ownerPos.z) then
		doSendMagicEffect(myPos, CONST_ME_POFF)
		doTeleportThing(getNpcCid(), ownerPos)
		doSendMagicEffect(ownerPos, CONST_ME_TELEPORT)
	end

	-- Healer
	if (healer.enabled) then
		doHealOwner()
	end

	-- Mana Restore
	if (manaRestore.enabled) then
		doRestoreMana()
	end

	-- Shoot Rune
	if (rune.enabled and rune.lastShoot < os.clock()) then
		rune.lastShoot = (os.clock()+rune.delay)
		doUseRune()
	end

	-- Cast Spell
	if (spell.enabled and target ~= FALSE and spell.lastCast < os.clock()) then
		spell.lastCast = (os.clock()+spell.delay)
		doCastSpell()
	end

	-- Anty Paralyze
	if (antyPara.enabled) then
		doRemovePara()
	end
end

YouTube Presentation: YouTube - Hunting Assistance


Tested on The Forgotten Server 0.3.4pl2


Always sorry for my bad english :(
 
Last edited:
Wow...does it follow you around?

Edit:
_- Magic Keywords -_
disappear - NPC will disappear.
kick - NPC will kick you.

Very interesting
 
JDB: Yes this npc follow's you.

Later i'll add some new functions. ;p
 
Last edited:
Nice script, but it can be use only by player from script.. So if u want to change name of player u have to reload npcs, right? Then it's useless for me. Maybe if script would check database for name of player that can use this npc would be better ;d It's just my idea..
 
Try this:
Code:
local function updateOwner()
	owner = 0
	local row = db.getResult("SELECT * FROM `npc_config`");
	basic.ownerName = row:getDataString("name")
end

(You need to create new table 'npc_config' and create row 'name')
 
Last edited:
You don't need to reload NPC, but you have to spawn NPC again. I made this NPC only for fun. :p

Reload or spawn again it is same thing for me xD Well it can be little change and use on servers xd Nice one anyway ;)
 
Haha, found my old thread while previewing NPC's.
Bump ^.^
 
As expected from the greatest n00bak scripter I know! Your the coolest with ur rock 'n roll hair ;) !
 
I have a nice ide to you just do so you can buy a the npc in some shop :D and then it's logout when you logout. and start to teleport after you then you login :D
 
I have a nice ide to you just do so you can buy a the npc in some shop :D and then it's logout when you logout. and start to teleport after you then you login :D

Haha, or rent for points from shop! :D
Maybe in free time I'll update this NPC and add new features, but not sure 'Cause haven't free time. ;p
 
Awesome! haven't seen such cool script in some time:)

lol He killed me!!!XD
 
Last edited:
Status
Not open for further replies.
Back
Top