I have made a few more tests with the following quest script. It is a bit long but it prints the variables at the start and end of the script :
Code:
my $LevelItemId = 1038; # Tattered Cloth Sandal
my $DefaultMaxLevel = 70;
sub EVENT_SAY
{ if(defined($maxxx_level))
{ print "maxxx_level($name) begin = $maxxx_level"; }
else
{ print "maxxx_level($name) begin is not defined"; }
if(defined($qglobals{maxxx_level}))
{ print "qglobals{maxxx_level}($name) begin = $qglobals{maxxx_level}"; }
else
{ print "qglobals{maxxx_level}($name) begin is not defined"; }
if(($text=~/65/i) && ($ulevel >= 70))
{ quest::say("Remember, DO NOT lose that trinket ! Welcome to level 65 !");
quest::summonitem(1038);
quest::level(65);
}
if($text=~/make me a newb/i)
{ quest::say("Arrr Arrr Arrr, my pleasure !");
quest::level(1);
quest::delglobal("maxxx_level"); undef($qglobals{maxxx_level});
}
if($text=~/make me level 73/i)
{ quest::say("OK, you're the boss after all *sigh*");
quest::level(73);
quest::setglobal("maxxx_level", 73, 5, "F"); $qglobals{maxxx_level} = 73;
}
if($text=~/make me level 75/i)
{ quest::say("OK, you're the boss after all *sigh*");
quest::level(75);
quest::setglobal("maxxx_level", 75, 5, "F"); $qglobals{maxxx_level} = 75;
}
if(defined($maxxx_level))
{ print "maxxx_level($name) end = $maxxx_level"; }
else
{ print "maxxx_level($name) end is not defined"; }
if(defined($qglobals{maxxx_level}))
{ print "qglobals{maxxx_level}($name) end = $qglobals{maxxx_level}"; }
else
{ print "qglobals{maxxx_level}($name) end is not defined"; }
}
sub EVENT_ITEM
{ if(defined($maxxx_level))
{ print "maxxx_level($name) begin = $maxxx_level"; }
else
{ print "maxxx_level($name) begin is not defined"; }
if(defined($qglobals{maxxx_level}))
{ print "qglobals{maxxx_level}($name) begin = $qglobals{maxxx_level}"; }
else
{ print "qglobals{maxxx_level}($name) begin is not defined"; }
if(plugin::check_handin(\%itemcount, $LevelItemId => 1))
{ if(defined($qglobals{maxxx_level}))
{ quest::say("Welcome back to level $qglobals{maxxx_level}, $name");
quest::level($qglobals{maxxx_level});
}
else
{ quest::say("Welcome back to level $DefaultMaxLevel, $name");
quest::level($DefaultMaxLevel);
}
}
else
{ plugin::return_items(\%itemcount);
quest::say("I have no use for this item, $name. Take it back.");
}
if(defined($maxxx_level))
{ print "maxxx_level($name) end = $maxxx_level"; }
else
{ print "maxxx_level($name) end is not defined"; }
if(defined($qglobals{maxxx_level}))
{ print "qglobals{maxxx_level}($name) end = $qglobals{maxxx_level}"; }
else
{ print "qglobals{maxxx_level}($name) end is not defined"; }
}
I have removed some level choices for simplicity.
Currently quest::...global do not update the $qglobals map to keep it in sync with DB changes done in the script so you have to update $qglobals explicitly.
As it is the script works fine : it updates the DB globals with quest::...global, and at the same time updates the $qglobals map for consistency, to keep them in sync.
If you code this way you can even re-read the $qglobals in the same sub, and it is consistent with what has been entered in the DB. It could be a nice "coding rule" for script writing. Best would be if the Emu server did that synchronization in quest::...global itself, I will have to look into that.