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

NPC Structure (keywords, actions) more easy access!

Status
Not open for further replies.

Gattaca

OTLand's Developer
Joined
Mar 13, 2009
Messages
158
Reaction score
2
Location
Venezuela
Hello.

Well, as the hard way is to make NPCS, i decided to put here this idea, example 1;
This example is just for allowing the user to put actions into the parameter zone;
Lua:
<parameter key="message_farewell" value="Bye." />
<parameter key="message_greet" value="Hello |PLAYERNAME!." />
<parameter key="message_idletimeout" value="Dont waste my time." />
<parameter key="keywords" value="help;burn;item" />
<parameter key="keyword_reply1", 
 if PlayerHeathl=> 65 then
  doPlayerAddHealth(cid, 65)
  value="Oh your hurt my child, let me take care of you." />
 end
<parameter key="keyword_reply2",
  doSetPlayerCondition(poison, 1, 60000)
  value="Oh no! Your poisoned!" />
<parameter key="keyword_reply3",
  doPlayerAddItem(cid, 2160, 100)
  value="There you got!" />

Second one (Re-structured npc system).

Lua:
<npc name="Mac" script="data/npc/scripts/default.lua" autowalk="25" floorchange="25" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="12" head="20" body="100" legs="50" feet="99" corpse="2212"/>
<parameter key="message_farewell" value="Bye." />
<parameter key="message_greet" value="Hello |PLAYERNAME!." />
<parameter key="message_idletimeout" value="Dont waste my time." />
<script> --Start script
 <keywords>
  <parameter text="quest">
   if getPLayerStorageValue(cid, 6777) == -1 then
    doSetPlayerStorageValue(cid, 6777, 2)
    say = ("It seems you get into my bedroom huh!, now try to get into my sisters one!")
   else
    ...
   end
  </parameter>
 </keywords>
</script> --Close script
</npc>

Thats just an idea, and with it, it wont by necesary the uses of scripts.

Maybe it need more perfection, but for atleast it looks MORE EASY to make npcs.
 
Last edited:
Its a Good idea, but, why don't request bug fixes instead of new things ? :p
i'm just playing, it i'll be nice ;)
 
There is already something like this. Its called interaction, check possible params at npc.cpp.
 
If may you explain me what are you talking about, maybe i can do it.
But with this idea, will by more easy. And can by done.

As the recent one is:
Lua:
<parameter key="keywords" value="help" />
<parameter key="keyword_reply1" value="Help why?" />

And that one doesnt not, content anything for do something like this:

Lua:
 <keywords> --Start keywords
  <parameter text="quest"> --Start an new parameter key word if player say "quest"
   if getPLayerStorageValue(cid, 6777) == -1 then
    doSetPlayerStorageValue(cid, 6777, 2)
    say = ("It seems you get into my bedroom huh!, now try to get into my sisters one!")
   else
    ...
   end
  </parameter> --Closes the current keyword and can start an new one
 </keywords>

So tell me, if its not good idea ;)
 
The reason is because the NPC file is an XML document. I am not sure how it will be mixing XML with LUA in the same document. I don't its not possible, why else do we got "script="data/npc/scripts/default.lua"" written in so it loads from an complete lua document?
 
Yes, but make it more difficult and weird, to code all keywords in .lua, but as my idea, is 70% more easy, without maing handle::parameter(keyword::handle), and all of that stuff.
 
Wait until Revscriptsys.
 
Hi, you should check this out:
HTML:
<npc name="The Oracle" floorchange="0" walkinterval="0">
	<health now="150" max="150"/>
	<look typeex="1448"/>
	<interaction range="3" idletime="30">
		<interact keywords="hi" focus="1">
			<!--These are the keywords will trigger this interaction-->
			<keywords>hello</keywords>
			<keywords>greet</keywords>

			<response>
				<action name="script">
					<![CDATA[
						if(getPlayerLevel(cid)) >= 8 then
							selfSay(getCreatureName(cid) .. ", ARE YOU PREPARED O FACE YOUR DESTINY?")
							_state.b1 = (isPremium(cid) == TRUE)
							_state.topic = 1
						else
							selfSay("CHILD! COME BACK WHEN YOU HAVE GROWN UP!")
							_state.isidle = true
						end
					]]>
				</action>
			</response>
		</interact>

		<interact keywords="yes" topic="1">
			<!--Premium account, b1 is set in above-->
			<response b1="1" text="IN WHICH TOWN DO YOU WANT TO LIVE: CARLIN, EDRON, THAIS, OR VENORE?">
				<action name="topic" value="2"/>
			</response>

			<!--Normal account-->
			<response text="IN WHICH TOWN DO YOU WANT TO LIVE: CARLIN, THAIS, OR VENORE?">
				<action name="topic" value="2"/>
			</response>
		</interact>

		<interact keywords="carlin" topic="2">
			<response text="IN CARLIN! AND WHAT PROFESSION HAVE YOU CHOSEN: KNIGHT, PALADIN, SORCERER, OR DRUID?">
				<!--n1: 1 = carlin, 2 = edron, 3 = thais, 4 = venore-->
				<action name="script">
					<![CDATA[
						_state.n1 = 1
						_state.topic = 3
					]]>
				</action>
			</response>
		</interact>

		<interact keywords="thais" topic="2">
			<response text="IN THAIS! AND WHAT PROFESSION HAVE YOU CHOSEN: KNIGHT, PALADIN, SORCERER, OR DRUID?">
				<!--n1: 1 = carlin, 2 = edron, 3 = thais, 4 = venore-->
				<action name="script">
					<![CDATA[
						_state.n1 = 2
						_state.topic = 3
					]]>
				</action>
			</response>
		</interact>

		<interact keywords="venore" topic="2">
			<response text="IN VENORE! AND WHAT PROFESSION HAVE YOU CHOSEN: KNIGHT, PALADIN, SORCERER, OR DRUID?">
				<!--n1: 1 = carlin, 2 = edron, 3 = thais, 4 = venore-->
				<action name="script">
					<![CDATA[
						_state.n1 = 3
						_state.topic = 3
					]]>
				</action>
			</response>
		</interact>

		<interact keywords="edron" topic="2">
			<response text="YOU NEED A PREMIUM ACCOUNT IN ORDER TO GO THERE!">
				<!--Set the topic back to 2, ie. choose a new town.-->
				<action name="topic" value="2"/>
			</response>
			<!--b1: premium account, see <interact keywords="hi" focus="1"> where _state.b1 is is set.-->
			<response b1="1" text="IN EDRON! AND WHAT PROFESSION HAVE YOU CHOSEN: KNIGHT, PALADIN, SORCERER, OR DRUID?">
				<!--n1: 1 = carlin, 2 = edron, 3 = thais, 4 = venore-->
				<action name="script">
					<![CDATA[
						_state.n1 = 3
						_state.topic = 3
					]]>
				</action>
			</response>
		</interact>

		<!--If the player does not say any city, repeat our question-->
		<interact keywords="|*|" topic="2">
			<response b1="1" text="CARLIN, EDRON, THAIS, OR VENORE?"/>
			<response text="CARLIN, EDRON, THAIS, OR VENORE?"/>
		</interact>

		<interact keywords="sorcerer" topic="3">
			<response text="A SORCERER! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!">
				<!--n2: 1 = sorcerer, 2 = druid, 3 = paladin, 4 = knight-->
				<action name="script">
					<![CDATA[
						_state.n2 = 1
						_state.topic = 4
					]]>
				</action>
			</response>
		</interact>

		<interact keywords="druid" topic="3">
			<response text="A DRUID! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!">
				<!--n2: 1 = sorcerer, 2 = druid, 3 = paladin, 4 = knight-->
				<action name="script">
					<![CDATA[
						_state.n2 = 2
						_state.topic = 4
					]]>
				</action>
			</response>
		</interact>

		<interact keywords="paladin" topic="3">
			<response text="A PALADIN! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!">
				<!--n2: 1 = sorcerer, 2 = druid, 3 = paladin, 4 = knight-->
				<action name="script">
					<![CDATA[
						_state.n2 = 3
						_state.topic = 4
					]]>
				</action>
			</response>
		</interact>

		<interact keywords="knight" topic="3">
			<response text="A KNIGHT! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!">
				<!--n2: 1 = sorcerer, 2 = druid, 3 = paladin, 4 = knight-->
				<action name="script">
					<![CDATA[
						_state.n2 = 4
						_state.topic = 4
					]]>
				</action>
			</response>
		</interact>

		<!--If the player does not say any profession, repeat our question-->
		<interact keywords="|*|" topic="3">
			<response text="KNIGHT, PALADIN, SORCERER, OR DRUID?"/>
		</interact>

		<interact keywords="yes" topic="4">
			<response>
				<!--n1: 1 = carlin, 2 = edron, 3 = thais, 4 = venore-->
				<!--n2: 1 = knight, 2 = paladin, 3 = sorcerer, 4 = druid-->
				<action name="script">
					<![CDATA[
						local pos = 0
						if(_state.n1 == 1) then
							pos = {x=180, y=233, z=7}
						elseif(_state.n1 == 2) then
							pos = {x=180, y=233, z=7}
						elseif(_state.n1 == 3) then
							pos = {x=180, y=233, z=7}
						elseif(_state.n1 == 4) then
							pos = {x=180, y=233, z=7}
						else
							selfSay("I DO NOT KNOW WHAT PROFESSION THAT IS, ASK THE GODS FOR GUIDANCE!")
							return
						end

						selfSay("SO BE IT!")
						doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT)

						if(doTeleportThing(cid, pos) == 0) then
							doPlayerSetTown(cid, _state.n1)
							doPlayerSetVocation(cid, _state.n2)
							doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT)
						end
					]]>
				</action>
				<action name="idle" value="1"/>
			</response>
		</interact>

		<interact keywords="bye" focus="0">
			<keywords>farewell</keywords>
			<response text="Good bye. Recommend us, if you were satisfied with our service."/>
		</interact>

		<interact event="onBusy">
			<response text="WAIT UNTIL IT IS YOUR TURN!">
				<action name="addqueue" value="|PLAYER|"/>
			</response>
		</interact>

		<!--This event triggers if the player goes to far away from the npc/logout/idle timeout-->
		<interact event="onPlayerLeave" focus="0">
			<response text="COME BACK WHEN YOU ARE PREPARED TO FACE YOUR DESTINY!"/>
		</interact>
	</interaction>
</npc>
 
@up

lol tryed that few months ago. And it doesnt use NPC Channel, is an old one :).
 
@up

lol tryed that few months ago. And it doesnt use NPC Channel, is an old one :).

That's only because he doesn't use cid in selfSay... It should be like this

selfSay("MESSAGE_YOU_WANT", cid)
 
Status
Not open for further replies.
Back
Top