Svanhild
New member
I'm having problems with 2 npcs using input. It seems like, it's not outputing the right variable/characters inputted. For the case of build manager, the last letter is missing, so if you're gonna input hello, it will show hell, and if you will input a single letter, it shows blank.
Im using the build manager sccript by Cretino
//===== Hercules Script ======================================
//= Build Manager
//===== By: ==================================================
//= Cretino
//= kerbiii (Found a bug.)
//===== Current Version: =====================================
//= 1.0b (Added option to check max level of base and job (Can be disabled))
//===== Description: =========================================
//= Saves and loads build saved by the player. (Stats and/or Skills)
//===== Additional Comments: =================================
//= 1.0 Initial version [Cretino]
// TODO: Need revise all script with comments for spelling errors.
// Little improvement applied [Cretino]
// Fixed typo error in variable '.load_status_cost' (Thanks to [kerbiii]:[Hercules])
// Added option to check max level of base and job (Can be disabled) [Cretino]
//============================================================
prontera,210,196,6 script Build Manager 4_M_MINSTREL,{
function check_skills;
.@npc_name$ = " ";
PROFILE_START_MENU:
mes .@npc_name$;
if (.check_max_lv == true)
{
if (NextJobExp > 0 || BaseLevel < MAX_LEVEL)
{
mes "Sorry ^FF0000" + strcharinfo(0) + "^000000,";
mes "but you need reach the max level of Base and Job to use my services.";
close;
}
}
mes "Hey ^FF0000" + strcharinfo(0) + "^000000, what do you want?";
.@selected = select("Skills profile:Stats profile:Cancel");
switch(.@selected)
{
next;
case 1:
if (BaseClass == Job_Novice)
{
.@eac = eaclass();
if ((.@eac&EAJ_UPPERMASK) != EAJ_SUPER_NOVICE)
{
mes .@npc_name$;
mes "Sorry ^FF0000" + strcharinfo(0) + "^000000, but ^FF0000" + jobname(Class) + "^000000 can't use skills profile.";
close;
}
}
goto PROFILE_SKILLS_MAIN;
break;
case 2:
goto PROFILE_STATS_MAIN;
break;
case 3:
mes .@npc_name$;
mes "Come back whenever you need me!";
close;
break;
}
PROFILE_SKILLS_MAIN:
mes .@npc_name$;
mes "What do you want?";
.@selected = select("Create new skills profile:See my skills profiles:Reset my skills:Back");
switch(.@selected)
{
next;
case 1:
mes .@npc_name$;
getskilllist;
if (@skilllist_count == 0)
{
mes "Sorry ^FF0000" + strcharinfo(0) + "^000000, but you don't have any skill to create a skills profile.";
close;
}
mes "Input the skills profile name:";
input .@profile_name$;
next;
.@profile_name$ = replacestr(.@profile_name$, ":", "");
if (.@profile_name$ == "" || compare(.@profile_name$, ":"))
{
mes .@npc_name$;
mes "Invalid skills profile name.";
mes "^FF0000" + .@profile_name$ + "^000000";
next;
goto PROFILE_SKILLS_MAIN;
}
for(.@i = 0; .@i < @skilllist_count; .@i++)
{
if ((check_skills(@skilllist_id[.@i]) == true) || (@skilllist_lv[.@i] <= 0) || (@skilllist_id[.@i] <= 0))
continue;
if (@skilllist_flag[.@i] == 0)
{
.@skilllist_id[.@i] = @skilllist_id[.@i];
.@skilllist_lv[.@i] = @skilllist_lv[.@i];
}
}
.@size = getarraysize(.@skilllist_id);
mes .@npc_name$;
if (.@size != 0)
{
if (Zeny - .create_skills_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_skills_cost, 3, ".") + "^000000z to create your skills profile.";
close;
}
mes "Skills profile: ^FF0000" + .@profile_name$ + "^000000";
Zeny -= .create_skills_cost;
.@pos = getarraysize(#skills_profile);
#skills_profile[.@pos] = ++#skills_profile_count; // '#skills_profile_count' is used only to generate unique profile id.
.@var_name$ = "#skilllist_" + #skills_profile[.@pos];
setd .@var_name$ + "_name$", .@profile_name$;
setd .@var_name$ + "_count", .@size;
setd .@var_name$ + "_class", Class;
setd .@var_name$ + "_cost", skillpointcount() - SkillPoint;
for(.@i = 0; .@i < .@size; .@i++)
{
setd .@var_name$ + "_lv" + "[" + .@i + "]", .@skilllist_lv[.@i];
setd .@var_name$ + "_id" + "[" + .@i + "]", .@skilllist_id[.@i];
}
resetskill;
deletearray .@skilllist_id;
deletearray .@skilllist_lv;
last_skills_profile = 0;
mes " ";
mes "Your skills profile have been created.";
}
else
mes "You don't have any skill to create a skills profile.";
next;
goto PROFILE_SKILLS_MAIN;
break;
case 2:
mes .@npc_name$;
if (getarraysize(#skills_profile) != 0)
{
PROFILE_SKILLS_SELECT:
mes "Choose your skills profile:";
.@menu$ = "";
if (getarraysize(#skills_profile) > .freeloop_size_active)
.@free = freeloop(true);
for(.@i = 0; .@i < getarraysize(#skills_profile); .@i++)
{
.@menu$ += "^FF0000" + getd("#skilllist_" + #skills_profile[.@i] + "_name$") + "^000000" + ":";
if (.@i + 1 == getarraysize(#skills_profile))
.@menu$ += "Back";
}
if (.@free == true)
.@free = freeloop(false);
.@selected = select(.@menu$);
if (.@selected == getarraysize(#skills_profile) + 1)
{
next;
goto PROFILE_SKILLS_MAIN;
}
.@profile_id = (.@selected - 1);
.@var_name$ = "#skilllist_" + #skills_profile[.@profile_id];
next;
PROFILE_SKILLS_INFO:
mes .@npc_name$;
mes "What do you want?";
mes " ";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
.@selected = select("Load
elete:Back");
switch(.@selected)
{
next;
mes .@npc_name$;
case 1:
if (getd(.@var_name$ + "_class") != Class)
{
mes "You can't load a skills profile of ^FF0000" + jobname(getd(.@var_name$ + "_class")) + "^000000, because you are ^FF0000" + jobname(Class) + "^000000.";
next;
mes .@npc_name$;
goto PROFILE_SKILLS_SELECT;
}
if (Zeny - .load_skills_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_skills_cost, 3, ".") + "^000000z to load your skills profile.";
close;
}
if (last_skills_profile != #skills_profile[.@profile_id])
resetskill;
else
{
mes "You're already using this profile.";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
next;
goto PROFILE_SKILLS_INFO;
}
if (SkillPoint - getd(.@var_name$ + "_cost") >= 0)
{
mes "Loading skills profile...";
mes "This may take awhile.";
SkillPoint -= getd(.@var_name$ + "_cost");
Zeny -= .load_skills_cost;
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
{
if ((getd(.@var_name$ + "_id" + "[" + .@i + "]") <= 0) || (getd(.@var_name$ + "_lv" + "[" + .@i + "]") <= 0))
continue;
if (getd(.@var_name$ + "_id" + "[" + .@i + "]") == RK_HUNDREDSPEAR)
{
// NOTE: Have any bug in skill 'Hundred Spear'. (ID: RK_HUNDREDSPEAR)
mes " ";
mes "Failed to load:";
mes "^FF0000Hundred Spear^000000 Lv: ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000";
mes "You get back ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000 skill points.";
SkillPoint += getd(.@var_name$ + "_lv" + "[" + .@i + "]");
}
else
skill getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_lv" + "[" + .@i + "]"), 0;
}
mes " ";
mes "Your skills profile have been loaded.";
last_skills_profile = #skills_profile[.@profile_id];
}
else
{
mes "You don't have sufficient skill points to load your skills profile.";
mes "You need more ^FF0000" + (getd(.@var_name$ + "_cost") - SkillPoint) + "^000000 skill points.";
if (last_skills_profile != 0)
{
next;
mes .@npc_name$;
mes "Going back to the previous skills profile.";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
resetskill;
.@var_name$ = "#skilllist_" + last_skills_profile;
if (SkillPoint - getd(.@var_name$ + "_cost") >= 0)
{
SkillPoint -= getd(.@var_name$ + "_cost");
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
{
if ((getd(.@var_name$ + "_id" + "[" + .@i + "]") <= 0) || (getd(.@var_name$ + "_lv" + "[" + .@i + "]") <= 0))
continue;
if (getd(.@var_name$ + "_id" + "[" + .@i + "]") == RK_HUNDREDSPEAR)
{
// NOTE: Have any bug in skill 'Hundred Spear'. (ID: RK_HUNDREDSPEAR)
mes " ";
mes "Failed to load:";
mes "^FF0000Hundred Spear^000000 Lv: ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000";
mes "You get back ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000 skill points.";
SkillPoint += getd(.@var_name$ + "_lv" + "[" + .@i + "]");
}
else
skill getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_lv" + "[" + .@i + "]"), 0;
}
}
else
{
next;
mes .@npc_name$;
mes "Fail to back to the previous skills profile.";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
last_skills_profile = 0;
}
}
}
next;
goto PROFILE_SKILLS_INFO;
break;
case 2:
mes "You sure you want to delete the skills profile?";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
if (select("No:Yes") == 1)
{
next;
goto PROFILE_SKILLS_INFO;
}
next;
mes .@npc_name$;
mes "Skills profile ^FF0000" + getd(.@var_name$ + "_name$") + "^000000 deleted.";
if (last_skills_profile == #skills_profile[.@profile_id])
last_skills_profile = 0;
setd .@var_name$ + "_count", 0;
setd .@var_name$ + "_cost", 0;
setd .@var_name$ + "_class", 0;
setd .@var_name$ + "_name$", "";
deletearray getd(.@var_name$ + "_lv");
deletearray getd(.@var_name$ + "_id");
deletearray #skills_profile[.@profile_id], 1;
next;
if (getarraysize(#skills_profile) != 0)
{
mes .@npc_name$;
goto PROFILE_SKILLS_SELECT;
}
else
goto PROFILE_SKILLS_MAIN;
break;
case 3:
goto PROFILE_SKILLS_SELECT;
break;
}
}
else
mes "You don't have any skills profile.";
next;
goto PROFILE_SKILLS_MAIN;
break;
case 3:
mes .@npc_name$;
if (Zeny - .reset_skills_cost >= 0)
{
Zeny -= .reset_skills_cost;
last_skills_profile = 0;
resetskill;
mes "Your skills have been reset.";
}
else
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .reset_skills_cost, 3, ".") + "^000000z to reset your skills.";
close;
break;
case 4:
goto PROFILE_START_MENU;
break;
}
PROFILE_STATS_MAIN:
mes .@npc_name$;
mes "What do you want?";
.@selected = select("Create new stats profile:See my stats profiles:Reset my stats:Back");
switch(.@selected)
{
next;
case 1:
mes .@npc_name$;
if (Zeny - .create_status_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_status_cost, 3, ".") + "^000000z to create your stats profile.";
close;
}
mes "Input the stats profile name:";
input .@profile_name$;
next;
.@profile_name$ = replacestr(.@profile_name$, ":", "");
if (.@profile_name$ == "" || compare(.@profile_name$, ":"))
{
mes .@npc_name$;
mes "Invalid stats profile name.";
mes "^FF0000" + .@profile_name$ + "^000000";
next;
goto PROFILE_STATS_MAIN;
}
.@last_status = StatusPoint;
for(.@i = bStr; .@i < (bLuk + 1); .@i++)
{
.@value = readparam(.@i);
if (.@value > 1)
{
.@statslist_value[.@j] = .@value - 1;
.@statslist_id[.@j] = .@i;
.@j++;
}
}
mes .@npc_name$;
if (.@j != 0)
{
mes "Stats profile: ^FF0000" + .@profile_name$ + "^000000";
mes "Stats:";
Zeny -= .create_status_cost;
resetstatus;
.@pos = getarraysize(#stats_profile);
#stats_profile[.@pos] = ++#stats_profile_count; // '#stats_profile_count' is used only to generate unique profile id.
.@var_name$ = "#statslist_" + #stats_profile[.@pos];
setd .@var_name$ + "_name$", .@profile_name$;
setd .@var_name$ + "_count", .@j;
setd .@var_name$ + "_cost", StatusPoint - .@last_status;
for(.@i = 0; .@i < .@j; .@i++)
{
setd .@var_name$ + "_value" + "[" + .@i + "]", .@statslist_value[.@i];
setd .@var_name$ + "_id" + "[" + .@i + "]", .@statslist_id[.@i];
mes "^00FF00" + .stats_name$[(.@statslist_id[.@i] - bStr)] + "^000000 = ^0000FF" + .@statslist_value[.@i] + "^000000";
}
.@j = 0;
deletearray .@statslist_value;
deletearray .@statslist_id;
last_stats_profile = 0;
mes " ";
mes "Your stats profile have been created.";
}
else
mes "You don't have any spending points in stats to create your stats profile.";
next;
goto PROFILE_STATS_MAIN;
break;
case 2:
mes .@npc_name$;
if (getarraysize(#stats_profile) != 0)
{
PROFILE_STATS_SELECT:
mes "Choose your stats profile:";
.@menu$ = "";
if (getarraysize(#stats_profile) > .freeloop_size_active)
.@free = freeloop(true);
for(.@i = 0; .@i < getarraysize(#stats_profile); .@i++)
{
.@menu$ += "^FF0000" + getd("#statslist_" + #stats_profile[.@i] + "_name$") + "^000000" + ":";
if (.@i + 1 == getarraysize(#stats_profile))
.@menu$ += "Back";
}
if (.@free == true)
.@free = freeloop(false);
.@selected = select(.@menu$);
if (.@selected == getarraysize(#stats_profile) + 1)
{
next;
goto PROFILE_STATS_MAIN;
}
.@profile_id = (.@selected - 1);
.@var_name$ = "#statslist_" + #stats_profile[.@profile_id];
next;
PROFILE_STATS_INFO:
mes .@npc_name$;
mes "What do you want?";
mes " ";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
mes "Stats:";
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
mes "^00FF00" + .stats_name$[(getd(.@var_name$ + "_id" + "[" + .@i + "]") - bStr)] + "^000000 = ^0000FF" + getd(.@var_name$ + "_value" + "[" + .@i + "]") + "^000000";
.@selected = select("Load
elete:Back");
switch(.@selected)
{
next;
mes .@npc_name$;
case 1:
if (Zeny - .load_status_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_skills_cost, 3, ".") + "^000000z to load your stats profile.";
close;
}
if (last_stats_profile != #stats_profile[.@profile_id])
resetstatus;
else
{
mes "You're already using this stats profile.";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
next;
goto PROFILE_STATS_INFO;
}
if (StatusPoint - getd(.@var_name$ + "_cost") >= 0)
{
mes "Loading stats profile...";
mes "This may take awhile.";
Zeny -= .load_status_cost;
StatusPoint -= getd(.@var_name$ + "_cost");
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
{
mes "^00FF00" + .stats_name$[(getd(.@var_name$ + "_id" + "[" + .@i + "]") - bStr)] + "^000000 = ^0000FF" + getd(.@var_name$ + "_value" + "[" + .@i + "]") + "^000000";
statusup2 getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_value" + "[" + .@i + "]");
}
mes " ";
mes "Your stats profile have been loaded.";
last_stats_profile = #stats_profile[.@profile_id];
}
else
{
mes "You don't have sufficient stats points to load your stats profile.";
mes "You need more ^FF0000" + (getd(.@var_name$ + "_cost") - StatusPoint) + "^000000 stats points.";
if (last_stats_profile != 0)
{
next;
mes .@npc_name$;
mes "Going back to the previous stats profile.";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
resetstatus;
.@var_name$ = "#statslist_" + last_stats_profile;
if (StatusPoint - getd(.@var_name$ + "_cost") >= 0)
{
StatusPoint -= getd(.@var_name$ + "_cost");
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
statusup2 getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_value" + "[" + .@i + "]");
}
else
{
next;
mes .@npc_name$;
mes "Fail to back to the previous stats profile.";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
last_stats_profile = 0;
}
}
}
next;
goto PROFILE_STATS_INFO;
break;
case 2:
mes "You sure you want to delete the stats profile?";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
if (select("No:Yes") == 1)
{
next;
goto PROFILE_STATS_INFO;
}
next;
mes .@npc_name$;
mes "Stats profile ^FF0000" + getd(.@var_name$ + "_name$") + "^000000 deleted.";
if (last_stats_profile == #stats_profile[.@profile_id])
last_stats_profile = 0;
setd .@var_name$ + "_count", 0;
setd .@var_name$ + "_cost", 0;
setd .@var_name$ + "_name$", "";
deletearray getd(.@var_name$ + "_value");
deletearray getd(.@var_name$ + "_id");
deletearray #stats_profile[.@profile_id], 1;
next;
if (getarraysize(#stats_profile) != 0)
{
mes .@npc_name$;
goto PROFILE_STATS_SELECT;
}
else
goto PROFILE_STATS_MAIN;
break;
case 3:
goto PROFILE_STATS_SELECT;
break;
}
}
else
mes "You don't have any stats profile.";
next;
goto PROFILE_STATS_MAIN;
break;
case 3:
mes .@npc_name$;
if (Zeny - .reset_status_cost >= 0)
{
Zeny -= .reset_status_cost;
last_stats_profile = 0;
resetstatus;
mes "Your stats have been reset.";
}
else
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .reset_status_cost, 3, ".") + "^000000z to reset your stats.";
close;
break;
case 4:
goto PROFILE_START_MENU;
break;
}
OnInit:
// Cost to reset player stats
.reset_status_cost = 0;
// Cost to reset player skills
.reset_skills_cost = 0;
// Cost to create a new stats profile
.create_status_cost = .reset_status_cost * 2;
// Cost to create a new skills profile
.create_skills_cost = .reset_skills_cost * 2;
// Cost to load a stats profile
.load_status_cost = .reset_status_cost * 2;
// Cost to load a skills profile
.load_skills_cost = .reset_skills_cost * 2;
// Will check if player have max base level and job level to access the npc. (Max Level = 'MAX_LEVEL' constant)
// false = Disabled
.check_max_lv = false;
// ONLY CHANGE IF YOU KNOW WHAT YOU'RE DOING !!
setarray .stats_name$[0], "Str", "Agi", "Vit", "Int", "Dex", "Luk";
.freeloop_size_active = 128;
end;
function check_skills {
if (getarg(0) == NV_FIRSTAID || getarg(0) == NV_BASIC)
return true;
if (BaseClass == Job_Swordman)
{
if (getarg(0) == SM_MOVINGRECOVERY || getarg(0) == SM_FATALBLOW || getarg(0) == SM_AUTOBERSERK)
return true;
}
else if (BaseClass == Job_Mage)
{
if (getarg(0) == MG_ENERGYCOAT)
return true;
}
else if (BaseClass == Job_Archer)
{
if (getarg(0) == AC_MAKINGARROW || getarg(0) == AC_CHARGEARROW)
return true;
}
else if (BaseClass == Job_Acolyte)
{
if (getarg(0) == AL_HOLYLIGHT)
return true;
}
else if (BaseClass == Job_Merchant)
{
if (getarg(0) == MC_CARTREVOLUTION || getarg(0) == MC_CHANGECART || getarg(0) == MC_LOUD)
return true;
}
else if (BaseClass == Job_Thief)
{
if (getarg(0) == TF_SPRINKLESAND || getarg(0) == TF_BACKSLIDING || getarg(0) == TF_PICKSTONE || getarg(0) == TF_THROWSTONE)
return true;
}
if (BaseJob == Job_Knight)
{
if (getarg(0) == KN_CHARGEATK)
return true;
}
else if (BaseJob == Job_Priest)
{
if (getarg(0) == PR_REDEMPTIO)
return true;
}
else if (BaseJob == Job_Wizard)
{
if (getarg(0) == WZ_SIGHTBLASTER)
return true;
}
else if (BaseJob == Job_Blacksmith)
{
if (getarg(0) == BS_UNFAIRLYTRICK || getarg(0) == BS_GREED)
return true;
}
else if (BaseJob == Job_Hunter)
{
if (getarg(0) == HT_PHANTASMIC)
return true;
}
else if (BaseJob == Job_Assassin)
{
if (getarg(0) == AS_SONICACCEL || getarg(0) == AS_VENOMKNIFE)
return true;
}
else if (BaseJob == Job_Crusader)
{
if (getarg(0) == CR_SHRINK)
return true;
}
else if (BaseJob == Job_Monk)
{
if (getarg(0) == MO_KITRANSLATION || getarg(0) == MO_BALKYOUNG)
return true;
}
else if (BaseJob == Job_Sage)
{
if (getarg(0) == SA_ELEMENTWIND || getarg(0) == SA_CREATECON || getarg(0) == SA_ELEMENTWATER
|| getarg(0) == SA_ELEMENTGROUND || getarg(0) == SA_ELEMENTFIRE)
return true;
}
else if (BaseJob == Job_Rogue)
{
if (getarg(0) == RG_CLOSECONFINE)
return true;
}
else if (BaseJob == Job_Alchemist)
{
if (getarg(0) == AM_BIOETHICS)
return true;
}
else if (BaseJob == Job_Bard)
{
if (getarg(0) == BA_PANGVOICE)
return true;
}
else if (BaseJob == Job_Dancer)
{
if (getarg(0) == DC_WINKCHARM)
return true;
}
return false;
}
}
And also, this thing doesn't work too, can someone correct this? Thanks!
Im using the build manager sccript by Cretino
//===== Hercules Script ======================================
//= Build Manager
//===== By: ==================================================
//= Cretino
//= kerbiii (Found a bug.)
//===== Current Version: =====================================
//= 1.0b (Added option to check max level of base and job (Can be disabled))
//===== Description: =========================================
//= Saves and loads build saved by the player. (Stats and/or Skills)
//===== Additional Comments: =================================
//= 1.0 Initial version [Cretino]
// TODO: Need revise all script with comments for spelling errors.
// Little improvement applied [Cretino]
// Fixed typo error in variable '.load_status_cost' (Thanks to [kerbiii]:[Hercules])
// Added option to check max level of base and job (Can be disabled) [Cretino]
//============================================================
prontera,210,196,6 script Build Manager 4_M_MINSTREL,{
function check_skills;
.@npc_name$ = " ";
PROFILE_START_MENU:
mes .@npc_name$;
if (.check_max_lv == true)
{
if (NextJobExp > 0 || BaseLevel < MAX_LEVEL)
{
mes "Sorry ^FF0000" + strcharinfo(0) + "^000000,";
mes "but you need reach the max level of Base and Job to use my services.";
close;
}
}
mes "Hey ^FF0000" + strcharinfo(0) + "^000000, what do you want?";
.@selected = select("Skills profile:Stats profile:Cancel");
switch(.@selected)
{
next;
case 1:
if (BaseClass == Job_Novice)
{
.@eac = eaclass();
if ((.@eac&EAJ_UPPERMASK) != EAJ_SUPER_NOVICE)
{
mes .@npc_name$;
mes "Sorry ^FF0000" + strcharinfo(0) + "^000000, but ^FF0000" + jobname(Class) + "^000000 can't use skills profile.";
close;
}
}
goto PROFILE_SKILLS_MAIN;
break;
case 2:
goto PROFILE_STATS_MAIN;
break;
case 3:
mes .@npc_name$;
mes "Come back whenever you need me!";
close;
break;
}
PROFILE_SKILLS_MAIN:
mes .@npc_name$;
mes "What do you want?";
.@selected = select("Create new skills profile:See my skills profiles:Reset my skills:Back");
switch(.@selected)
{
next;
case 1:
mes .@npc_name$;
getskilllist;
if (@skilllist_count == 0)
{
mes "Sorry ^FF0000" + strcharinfo(0) + "^000000, but you don't have any skill to create a skills profile.";
close;
}
mes "Input the skills profile name:";
input .@profile_name$;
next;
.@profile_name$ = replacestr(.@profile_name$, ":", "");
if (.@profile_name$ == "" || compare(.@profile_name$, ":"))
{
mes .@npc_name$;
mes "Invalid skills profile name.";
mes "^FF0000" + .@profile_name$ + "^000000";
next;
goto PROFILE_SKILLS_MAIN;
}
for(.@i = 0; .@i < @skilllist_count; .@i++)
{
if ((check_skills(@skilllist_id[.@i]) == true) || (@skilllist_lv[.@i] <= 0) || (@skilllist_id[.@i] <= 0))
continue;
if (@skilllist_flag[.@i] == 0)
{
.@skilllist_id[.@i] = @skilllist_id[.@i];
.@skilllist_lv[.@i] = @skilllist_lv[.@i];
}
}
.@size = getarraysize(.@skilllist_id);
mes .@npc_name$;
if (.@size != 0)
{
if (Zeny - .create_skills_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_skills_cost, 3, ".") + "^000000z to create your skills profile.";
close;
}
mes "Skills profile: ^FF0000" + .@profile_name$ + "^000000";
Zeny -= .create_skills_cost;
.@pos = getarraysize(#skills_profile);
#skills_profile[.@pos] = ++#skills_profile_count; // '#skills_profile_count' is used only to generate unique profile id.
.@var_name$ = "#skilllist_" + #skills_profile[.@pos];
setd .@var_name$ + "_name$", .@profile_name$;
setd .@var_name$ + "_count", .@size;
setd .@var_name$ + "_class", Class;
setd .@var_name$ + "_cost", skillpointcount() - SkillPoint;
for(.@i = 0; .@i < .@size; .@i++)
{
setd .@var_name$ + "_lv" + "[" + .@i + "]", .@skilllist_lv[.@i];
setd .@var_name$ + "_id" + "[" + .@i + "]", .@skilllist_id[.@i];
}
resetskill;
deletearray .@skilllist_id;
deletearray .@skilllist_lv;
last_skills_profile = 0;
mes " ";
mes "Your skills profile have been created.";
}
else
mes "You don't have any skill to create a skills profile.";
next;
goto PROFILE_SKILLS_MAIN;
break;
case 2:
mes .@npc_name$;
if (getarraysize(#skills_profile) != 0)
{
PROFILE_SKILLS_SELECT:
mes "Choose your skills profile:";
.@menu$ = "";
if (getarraysize(#skills_profile) > .freeloop_size_active)
.@free = freeloop(true);
for(.@i = 0; .@i < getarraysize(#skills_profile); .@i++)
{
.@menu$ += "^FF0000" + getd("#skilllist_" + #skills_profile[.@i] + "_name$") + "^000000" + ":";
if (.@i + 1 == getarraysize(#skills_profile))
.@menu$ += "Back";
}
if (.@free == true)
.@free = freeloop(false);
.@selected = select(.@menu$);
if (.@selected == getarraysize(#skills_profile) + 1)
{
next;
goto PROFILE_SKILLS_MAIN;
}
.@profile_id = (.@selected - 1);
.@var_name$ = "#skilllist_" + #skills_profile[.@profile_id];
next;
PROFILE_SKILLS_INFO:
mes .@npc_name$;
mes "What do you want?";
mes " ";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
.@selected = select("Load
switch(.@selected)
{
next;
mes .@npc_name$;
case 1:
if (getd(.@var_name$ + "_class") != Class)
{
mes "You can't load a skills profile of ^FF0000" + jobname(getd(.@var_name$ + "_class")) + "^000000, because you are ^FF0000" + jobname(Class) + "^000000.";
next;
mes .@npc_name$;
goto PROFILE_SKILLS_SELECT;
}
if (Zeny - .load_skills_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_skills_cost, 3, ".") + "^000000z to load your skills profile.";
close;
}
if (last_skills_profile != #skills_profile[.@profile_id])
resetskill;
else
{
mes "You're already using this profile.";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
next;
goto PROFILE_SKILLS_INFO;
}
if (SkillPoint - getd(.@var_name$ + "_cost") >= 0)
{
mes "Loading skills profile...";
mes "This may take awhile.";
SkillPoint -= getd(.@var_name$ + "_cost");
Zeny -= .load_skills_cost;
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
{
if ((getd(.@var_name$ + "_id" + "[" + .@i + "]") <= 0) || (getd(.@var_name$ + "_lv" + "[" + .@i + "]") <= 0))
continue;
if (getd(.@var_name$ + "_id" + "[" + .@i + "]") == RK_HUNDREDSPEAR)
{
// NOTE: Have any bug in skill 'Hundred Spear'. (ID: RK_HUNDREDSPEAR)
mes " ";
mes "Failed to load:";
mes "^FF0000Hundred Spear^000000 Lv: ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000";
mes "You get back ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000 skill points.";
SkillPoint += getd(.@var_name$ + "_lv" + "[" + .@i + "]");
}
else
skill getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_lv" + "[" + .@i + "]"), 0;
}
mes " ";
mes "Your skills profile have been loaded.";
last_skills_profile = #skills_profile[.@profile_id];
}
else
{
mes "You don't have sufficient skill points to load your skills profile.";
mes "You need more ^FF0000" + (getd(.@var_name$ + "_cost") - SkillPoint) + "^000000 skill points.";
if (last_skills_profile != 0)
{
next;
mes .@npc_name$;
mes "Going back to the previous skills profile.";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
resetskill;
.@var_name$ = "#skilllist_" + last_skills_profile;
if (SkillPoint - getd(.@var_name$ + "_cost") >= 0)
{
SkillPoint -= getd(.@var_name$ + "_cost");
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
{
if ((getd(.@var_name$ + "_id" + "[" + .@i + "]") <= 0) || (getd(.@var_name$ + "_lv" + "[" + .@i + "]") <= 0))
continue;
if (getd(.@var_name$ + "_id" + "[" + .@i + "]") == RK_HUNDREDSPEAR)
{
// NOTE: Have any bug in skill 'Hundred Spear'. (ID: RK_HUNDREDSPEAR)
mes " ";
mes "Failed to load:";
mes "^FF0000Hundred Spear^000000 Lv: ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000";
mes "You get back ^FF0000" + getd(.@var_name$ + "_lv" + "[" + .@i + "]") + "^000000 skill points.";
SkillPoint += getd(.@var_name$ + "_lv" + "[" + .@i + "]");
}
else
skill getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_lv" + "[" + .@i + "]"), 0;
}
}
else
{
next;
mes .@npc_name$;
mes "Fail to back to the previous skills profile.";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
last_skills_profile = 0;
}
}
}
next;
goto PROFILE_SKILLS_INFO;
break;
case 2:
mes "You sure you want to delete the skills profile?";
mes "Skills profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
if (select("No:Yes") == 1)
{
next;
goto PROFILE_SKILLS_INFO;
}
next;
mes .@npc_name$;
mes "Skills profile ^FF0000" + getd(.@var_name$ + "_name$") + "^000000 deleted.";
if (last_skills_profile == #skills_profile[.@profile_id])
last_skills_profile = 0;
setd .@var_name$ + "_count", 0;
setd .@var_name$ + "_cost", 0;
setd .@var_name$ + "_class", 0;
setd .@var_name$ + "_name$", "";
deletearray getd(.@var_name$ + "_lv");
deletearray getd(.@var_name$ + "_id");
deletearray #skills_profile[.@profile_id], 1;
next;
if (getarraysize(#skills_profile) != 0)
{
mes .@npc_name$;
goto PROFILE_SKILLS_SELECT;
}
else
goto PROFILE_SKILLS_MAIN;
break;
case 3:
goto PROFILE_SKILLS_SELECT;
break;
}
}
else
mes "You don't have any skills profile.";
next;
goto PROFILE_SKILLS_MAIN;
break;
case 3:
mes .@npc_name$;
if (Zeny - .reset_skills_cost >= 0)
{
Zeny -= .reset_skills_cost;
last_skills_profile = 0;
resetskill;
mes "Your skills have been reset.";
}
else
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .reset_skills_cost, 3, ".") + "^000000z to reset your skills.";
close;
break;
case 4:
goto PROFILE_START_MENU;
break;
}
PROFILE_STATS_MAIN:
mes .@npc_name$;
mes "What do you want?";
.@selected = select("Create new stats profile:See my stats profiles:Reset my stats:Back");
switch(.@selected)
{
next;
case 1:
mes .@npc_name$;
if (Zeny - .create_status_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_status_cost, 3, ".") + "^000000z to create your stats profile.";
close;
}
mes "Input the stats profile name:";
input .@profile_name$;
next;
.@profile_name$ = replacestr(.@profile_name$, ":", "");
if (.@profile_name$ == "" || compare(.@profile_name$, ":"))
{
mes .@npc_name$;
mes "Invalid stats profile name.";
mes "^FF0000" + .@profile_name$ + "^000000";
next;
goto PROFILE_STATS_MAIN;
}
.@last_status = StatusPoint;
for(.@i = bStr; .@i < (bLuk + 1); .@i++)
{
.@value = readparam(.@i);
if (.@value > 1)
{
.@statslist_value[.@j] = .@value - 1;
.@statslist_id[.@j] = .@i;
.@j++;
}
}
mes .@npc_name$;
if (.@j != 0)
{
mes "Stats profile: ^FF0000" + .@profile_name$ + "^000000";
mes "Stats:";
Zeny -= .create_status_cost;
resetstatus;
.@pos = getarraysize(#stats_profile);
#stats_profile[.@pos] = ++#stats_profile_count; // '#stats_profile_count' is used only to generate unique profile id.
.@var_name$ = "#statslist_" + #stats_profile[.@pos];
setd .@var_name$ + "_name$", .@profile_name$;
setd .@var_name$ + "_count", .@j;
setd .@var_name$ + "_cost", StatusPoint - .@last_status;
for(.@i = 0; .@i < .@j; .@i++)
{
setd .@var_name$ + "_value" + "[" + .@i + "]", .@statslist_value[.@i];
setd .@var_name$ + "_id" + "[" + .@i + "]", .@statslist_id[.@i];
mes "^00FF00" + .stats_name$[(.@statslist_id[.@i] - bStr)] + "^000000 = ^0000FF" + .@statslist_value[.@i] + "^000000";
}
.@j = 0;
deletearray .@statslist_value;
deletearray .@statslist_id;
last_stats_profile = 0;
mes " ";
mes "Your stats profile have been created.";
}
else
mes "You don't have any spending points in stats to create your stats profile.";
next;
goto PROFILE_STATS_MAIN;
break;
case 2:
mes .@npc_name$;
if (getarraysize(#stats_profile) != 0)
{
PROFILE_STATS_SELECT:
mes "Choose your stats profile:";
.@menu$ = "";
if (getarraysize(#stats_profile) > .freeloop_size_active)
.@free = freeloop(true);
for(.@i = 0; .@i < getarraysize(#stats_profile); .@i++)
{
.@menu$ += "^FF0000" + getd("#statslist_" + #stats_profile[.@i] + "_name$") + "^000000" + ":";
if (.@i + 1 == getarraysize(#stats_profile))
.@menu$ += "Back";
}
if (.@free == true)
.@free = freeloop(false);
.@selected = select(.@menu$);
if (.@selected == getarraysize(#stats_profile) + 1)
{
next;
goto PROFILE_STATS_MAIN;
}
.@profile_id = (.@selected - 1);
.@var_name$ = "#statslist_" + #stats_profile[.@profile_id];
next;
PROFILE_STATS_INFO:
mes .@npc_name$;
mes "What do you want?";
mes " ";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
mes "Stats:";
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
mes "^00FF00" + .stats_name$[(getd(.@var_name$ + "_id" + "[" + .@i + "]") - bStr)] + "^000000 = ^0000FF" + getd(.@var_name$ + "_value" + "[" + .@i + "]") + "^000000";
.@selected = select("Load
switch(.@selected)
{
next;
mes .@npc_name$;
case 1:
if (Zeny - .load_status_cost < 0)
{
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .create_skills_cost, 3, ".") + "^000000z to load your stats profile.";
close;
}
if (last_stats_profile != #stats_profile[.@profile_id])
resetstatus;
else
{
mes "You're already using this stats profile.";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
next;
goto PROFILE_STATS_INFO;
}
if (StatusPoint - getd(.@var_name$ + "_cost") >= 0)
{
mes "Loading stats profile...";
mes "This may take awhile.";
Zeny -= .load_status_cost;
StatusPoint -= getd(.@var_name$ + "_cost");
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
{
mes "^00FF00" + .stats_name$[(getd(.@var_name$ + "_id" + "[" + .@i + "]") - bStr)] + "^000000 = ^0000FF" + getd(.@var_name$ + "_value" + "[" + .@i + "]") + "^000000";
statusup2 getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_value" + "[" + .@i + "]");
}
mes " ";
mes "Your stats profile have been loaded.";
last_stats_profile = #stats_profile[.@profile_id];
}
else
{
mes "You don't have sufficient stats points to load your stats profile.";
mes "You need more ^FF0000" + (getd(.@var_name$ + "_cost") - StatusPoint) + "^000000 stats points.";
if (last_stats_profile != 0)
{
next;
mes .@npc_name$;
mes "Going back to the previous stats profile.";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
resetstatus;
.@var_name$ = "#statslist_" + last_stats_profile;
if (StatusPoint - getd(.@var_name$ + "_cost") >= 0)
{
StatusPoint -= getd(.@var_name$ + "_cost");
for(.@i = 0; .@i < getd(.@var_name$ + "_count"); .@i++)
statusup2 getd(.@var_name$ + "_id" + "[" + .@i + "]"), getd(.@var_name$ + "_value" + "[" + .@i + "]");
}
else
{
next;
mes .@npc_name$;
mes "Fail to back to the previous stats profile.";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
last_stats_profile = 0;
}
}
}
next;
goto PROFILE_STATS_INFO;
break;
case 2:
mes "You sure you want to delete the stats profile?";
mes "Stats profile: ^FF0000" + getd(.@var_name$ + "_name$") + "^000000";
if (select("No:Yes") == 1)
{
next;
goto PROFILE_STATS_INFO;
}
next;
mes .@npc_name$;
mes "Stats profile ^FF0000" + getd(.@var_name$ + "_name$") + "^000000 deleted.";
if (last_stats_profile == #stats_profile[.@profile_id])
last_stats_profile = 0;
setd .@var_name$ + "_count", 0;
setd .@var_name$ + "_cost", 0;
setd .@var_name$ + "_name$", "";
deletearray getd(.@var_name$ + "_value");
deletearray getd(.@var_name$ + "_id");
deletearray #stats_profile[.@profile_id], 1;
next;
if (getarraysize(#stats_profile) != 0)
{
mes .@npc_name$;
goto PROFILE_STATS_SELECT;
}
else
goto PROFILE_STATS_MAIN;
break;
case 3:
goto PROFILE_STATS_SELECT;
break;
}
}
else
mes "You don't have any stats profile.";
next;
goto PROFILE_STATS_MAIN;
break;
case 3:
mes .@npc_name$;
if (Zeny - .reset_status_cost >= 0)
{
Zeny -= .reset_status_cost;
last_stats_profile = 0;
resetstatus;
mes "Your stats have been reset.";
}
else
mes "You don't have ^FF0000" + callfunc("F_InsertComma", .reset_status_cost, 3, ".") + "^000000z to reset your stats.";
close;
break;
case 4:
goto PROFILE_START_MENU;
break;
}
OnInit:
// Cost to reset player stats
.reset_status_cost = 0;
// Cost to reset player skills
.reset_skills_cost = 0;
// Cost to create a new stats profile
.create_status_cost = .reset_status_cost * 2;
// Cost to create a new skills profile
.create_skills_cost = .reset_skills_cost * 2;
// Cost to load a stats profile
.load_status_cost = .reset_status_cost * 2;
// Cost to load a skills profile
.load_skills_cost = .reset_skills_cost * 2;
// Will check if player have max base level and job level to access the npc. (Max Level = 'MAX_LEVEL' constant)
// false = Disabled
.check_max_lv = false;
// ONLY CHANGE IF YOU KNOW WHAT YOU'RE DOING !!
setarray .stats_name$[0], "Str", "Agi", "Vit", "Int", "Dex", "Luk";
.freeloop_size_active = 128;
end;
function check_skills {
if (getarg(0) == NV_FIRSTAID || getarg(0) == NV_BASIC)
return true;
if (BaseClass == Job_Swordman)
{
if (getarg(0) == SM_MOVINGRECOVERY || getarg(0) == SM_FATALBLOW || getarg(0) == SM_AUTOBERSERK)
return true;
}
else if (BaseClass == Job_Mage)
{
if (getarg(0) == MG_ENERGYCOAT)
return true;
}
else if (BaseClass == Job_Archer)
{
if (getarg(0) == AC_MAKINGARROW || getarg(0) == AC_CHARGEARROW)
return true;
}
else if (BaseClass == Job_Acolyte)
{
if (getarg(0) == AL_HOLYLIGHT)
return true;
}
else if (BaseClass == Job_Merchant)
{
if (getarg(0) == MC_CARTREVOLUTION || getarg(0) == MC_CHANGECART || getarg(0) == MC_LOUD)
return true;
}
else if (BaseClass == Job_Thief)
{
if (getarg(0) == TF_SPRINKLESAND || getarg(0) == TF_BACKSLIDING || getarg(0) == TF_PICKSTONE || getarg(0) == TF_THROWSTONE)
return true;
}
if (BaseJob == Job_Knight)
{
if (getarg(0) == KN_CHARGEATK)
return true;
}
else if (BaseJob == Job_Priest)
{
if (getarg(0) == PR_REDEMPTIO)
return true;
}
else if (BaseJob == Job_Wizard)
{
if (getarg(0) == WZ_SIGHTBLASTER)
return true;
}
else if (BaseJob == Job_Blacksmith)
{
if (getarg(0) == BS_UNFAIRLYTRICK || getarg(0) == BS_GREED)
return true;
}
else if (BaseJob == Job_Hunter)
{
if (getarg(0) == HT_PHANTASMIC)
return true;
}
else if (BaseJob == Job_Assassin)
{
if (getarg(0) == AS_SONICACCEL || getarg(0) == AS_VENOMKNIFE)
return true;
}
else if (BaseJob == Job_Crusader)
{
if (getarg(0) == CR_SHRINK)
return true;
}
else if (BaseJob == Job_Monk)
{
if (getarg(0) == MO_KITRANSLATION || getarg(0) == MO_BALKYOUNG)
return true;
}
else if (BaseJob == Job_Sage)
{
if (getarg(0) == SA_ELEMENTWIND || getarg(0) == SA_CREATECON || getarg(0) == SA_ELEMENTWATER
|| getarg(0) == SA_ELEMENTGROUND || getarg(0) == SA_ELEMENTFIRE)
return true;
}
else if (BaseJob == Job_Rogue)
{
if (getarg(0) == RG_CLOSECONFINE)
return true;
}
else if (BaseJob == Job_Alchemist)
{
if (getarg(0) == AM_BIOETHICS)
return true;
}
else if (BaseJob == Job_Bard)
{
if (getarg(0) == BA_PANGVOICE)
return true;
}
else if (BaseJob == Job_Dancer)
{
if (getarg(0) == DC_WINKCHARM)
return true;
}
return false;
}
}
And also, this thing doesn't work too, can someone correct this? Thanks!
Code:
input .@Pass$;
if (.@Pass$ == "0") {
mes " ";
mes "Alright, you can always talk me to again if you changed your mind.";
close;
}