[HELP] Item Option NPC

iCORE

New member
Messages
393
Points
0
Location
Halcyon Ragnarok
Github
Naori
Emulator
Hi, how can i make this script work only with accessories and make items as requirements to upgrade

edit: Also how to remove all the choices and make a fix option.

Example: npc will only add VAR_STRAMOUNT in accessory

Code:
//================= Hercules Script =======================================
//=       _   _                     _
//=      | | | |                   | |
//=      | |_| | ___ _ __ ___ _   _| | ___  ___
//=      |  _  |/ _ \ '__/ __| | | | |/ _ \/ __|
//=      | | | |  __/ | | (__| |_| | |  __/\__ \
//=      \_| |_/\___|_|  \___|\__,_|_|\___||___/
//================= License ===============================================
//= This file is part of Hercules.
//= http://herc.ws - http://github.com/HerculesWS/Hercules
//=
//= Copyright (C) 2017  Hercules Dev Team
//= Copyright (C) 2017  Smokexyz
//=
//= Hercules is free software: you can redistribute it and/or modify
//= it under the terms of the GNU General Public License as published by
//= the Free Software Foundation, either version 3 of the License, or
//= (at your option) any later version.
//=
//= This program is distributed in the hope that it will be useful,
//= but WITHOUT ANY WARRANTY; without even the implied warranty of
//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//= GNU General Public License for more details.
//=
//= You should have received a copy of the GNU General Public License
//= along with this program.  If not, see <http://www.gnu.org/licenses/>.
//=========================================================================
//= Option Master (Item Options NPC @see db/item_options.conf)
//================= Description ===========================================
//= Select from a list of your equipments, one to enhance with up to 5 options.
//= A list of the first 10 options are provided in this npc.
//================= Current Version =======================================
//= 1.0
//=========================================================================

prontera,153,180,4	script	Option Master	4_DOG01,{
	callsub(StartTalking);
	end;
	
OnInit:
	/**
	 * General Configuration
	 */
	/* Chance of the enhancement process to fail. (0 - 99 in percent) */
	.chance_of_failure = 10;
	/* Delete the item on failure? (true/false) */
	.delete_on_failure = true;
	/* Required amount of zeny for a try. */
	.zeny_requirement = 100;
	/* Minimum amount of the bonus value. 
	 * For negative effects or certain bonuses that require negative values
	 * Maximum possible value is -INT16_MAX)
	 */
	.minimum_bonus_amount = -100; // usually used with delay bonus options, although not provided in the script.
	/* Maximum amount of the bonus value. 
	 * Maximum possible value is INT16_MAX */
	.maximum_bonus_amount = 100;
	/* Disable selection of bonus value (true/false) */
	.enable_random_bonus = false;
	
	/* Item Option Descriptions */
	setarray(.options$[0], "Max HP", "Max SP", "STR", "AGI", "VIT", "INT", "DEX", "LUK");
	/* Item Option Constants */
	setarray(.option_constants[0], VAR_MAXHPAMOUNT, VAR_MAXSPAMOUNT, VAR_STRAMOUNT, VAR_AGIAMOUNT, VAR_VITAMOUNT, VAR_INTAMOUNT, VAR_DEXAMOUNT, VAR_LUKAMOUNT);
	end;
	
StartTalking:
	.@name$ = _("[ ^990099Option Master^000000 ]");
	disable_items();
	mes(.@name$);
	mesf("Hey there %s", strcharinfo(PC_NAME));
	mes("There's a new-found method of adding options to an equipment that I have been working on.");
	next();
	if (.enable_random_bonus) {
		mes(.@name$);
		mes("Equipment bonuses are added randomly per slot!");
		mes("So if you wind up with a low amount of bonus, don't hesitate to override the slot.");
		next();
	}
	mes(.@name$);
	mes("Would you like me to add extra stats to your equipment?");
	next();
	if (select("Of course!", "Meh, not right now.") == 2) {
		mes(.@name$);
		mes("Alright then, catch you later.");
		close();
	}
	// Build the Menu.
	setarray(.@position$[1], "Head", "Body", "Left Hand", "Right Hand", "Robe", "Shoes", "Accessory 1", "Accessory 2", "Head 2", "Head 3");
	.@menu$ = "";
	for (.@i = 1; .@i <= 10; ++.@i)
		.@menu$ += ((getequipisequiped(.@i)) ? getequipname(.@i) : .@position$[.@i] + "-[Not equipped]") + ":";
	// Select the part.
	.@equip_index = select(.@menu$);
	
	// Check if it's worn.
	if (!getequipisequiped(.@equip_index)) {
		mes(.@name$);
		mes("Brah, your item ain't equipped.");
		close();
	// Check if it allows options
	} else if (!getequipisenableopt(.@equip_index)) {
		mes(.@name$);
		mes("Brah, this equip can't have options.");
		close();
	// Check if equipment is identified.
	} else if (!getequipisidentify(.@equip_index)) {
		mes(.@name$);
		mes("Brah, this equip ain't identified.");
		close();
	}
	
	// Present a list of currently infused options.
	do {
		.@menu$ = "";
		.@used = false;
		// Build the menu of current options.
		for (.@i = 1; .@i <= MAX_ITEM_OPTIONS; ++.@i) {
			// call getequipoption(<equip_index>, <type>, <slot>);
			// if the return is <0, it's a script error.
			// if the return is 0, the slot is empty.
			// if the return is >0, the slot is unavailable.
			.@opt = getequipoption(.@equip_index, .@i, IT_OPT_INDEX);
			if (.@opt > 0)
				.@menu$ += (.@i) + ") " + .options$[.@opt - 1] + ":";
			else
				.@menu$ += (.@i) + ") ^999999Empty^000000" + ":";
		}
		// Option Slot is the actual option slot 0-MAX_ITEM_OPTIONS (@see mmo.h)
		.@option_slot = select(.@menu$);
		
		// Check for used slot and request user action if found.
		if (getequipoption(.@equip_index, .@option_slot, IT_OPT_INDEX) > 0) {
			mes(.@name$);
			mes("This slot is already used up!");
			if (select("^990000Override the slot.^000000", "Choose again.") == 2)
				.@used = true;
			next();
		}
	} while (.@used); // loop if the slot is not to be overridden
	
	// Present a list of available bonuses.
	mes(.@name$);
	mes("Which of the following item bonuses would you like to add to this item?");
	next();
	// Build the Options!
	.@menu$ = "";
	for (.@i = 0; .@i < getarraysize(.options$); ++.@i)
		.@menu$ += (.@i + 1) + ") " + .options$[.@i] + ":";
		
	do {
		// Select the options!
		.@option_variable = select(.@menu$);
		next();
		mes(.@name$);
		mesf("You chose ^009900%s^000000!", .options$[.@option_variable - 1]);
		mes("Are you sure?");
		next();
	} while (select("Fo Shizzle.", "I'ma re-evaluate, brah.") == 2);
	
	// Select a bonus or randomise.
	if (.enable_random_bonus) {
		.@value = rand(.maximum_bonus_amount);
	} else {
		do {
			mes(.@name$);
			mesf("Please input the bonus amount of ^009900%s^000000 you want to add!", .options$[.@option_variable - 1]);
			mesf("(Min: %d, Max: %d)", .minimum_bonus_amount, .maximum_bonus_amount);
			.@ok = input(.@value, .minimum_bonus_amount, .maximum_bonus_amount);
			next();
		} while (.@ok);
	}
	
	// If there's a chance of failure, inform the user.
	if (.chance_of_failure) {
		mes(.@name$);
		mes("Alright so,");
		mes("I'll have you know...");
		mesf("There's a ^990000%d%% chance of failure^000000.", .chance_of_failure);
		mes("Because, well... I didn't go to school.");
		next();
		mes(.@name$);
		if (.delete_on_failure) {
			mes("If I fail, your item will break and it ^990000will be destroyed^000000!");
		}
		mes("Are you still ready to go forward with this?");
		next();
		if (select("Fo shizzle.", "Hells naw, go back to school.") == 2) {
			mes(.@name$);
			mes("Geez, you don't have to be so harsh about it.");
			close();
		}
		next();
	}
	
	// If there's a Zeny Requirement, perform the usual.
	if (.zeny_requirement > 0) {
		mes(.@name$);
		mesf("You also have to pay %dZ.", .zeny_requirement);
		next();
		if (select("Of course!", "No way!") == 2) {
			mes(.@name$);
			mes("Well, see you around then...");
			close();
		}
		if (Zeny < .zeny_requirement) {
			mes(.@name$);
			mes("You don't have enough Zeny!");
			close();
		}
		Zeny -= .zeny_requirement;
	}
	
	// Check if there's a chance of failure, set and roll the dice.
	if (.chance_of_failure && rand(100) <= .chance_of_failure) {
		mes(.@name$);
		mes("^990000I failed!^000000");
		mes("Guess I should go back to school.");
		// Delete the item if flagged.
		if (.delete_on_failure)
			failedrefitem(.@equip_index); // Simulate failed refinement of the item and delete.
	} else {
		// Set the Item Option bonuses in the slot see db/item_options.conf for more info.
		setequipoption(.@equip_index, .@option_slot, .option_constants[.@option_variable - 1], .@value);
		mes(.@name$);
		mes("^009900Praise Jesus^000000");
		mes("I have added an option to your item.");
		mes("My skills are flawless!");
	}
	next();
	mes(.@name$);
	mes("See you around!");
	close();
}
 
Last edited by a moderator:
Code:
prontera,153,180,4	script	Option Master	4_DOG01,{
	mes "blah";
//	dispbottom getequipid(EQI_ACC_L) +" "+ getequipid(EQI_ACC_R);
	next;
	if ( getequipid(EQI_ACC_L) == -1 && getequipid(EQI_ACC_R) == -1 ) {
		mes "You don't have Accessory equipped";
		close;
	}
	.@s = select( getequipid(EQI_ACC_L)? getequipname(EQI_ACC_L) : "",  getequipid(EQI_ACC_R)? getequipname(EQI_ACC_R) : "" ) + 6;
//	dispbottom .@s +"";
	if ( getequipoption( .@s, 1, IT_OPT_INDEX ) ) {
		mes "this Accessory has already enchanted with Item Options";
		close;
	}
	mes "do you want to add +STR to this Accessory?";
	next;
	if ( select( "Yes", "No" ) == 2 ) close;
	setequipoption .@s, 1, VAR_STRAMOUNT, 1;
	close;
}
 
thanks again @AnnieRuru , please add (Random Option, Fixed Option, Replace Option) and still fix to only accessories and str only. and can add upto 5 options.
1. elaborate your question further

2. you post in script support so I assume you know how to fix yourself
if you don't know how to write it yourself, should post in script request

 
prontera,153,180,4 script Option Master 4_DOG01,{
mes "blah";
// dispbottom getequipid(EQI_ACC_L) +" "+ getequipid(EQI_ACC_R);
next;
if ( getequipid(EQI_ACC_L) == -1 && getequipid(EQI_ACC_R) == -1 ) {
mes "You don't have Accessory equipped";
close;
}
.@s = select( getequipid(EQI_ACC_L)? getequipname(EQI_ACC_L) : "", getequipid(EQI_ACC_R)? getequipname(EQI_ACC_R) : "" ) + 6;
// dispbottom .@s +"";
if ( getequipoption( .@s, 1, IT_OPT_INDEX ) ) {
mes "this Accessory has already enchanted with Item Options";
close;
}
mes "do you want to add +STR to this Accessory?";
next;
if ( select( "Yes", "No" ) == 2 ) close;
setequipoption .@s, 1, VAR_STRAMOUNT, 1;
close;
}

prontera,153,180,4 script Option Master 4_DOG01,{
mes "blah";
// dispbottom getequipid(EQI_ACC_L) +" "+ getequipid(EQI_ACC_R);
next;
if ( getequipid(EQI_ACC_L) == -1 && getequipid(EQI_ACC_R) == -1 ) {
mes "You don't have Accessory equipped";
close;
}
.@s = select( getequipid(EQI_ACC_L)? getequipname(EQI_ACC_L) : "", getequipid(EQI_ACC_R)? getequipname(EQI_ACC_R) : "" ) + 6;
// dispbottom .@s +"";
if ( getequipoption( .@s, 1, IT_OPT_INDEX ) ) {
mes "this Accessory has already enchanted with Item Options";
close;
}
mes "do you want to add +STR to this Accessory?";
next;
if ( select( "Yes", "No" ) == 2 ) close;
setequipoption .@s, 1, VAR_STRAMOUNT, 1;
close;
}

@AnnieRurusorry about the last post, this script work perfect and to be more specific.

i want this script have an option like this

//--------------------------------------------------------------//
//other configuration
//--------------------------------------------------------------//

setarray OptionList, STR, INT, DEX; //Choose what is only here

.MaxOption = 5; // here you can make a specific slot number 1 = 1 slot , 2 = 2 slots and so on.....

.FixOption = 100; // no min or max just fix.....
 

 
Back
Top