User Tools

Site Tools


lua:scripting:examples:mickeymouseears

MickeyMouseEars

Let's make Mickey Mouse give us a quest point reward for giving his ears back.
Before we get started, let's get a few things set up:
1. Turn wiznet on
2. Turn on wiznet bug
This is important as any errors with our script will show up here.

A few things we need to know:
1. Mickey's vnum: 11601 (find with 'vnum mickey')
2. Vnum for the ears: 11602 (find with 'vnum mickey')
3. Mprog vnum we will use.

For #3, we can use any unused mprog vnum but it's good practice to use the same vnum as the mob when possible. In this case it is, so we will use vnum 11601.

Create the mprog and set it to use lua:

mpedit create 11601
MobProgram Code Created.

show
Vnum: [11601]
Lua: False
Code:

lua
LUA set to TRUE

show
Vnum: [11601]
Lua: True
Code:

We could write the code now, but first let's take a look at how we will attach it to the mob so we can understand better what will go into the code.

Use medit and addmp to set a trigger to run our prog:

medit 11601

addmp 11601 give 11602
Mprog Added.

show
Name: [mickey mouse]
Area: [ 3] Disney
Act: [npc sentinel stay_area]
Vnum: [11601] Sex: [male ] Race: [human]
Level: [ 5] Align: [ 0]
Hitroll: [100%= 5] Damage: [100%= 7] Dam Type: [punch]
Hitpoints: [100%= 130] Mana: [100%= 110] Move: [100%= 110]
Armor: [100%= 70] Saves: [100%= -2]
Affected by: [none]
Form: [edible sentient biped mammal]
Parts: [head arms legs heart brains guts hands feet fingers ear eye tail]
Imm: [none]
Res: [none]
Vuln: [bash]
Off: [kick]
Size: [medium]
Start pos. [standing]
Default pos [standing]
Wealth: [200%=22]
Stance: [default]
Short descr: Mickey Mouse
Long descr:
Mickey Mouse is here shaking everyone's hand.
Description:
A tall friendly looking mouse. He tips his hat to you and smiles. You
try to repress the urge to pull his tail.

MOBPrograms for [11601]:
Number Vnum Trigger Phrase
 ------ ---- ------- ------
[ 0] 11601 GIVE 11602

done

We see we added a GIVE trigger with Phrase of 11602 which means it will run mprog vnum 11601 any time that item vnum 11602 is given to Mickey.
Knowing that let's go back to our code and make him do what we want him to!

mpedit 11601

code
-=======- Entering APPEND Mode -========-
Type .h on a new line for help
 Terminate with a ~ or @ on a blank line.
-=======================================-
> say("You just gave me what I was looking for")> @
Fixing mob 11601.
Fixed lua script for 11601.

give ears mick
You give Mickey Mouse ears to Mickey Mouse.
Mickey Mouse says 'You just gave me what I was looking for'

Great, it's working! Now let's get him to give a reward.

When the script runs, there are certain variables passed along to our script depending on the trigger and circumstances. Information is found at the Mob Progs page. In this case we see the player who gives the ears will be passed as a variable of type CH named ch. In the lua script we also have the mob represented as a CH named mob. This is important to know as it defines what the mob can do. We will need to use the CH method 'reward' to give the quest point reward.

Please note that you can call any of the functions available to CH without a qualifier (like our say() above), it will automatically use the mob running the script to run that function. So our say() above is the equivalent of mob:say().

mpedit 11601

code
-=======- Entering APPEND Mode -========-
Type .h on a new line for help
 Terminate with a ~ or @ on a blank line.
-=======================================-
1. say("You just gave me what I was looking for")> .c
String cleared. > reward(ch.name.."qp 1") > say( "Thanks "..ch.name.."!!!") > @
Fixing mob 11601.
Fixed lua script for 11601.

give ear mick
You give Mickey Mouse ears to Mickey Mouse.
[*****] BUG: do_mpreward: Too few arguments from vnum 11601.
Mickey Mouse exclaims 'Thanks Ranglor!!!'

Whoops! Did you see my mistake?
I missed a space between the name and “qp” in reward. This is why we have 'wiznet bug' on! We can use a different style to make it a little easier to see the format:

reward(ch.name.." qp 1" )
say( "Thanks "..ch.name.."!!!" )
reward( ("%s qp 1"):format(ch.name) )
say( ("Thanks %s!!!"):format(ch.name) )
reward( string.format( "%s qp 1",ch.name) )
say( string.format( "Thanks %s!!!",ch.name) )
reward( "%s qp 1",ch.name )
say( "Thanks %s!!!",ch.name )

Preferred:

reward(ch, "qp", 1 )
say( "Thanks %s!!!",ch.name )

Note the 5 equivalent syntaxes above.

You give Mickey Mouse ears to Mickey Mouse.
You are rewarded 1 quest point!
Mickey Mouse exclaims 'Thanks Ranglor!!!'

Ok good, but what if we don't want the same character to get the reward over and over and over? Let's try this:

if ch.name==remembername then
    say( "Sorry %s, let somebody else try!",ch.name )
else
    reward(ch, "qp", 1)
    say( "Thanks %s!!!",ch.name)
    remembername=ch.name
end
give ear mick
You give Mickey Mouse ears to Mickey Mouse.
You are rewarded 1 quest point!
Mickey Mouse exclaims 'Thanks Ranglor!!!'

give ear mick
You give Mickey Mouse ears to Mickey Mouse.
Mickey Mouse exclaims 'Sorry Ranglor, let somebody else try!'

Okay, now Mickey will reward the player only if he isn't the last person who was rewarded.

But we have another problem to solve. What happens when Mickey's inventory gets full? We have a couple of options. We probably don't want to drop them or the players could just keep picking them up and giving them back over and over. In this case we can choose between CH:junk() or OBJ:destroy() to get rid of the item. OBJ:destroy() is convenient for us because the object is passed into the script as an OBJ named obj1.

if ch.name==remembername then
    say( "Sorry %s, let somebody else try!",ch.name )
else
    reward(ch, "qp", 1)
    say( "Thanks %s!!!",ch.name)
    remembername=ch.name
end
 
obj1:destroy()

So we're being kind of mean because we are destroying the object whether or not we reward the player. Maybe we'll be nice and give it back if they don't get the reward:

if ch.name==remembername then
    say( "Sorry %s, let somebody else try!",ch.name )
    mdo("give '%s' %s" ,obj1.name,ch.name)
    mdo("drop %s",obj1.name) -- Just in case the give didn't work somehow
else
    reward(ch, "qp", 1)
    say( "Thanks %s!!!",ch.name)
    remembername=ch.name
    obj1:destroy()
end

So we also try dropping it every time just in case the give doesn't work, but actually we can find out whether it worked or not based on its 'carriedby' property'!

if ch.name==remembername then
    say( "Sorry %s, let somebody else try!",ch.name )
    mdo( "give '%s' %s",obj1.name,ch.name )
    if obj1.carriedby==mob then -- It's still in mob's inventory!
        say("Hmmm, I couldn't give it back you...I'll just leave it here on the ground.")
        mdo("drop %s",obj1.name)
    end
else
    reward(ch, "qp", 1)
    say( "Thanks %s!!!",ch.name)
    remembername=ch.name
    obj1:destroy()
end

Note that for give, I ended up surrounding the obj1.name with single quotes. This is because the name is a list of keywords separated by spaces (as shown in oedit), so to be sent as a single argument they need to be in ''s.

lua/scripting/examples/mickeymouseears.txt · Last modified: 2015/09/25 14:54 by vodur