Jump to content

-to-

Members
  • Posts

    4
  • Joined

  • Last visited

Posts posted by -to-

  1. On 9/9/2020 at 1:33 PM, WhiteEagle said:

    First of all, thanks for sharing.
    But I have a question about this, would it be possible to add the function that it has a chance to appear?
    Like: 

    
    // Item_ID,Chance,RandomOption_GroupId1{,Chance,RandomOption_GroupId2,Chance,RandomOption_GroupId3,Chance,RandomOption_GroupId4,Chance,RandomOption_GroupId5}

    So that every random option has its own chance.
    Here an example with a Knife[4]:

    //100 = 1% Chance
    1202,5000,RDMOPTG_Crimson_Weapon_1,3000,RDMOPTG_Crimson_Weapon_2,2000,RDMOPTG_Crimson_Weapon_3,500,RDMOPTG_Crimson_Weapon_4,100,RDMOPTG_Crimson_Weapon_5

    So there is a 50% chance that the Knife gets 1 bonus, 30% chance the 2nd bonus and so on.
    Then the options would not be fixed so that there are always directly all 3 or 4 bonuses, but from 1 to 5 (if set).

    Hope it is obvious what I mean. xD

    I needed a quick change to make something like this work.... It might help you:
    You just need to replace the function void itemdb_add_randomopt(struct item *it) in itemdb.cpp and recompile. It makes 1random option 100%, 2nd 80%, 3rd 60% and so on...

     

    void itemdb_add_randomopt(struct item *it)
    {
    	struct item_data *id;
    	struct s_random_opt_group *randomopt_group;
    	int i;
    
    	if (!it || !it->nameid || (id = itemdb_exists(it->nameid)) == NULL)
    	{
    		return;
    	}
    
    	for (i = 0; i < MAX_ITEM_RDM_OPT; i++)
    	{
    		if (id->randomopt_groupid[i] && ((randomopt_group = itemdb_randomopt_group_exists(id->randomopt_groupid[i])) != NULL))
    		{
    
    			int rndOpt = rnd() % (MAX_ITEM_RDM_OPT);
    
    			if (i > 0)
    			{
    				if ((i > 3 && rndOpt < 4) || (i > 2 && rndOpt < 3) || (i > 1 && rndOpt < 2))
    					break;
    				if (rndOpt < 1)
    					break;
    			}
    			int rnd_value = rnd() % (randomopt_group->total_weight);
    			int total = 0;
    			int j;
    
    			for (j = 0; j < randomopt_group->total; j++)
    			{
    				total += randomopt_group->entries[j].weight;
    
    				if (rnd_value < total)
    				{
    					it->option[i].id = randomopt_group->entries[j].option.id;
    
    					if (randomopt_group->entries[j].max_value > 0 && randomopt_group->entries[j].max_value != randomopt_group->entries[j].option.value)
    					{
    						int max = randomopt_group->entries[j].max_value;
    						int min = randomopt_group->entries[j].option.value;
    
    						it->option[i].value = rnd() % (max - min + 1) + min;
    					}
    					else
    					{
    						it->option[i].value = randomopt_group->entries[j].option.value;
    					}
    
    					it->option[i].param = randomopt_group->entries[j].option.param;
    					break;
    				}
    			}
    		}
    	}
    }

    In item_randomopt_equips.txt you cannot duplicate any RandomOption_GroupId in the same item. You can use something like this:

    1202,RDMOPT_Weapon_Tier1_Slot1,RDMOPT_Weapon_Tier1_Slot2,RDMOPT_Weapon_Tier1_Slot3,RDMOPT_Weapon_Tier1_Slot4,RDMOPT_Weapon_TierSpecial_Slot5

    If you want a item to have less than 5 options, you just need to remove the option from this file.

  2. On 10/1/2020 at 6:49 PM, ittiphol said:

    How to fix do not remove option on armor 

    when i use this script my random option is remove out.

     

    Thank you

    I've added a loop to save the gear`s random options in variables

    for(.@i=0;.@i<(MAX_ITEM_RDM_OPT);.@i++){
      .@randOptId[.@i] = getequiprandomoption(.@position,.@i,ROA_ID);
      .@randOptValue[.@i] = getequiprandomoption(.@position,.@i,ROA_VALUE);
      .@randOptParam[.@i] = getequiprandomoption(.@position,.@i,ROA_PARAM);
    }

    And changed getitem2 to getitem3 to create the stored random options values.

    Here it is:

    //===== rAthena Script =======================================
    //= Enchant NPC
    //===== By: ==================================================
    //= Sehrentos
    //===== Current Version: =====================================
    //= 1.2
    //===== Compatible With: =====================================
    //= rAthena Project
    //===== Description: =========================================
    //= Enchant player's equipment. Support multiple enchants.
    //===== Additional Comments: =================================
    //= 1.0 Initial script.
    //= 1.1 Remove enchant option.
    //= 1.2 Added .max_enchant option.
    //============================================================
    // shop/cashshop/itemshop/pointshop
    -	shop	enc_atk	-1,501:300;
    -	shop	enc_def	-1,501:300;
    -	shop	enc_stats	-1,501:300;
    
    prontera,159,177,6	script	Enchant#prt1	4_M_MERCAT1,{
    	disable_items;
    	switch(select("Attack:Defence:Stats:Remove")) {
    		case 1: @shop_name$ = "enc_atk"; break;
    		case 2: @shop_name$ = "enc_def"; break;
    		case 3: @shop_name$ = "enc_stats"; break;
    		case 4: callsub S_Remove; break;
    		default: end;
    	}
    	callshop @shop_name$, 1;
    	npcshopattach @shop_name$;
    	end;
    
    OnInit:
    	// Settings: shop names, currencies, items, prices
    	.max_enchant = 2; // Max amount of enchants 0-4
    	setarray .shop_name$[0],   "enc_atk", "enc_def", "enc_stats";
    	setarray .shop_currency$[0],"Zeny",    "Zeny",    "Zeny";
    	setarray .enc_atk_id[0],    4760, 4761, 4806, 4815, 4814, 4813, 4812, 4826, 4827, 4828, 4829, 4830,  4831, 4819, 4766, 4767,4764,4765, 4807, 4842, 4818, 4817, 4816, 4843, 4844, 4811, 4810, 4809, 4808, 4820, 4821, 4822, 4823, 4824,  4825, 4832, 4833, 4834, 4835, 4836, 4837, 4838, 4839, 4840,  4841;
    	setarray .enc_atk_price[0],10000,20000,30000,10000,20000,30000,40000,50000,60000,70000,80000,90000,100000,10000,20000,30000,5000,7000,10000,20000,10000,20000,30000,40000,50000,10000,20000,30000,40000,50000,60000,70000,80000,90000,100000,10000,20000,30000,40000,50000,60000,70000,80000,90000,100000;
    	setarray .enc_def_id[0],    4805, 4850, 4851, 4852,4762, 4763,4786,4787,4788,4789, 4790,4791,4792,4793, 4794,4795,4796,4797,4798,4799,4800,4801, 4802;
    	setarray .enc_def_price[0],10000,20000,40000,60000,5000,12000,2000,4000,6000,8000,10000,3000,5000,9000,12000,1000,2000,3000,4000,5000,2500,5000,10000;
    	setarray .enc_stats_id[0],   4700,4710,4720,4730,4740,4750, 4701,4711,4721,4731,4741,4751, 4702,4712,4722,4732,4742,4752, 4703,4713,4723,4733,4743,4753, 4704,4714,4724,4734,4744,4754, 4705,4715,4725,4735,4745,4755, 4706,4716,4726,4736,4746,4756, 4707,4717,4727,4737,4747,4757, 4708,4718,4728,4738,4748,4758, 4709, 4719, 4729, 4739, 4749, 4759;
    	setarray .enc_stats_price[0],1500,1500,1500,1500,1500,1500, 2500,2500,2500,2500,2500,2500, 3500,3500,3500,3500,3500,3500, 4500,4500,4500,4500,4500,4500, 5500,5500,5500,5500,5500,5500, 6500,6500,6500,6500,6500,6500, 7500,7500,7500,7500,7500,7500, 8500,8500,8500,8500,8500,8500, 9500,9500,9500,9500,9500,9500, 10500,10500,10500,10500,10500,10500;
    
    	// Load shop items
    	for(.@i = 0; .@i < getarraysize(.shop_name$); .@i++) {
    		.@npc$ = .shop_name$[.@i];
    		deletearray .@id[0],getarraysize(.@id);
    		deletearray .@price[0],getarraysize(.@price);
    		copyarray .@id[0], getd("."+.@npc$+"_id[0]"), getarraysize(getd("."+.@npc$+"_id"));
    		copyarray .@price[0], getd("."+.@npc$+"_price[0]"), getarraysize(getd("."+.@npc$+"_price"));
    		npcshopdelitem .@npc$,501;// Remove apple
    		for(.@j = 0; .@j < getarraysize(.@id); .@j++) {
    			npcshopadditem .@npc$, .@id[.@j], .@price[.@j];
    		}
    	}
    	end;
    
    OnSellItem:
    	end;
    
    OnBuyItem:
    	.@bought_count = getarraysize(@bought_nameid);
    	if(.@bought_count < 1) end;
    	// Get shop data by @shop_name$
    	.@shop_index = inarray(.shop_name$[0], @shop_name$);
    	if(.@shop_index == -1 || getarraysize(.shop_name$) < 1) {
    		message strcharinfo(0), "Shop was not found!";
    		debugmes "Incorrect shop array detected in '"+@shop_name$+"'! FIXME!";
    		end;
    	}
    	copyarray .@shop_id[0], getd("."+@shop_name$+"_id"), getarraysize(getd("."+@shop_name$+"_id"));
    	copyarray .@shop_price[0], getd("."+@shop_name$+"_price"), getarraysize(getd("."+@shop_name$+"_price"));
    
    	for(.@i = 0; .@i < .@bought_count; .@i++) {
    		.@index = inarray(.@shop_id[0], @bought_nameid[.@i]);
    		if(.@index == -1) {
    			message strcharinfo(0), "Price was not found!";
    			debugmes "Incorrect price array detected in '"+@shop_name$+"'! FIXME!";
    			end;
    		}
    		setarray .@bought_cost[getarraysize(.@bought_cost)],.@shop_price[.@index]*@bought_quantity[.@i];
    		for (.@j = 0; .@j < @bought_quantity[.@i]; .@j++) {
    			setarray .@enchant[getarraysize(.@enchant)],@bought_nameid[.@i];
    		}
    	}
    
    	// Count total cost
    	for(.@i = 0; .@i < .@bought_count; .@i++) {
    		.@total_cost = .@total_cost + .@bought_cost[.@i];
    	}
    
    	// Currency check
    	if(.shop_currency$[.@shop_index] == "Zeny" && Zeny < .@total_cost) {
    		message strcharinfo(0), "("+.@total_cost+") Not enough "+.shop_currency$[.@shop_index]+"!";
    		end;
    	}
    	// Other currency checks...
    
    	// Select equipment (EQI)
    	mes "[ " + strnpcinfo(1) + " ]";
    	mes "Please select which equipment you want me to enchant.";
    	.@position = callsub(S_SelectPosition);
    
    	// Check if position has equipment
    	if(!getequipisequiped(.@position)) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "You don't have anything equipped there!";
    		close;
    	}
    
    	.@item_id = getequipid(.@position); //Equipped item id
    	.@refine = getequiprefinerycnt(.@position); //Equipped refine value
    	.@slots = getitemslots(.@item_id);
    	setarray .@cards[0],
    		getequipcardid(.@position,0),
    		getequipcardid(.@position,1),
    		getequipcardid(.@position,2),
    		getequipcardid(.@position,3);
    	.@cards_count = getarraysize(.@cards);
    	.@enchant_count = getarraysize(.@enchant);
    
        for(.@i=0;.@i<(MAX_ITEM_RDM_OPT);.@i++){
    		.@randOptId[.@i] = getequiprandomoption(.@position,.@i,ROA_ID);
    		.@randOptValue[.@i] = getequiprandomoption(.@position,.@i,ROA_VALUE);
    		.@randOptParam[.@i] = getequiprandomoption(.@position,.@i,ROA_PARAM);
    	}
    
    	/*if(.@enchant_count > .max_enchant) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "This item has been crafted or produced and cannot be enchanted.";
    		close;
    	}*/
    	// Check for enabled refinement
    	/*if(!getequipisenableref(.@position)) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "I don't think I can enchant this item at all.";
    		mes "Sorry...";
    		close;
    	}*/
    
    	// Add all card slots
    	for(.@i = 0; .@i < .@slots; .@i++) {
    		setarray .@item[getarraysize(.@item)], (.@cards[.@i] > 0 ? .@cards[.@i] : -1);
    	}
    	// Add previous enchants
    	for(.@i = .@slots; .@i < .@cards_count; .@i++) {
    		if(.@cards[.@i] > 0) {
    			setarray .@item[getarraysize(.@item)], .@cards[.@i];
    		}
    	}
    	// Add new enchants
    	for(.@i = 0; .@i < .@enchant_count; .@i++) {
    		setarray .@item[getarraysize(.@item)], .@enchant[.@i];
    	}
    
    	// Check for produced/crafted items 254,255
    	if(.@cards[0] == CARD0_FORGE || .@cards[0] == CARD0_CREATE) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "This item has been crafted or produced and cannot be enchanted.";
    		close;
    	}
    
    	// Has card sockets 4 - slots
    	if(.@enchant_count > (.max_enchant - .@slots)) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "This equipment can hold "+(.max_enchant - .@slots)+" enchant.";
    		close;
    	}
    
    	// Has free sockets
    	if((.@slots + .@enchant_count) > .max_enchant || getarraysize(.@item) > .max_enchant) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "This item does not have enough free sockets to enchant.";
    		close;
    	}
    
    	// Confirm the setup
    	clear;
    	mes "[ " + strnpcinfo(1) + " ]^6E6E6E Setup^000000";
    	for(.@i = 0; .@i < .@enchant_count; .@i++) {
    		mes "Enchant: "+ getitemname(.@enchant[.@i]);
    	}
    	mes "Equipment: "+ getitemname(getequipid(.@position));
    	mes "Cost: "+.@total_cost+" "+.shop_currency$[.@shop_index]+".";
    	if (select("Create enchant:Cancel") != 1) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "Farewell.";
    		close;
    	}
    
    	// Create selected enchant
    	clear;
    	mes "[ " + strnpcinfo(1) + " ]^6E6E6E Done^000000";
    	mes "Here is your enchanted equipment!";
    	delequip(.@position);
    	specialeffect2 154;
    
    	if(.shop_currency$[.@shop_index] == "Zeny") {
    		Zeny = Zeny - .@total_cost;
    	}
    
    	//getitem2 .@item_id, 1, 1, .@refine, 0,
        getitem3 .@item_id, 1, 1, .@refine, 0,
    		(.@item[0] > 0 ? .@item[0] : 0),
    		(.@item[1] > 0 ? .@item[1] : 0),
    		(.@item[2] > 0 ? .@item[2] : 0),
    		(.@item[3] > 0 ? .@item[3] : 0),.@randOptId,.@randOptValue,@randOptParam;
    	close;
    
    S_Remove:
    	// Select equipment (EQI)
    	mes "[ " + strnpcinfo(1) + " ]";
    	mes "Please select which equipment you want me to work on.";
    	.@position = callsub(S_SelectPosition);
    
    	// Check if position has equipment
    	if(!getequipisequiped(.@position)) {
    		clear;
    		mes "[ " + strnpcinfo(1) + " ]";
    		mes "You don't have anything equipped there!";
    		close;
    	}
    
    	.@item_id = getequipid(.@position); //Equipped item id
    	.@refine = getequiprefinerycnt(.@position); //Equipped refine value
    	.@slots = getitemslots(.@item_id);
    	setarray .@cards[0],
    		getequipcardid(.@position,0),
    		getequipcardid(.@position,1),
    		getequipcardid(.@position,2),
    		getequipcardid(.@position,3);
    	.@cards_count = getarraysize(.@cards);
    	.@enchant_count = getarraysize(.@enchant);
    
        for(.@i=0;.@i<(MAX_ITEM_RDM_OPT);.@i++){
    		.@randOptId[.@i] = getequiprandomoption(.@position,.@i,ROA_ID);
    		.@randOptValue[.@i] = getequiprandomoption(.@position,.@i,ROA_VALUE);
    		.@randOptParam[.@i] = getequiprandomoption(.@position,.@i,ROA_PARAM);
    	}
    
    	// Create selected item
    	clear;
    	mes "[ " + strnpcinfo(1) + " ]^6E6E6E Done^000000";
    	mes "Here is your equipment back!";
    	delequip(.@position);
    	specialeffect2 169;
    
    	//getitem2 .@item_id, 1, 1, .@refine, 0,0,0,0,0;
    	getitem3 .@item_id, 1, 1, .@refine, 0,0,0,0,0,.@randOptId,.@randOptValue,@randOptParam;
    	for(.@i=0; .@i<.@slots; .@i++) {
    		if(.@cards[.@i] > 0)
    			getitem .@cards[.@i], 1;
    	}
    	close;
    
    S_SelectPosition:
    	setarray .@indices[1], EQI_HEAD_TOP, EQI_HEAD_MID, EQI_HEAD_LOW, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R;
    	setarray .@position$[1], "Top", "Mid", "Low", "Armor", "Left Hand", "Right Hand", "Garment", "Shoes", "Accessory L", "Accessory R";
    	setarray .@option[1], 1, 1, 1, 1, 1, 1, 1, 1, 1, 1; // 1=allow, 0=deny
    	for(.@i=1; .@i<getarraysize(.@indices); .@i++) {
    		if(.@option[.@i] && getequipisequiped(.@indices[.@i])) {
    			.@menu$ = .@menu$ + .@position$[.@i] + "-[" + getequipname(.@indices[.@i]) + "]";
    		}
    		.@menu$ = .@menu$ + ":";
    	}
    	.@part = .@indices[select(.@menu$)];
    	return .@part;
    }

     

  3. On 9/22/2018 at 8:09 PM, Giant Whisper said:

    it has to be an equipable item

    ITEMID,ITEMNAME,ITEMNAME,4,20,,0,,0,,0,0xFFFFFFFF,7,2,8192,,0,0,0,{},{setlook LOOK_BODY2,1;},{setlook LOOK_BODY2,0;}

    In case you still need this.

    8192 = Costume Garment

    On unequipped it changes back to normal bodystyle. You just need to change the jobs that will be able to use the item.

    • Upvote 1
×
×
  • Create New...