Discussion:
http://eqemulator.net/forums/showthread.php?t=26083
I think I have a simple change to the scribespells and new traindiscs quest commands that should get them working as I think most people would want them to be. These changes add an argument to the commands so that a level can be defined in the command in case the admin wants to restrict the spell/disc levels that are automatically scribed.
I think this should work for both of them, but I haven't tried it yet. I will give it a try and report back with if it works or not.
questmgr.cpp
Code:
void QuestManager::scribespells(int spell_level) {
//Cofruben:-Scribe spells for user up to his actual level.
int16 book_slot;
int16 curspell;
for(curspell = 0, book_slot = 0; curspell < SPDAT_RECORDS && book_slot < MAX_PP_SPELLBOOK; curspell++)
{
if
(
spells[curspell].classes[WARRIOR] != 0 &&
spells[curspell].classes[initiator->GetPP().class_-1] <= spell_level &&
spells[curspell].skill != 52
)
{
initiator->ScribeSpell(curspell, book_slot++);
}
}
}
void QuestManager::traindiscs(int disc_level) {
//Trevius: Train Disc for user up to their actual level.
int16 book_slot;
int16 curspell;
for(curspell = 0, book_slot = 0; curspell < SPDAT_RECORDS && book_slot < MAX_PP_SPELLBOOK; curspell++)
{
if
(
spells[curspell].classes[WARRIOR] != 0 &&
spells[curspell].classes[initiator->GetPP().class_-1] <= disc_level &&
spells[curspell].skill != 52
)
{
if(IsDiscipline(curspell)){
for(int r = 0; r < MAX_PP_DISCIPLINES; r++) {
if(initiator->GetPP().disciplines.values[r] == curspell) {
initiator->Message(13, "You already know this discipline.");
r = MAX_PP_DISCIPLINES;
} else if(initiator->GetPP().disciplines.values[r] == 0) {
initiator->GetPP().disciplines.values[r] = curspell;
initiator->SendDisciplineUpdate();
initiator->Message(0, "You have learned a new discipline!");
r = MAX_PP_DISCIPLINES;
}
}
}
}
}
}
questmgr.h
Code:
void scribespells(int spell_level);
void traindiscs(int disc_level);
perlparser.cpp
Code:
XS(XS__scribespells);
XS(XS__scribespells)
{
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: scribespells(spell_level)");
int spell_level = (int)SvIV(ST(0));
quest_manager.scribespells(spell_level);
XSRETURN_EMPTY;
}
XS(XS__traindiscs);
XS(XS__traindiscs)
{
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: traindiscs(disc_level)");
int disc_level = (int)SvIV(ST(0));
quest_manager.traindiscs(disc_level);
XSRETURN_EMPTY;
}
newXS(strcpy(buf, "scribespells"), XS__scribespells, file);
newXS(strcpy(buf, "traindiscs"), XS__traindiscs, file);
parser.cpp
Code:
else if (!strcmp(command,"scribespells")) {
quest_manager.scribespells(atoi(arglist[0]));
}
else if (!strcmp(command,"traindiscs")) {
quest_manager.traindiscs(atoi(arglist[0]));
}
These changes would require that any server using them has to change their spell scriber quests a little. This is only a minor change and should be easy for almost every server, since most only have 1 or a few spell scribers. For anyone who wants this to work as it currently does, they can simply use this in the place of the current command:
Code:
quest::scribespells($ulevel);
#OR
quest::traindiscs($ulevel);
But the nice thing about this feature is that spell scribing can be limited with it. So, maybe you want your players to be able to scribe all of their spells up to level 50 to make leveling easier, but you want them to actually collect and manually scribe all spells over level 50. You can do that easily with this. I am already coming up with some neat ideas to make using a spell sciber more interesting with this new feature. Maybe adding a spell scriber at the end of a dungeon so players have to clear to it to get their higher level spells. Or, maybe scribing higher level spells after a quest is completed. It really opens up some cool options and brings some of the fun back into getting new spells without necessarily bringing the horrid job of having to research on the web about each spell and find them or buy them all.
I will test this out and report back if it works as intended. But, as far as I can tell, this looks like good code to me.
And an optional change that I figured might as well get put in that isn't related to this new quest command is this (Changes are marked in
RED):
command.cpp
Code:
void command_traindisc(Client *c, const Seperator *sep)
{
int level;
int16 book_slot;
int16 curspell;
Client *t=c;
if(c->GetTarget() && c->GetTarget()->IsClient() && c->GetGM())
t=c->GetTarget()->CastToClient();
if(!sep->arg[1][0])
{
c->Message(0, "FORMAT: #traindisc <level>");
return;
}
level = atoi(sep->arg[1]);
if(level < 1) //used to be: if(level < 1 || level > 70)
{
c->Message(0, "ERROR: Enter a level greater than 1."); //used to be: "ERROR: Enter a level between 1 and 70 inclusive."
return;
}
This extra change is mainly so that it matches the scribespell command. I see no reason to limit the argument to level 70 as it was previously. Not a big deal either way, but it wouldn't hurt.