Jump to content

Rizz

Members
  • Posts

    72
  • Joined

  • Last visited

Posts posted by Rizz

  1. On 10/21/2019 at 10:37 PM, Diospectre said:

    - If the member is not at the same map as the killer, he will get skipped.

    Thanks your script worked well when I tested it but one feature isn't worked properly. The other member still get the item even they are died or in different screen.
    I got this notification in the emulator:
    [Error]: buildin_getitem: Nonexistant item 25276 requested.
    [Debug]: Source (NPC): PartyLoot (invisible/not on a map)

    On 10/21/2019 at 10:59 PM, Mabuhay said:

    Untested

    I have tested, yours also worked well but Ifound that the other party member in different screen/died member stilll get the item. ?

  2. Ah my bad, this is the complete script

    -	script	PartyLoot	-1,{
    OnNPCKillEvent:
    if ( getmonsterinfo( killedrid, 1014 ) && rand(100) < 40 ) {
    	if ( getcharid(1) ) {
    		getpartymember getcharid(1), 1;
    		getpartymember getcharid(1), 2;
    		for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    			if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
    				.@partymemberaid[.@c] = $@partymemberaid[.@i];
    				.@c++;
    			}
    		}
    		getitem 607, 3, .@partymemberaid[ rand( .@c ) ];
    		getitem 616, 3, .@partymemberaid[ rand( .@c ) ];
    	}
    	else {
    		getitem 607, 3;
    		getitem 607, 3;
    	}
    }
    end;
    }

    ill test the config you've provided.., I will tell you later if it works

    EDIT: It would not work for me man 

    EDIT: I managed to make it work. But You may inspect it first, I am afraid if I made a mistake which can be exploited.

    EDIT: It seems the other party members still get the item even they are in different map. I killed the spore in pay fild08, other member in prontera also get the drop. Any suggestion for fixing this issue?
     

    -	script	PartyLoot	-1,{
    OnNPCKillEvent:
    if( killedrid == 1014 ){
    	if ( getcharid(1) ) {
    		getpartymember getcharid(1), 1;
    		getpartymember getcharid(1), 2;
    		for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    			if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
    				.@partymemberaid[.@c] = $@partymemberaid[.@i];
    				.@c++;
    			}
    		}
    		if(rand(100)<10)	getitem 607, 3, .@partymemberaid[ rand( .@c ) ]; //it gives pt member 3 Ygg berry and 3 OCA for 10%
    		if(rand(100)<10)	getitem 616, 3, .@partymemberaid[ rand( .@c ) ];
    	}
    	else {
    		if(rand(100)<10)	getitem 607, 3;
    		if(rand(100)<10)	getitem 607, 3;
    	}
    }
    end;
    }

    Previously I tried to edit a script from contributor regarding MVP share loot script. I want to make this script only gives an item to party member in the same area. However, I failed and when member A killed Z monster, member outside the screen still got the item prize. Please give me an insight..

    -	script	partyshare	-1,{
    OnNPCKillEvent:
    if( killedrid == 1014 ){
        if ( getcharid(1) ) {
            getpartymember getcharid(1), 1;
            getpartymember getcharid(1), 2;
            getmapxy(.@mapname$,.@mapx,.@mapy,BL_PC);
                for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
                    if ( !isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ||  // what happens if someone in the party member is offline =/
                        strcharinfo(3,$@partymembercid[.@i]) != .@mapname$ ) // If the party member is not on the same map of the killer
                        continue;
            if(rand(100)<10)	getitem 607, 1, $@partymemberaid[.@i];
            }
            announce "Wow! A party named [ "+ strcharinfo(1) +" ] has killed "+ getmonsterinfo( killedrid, MOB_NAME ) +" at "+ strcharinfo(3) +"! Awesome work guys!",bc_all,0x6666CC;
        }
        else {
            if(rand(100)<10)	getitem 607,1;
            announce "Amazing! A lone wolf named [ "+ strcharinfo(0) +" ] has killed "+ getmonsterinfo( killedrid, MOB_NAME ) +" himself at "+ strcharinfo(3) +"! Reckless, but still, good work!",bc_all,0x6666CC;
        }
    }
    end;
    }

    EDIT: Dead member still get the item, please tell me how to limit the drop so Only the surviving party members can get the item.

    EDIT: Already answered in the other thread.

  3. 11 hours ago, Diospectre said:

        setarray .@moblist,    1014, 1015; // LIST OF MOB ID
        set .@mobsize,getarraysize(.@moblist);
        set .@val,0;

        while (.@val <= .@mobsize) {
            set .@val,.@val+1;
            set .@moblist[.@val];

    Where should I put this sir?

    Sry, what I meant is, I tried to make a party member got similar chance to get an item from a monster even though they dont kill it.
    Ex: DPS kill poring and has 10% to get a knife, the supports also have 10% chance as well (pure communism :D)

  4. On 10/19/2019 at 3:23 PM, DevKira said:

    I have an Custom Enchantment Script. Easy to modified in just a seconds.
    My first made script. ❤️ DM if you want

    Thanks, but is it random option enchantment or the regular one?

    I found how to make it anyway, I tried to make a simple improvement for this script.

    //===== rAthena Script =======================================
    //= Vicious Mind Weapon Random Option Enchanter
    //===== By ===================================================
    //= llchrisll
    //===== Version ==============================================
    //= 1.0 - Initial Version
    //===== Tested With ==========================================
    //= rAthena 03/26/2018 Revision
    //= GIT Hash: 333f0dddc8353663eacba0423751988c9bc38e34
    //===== Description ==========================================
    //= This script handles the random options for the Vicious Mind Weapons
    //  until rAthena changes the way the Random Option Database is handled.
    //= Instead of defining every possible random option for each option slot
    //  this enchanter will be used.
    //===== Comments =============================================
    
    //===== Credits ==============================================
    //= NovaRo for their Information regarding the possible Options.
    //============================================================
    prontera,158,179,4	script	Disciple of Hades	101,{
    
    mes .n$;
    mes "Hey.., "+strcharinfo(0)+"!";
    mes "You look strong, I can make you stronger";
    mes "I am the lost gods disciples, he taught me many things.";
    mes "Including art of enchanting.";
    if(select("- Enchant Ancient Weapons:- Nevermind") - 1) close;
    next;
    mes .n$;
    mes "To apply an random properity to an Ancient weapon, you need to have ^0000ffJotun Eye^000000.";
    mes "Also be warned, that what you get and with which value is completely random!";
    next;
    mes "Please remember remove the cards in the weapon before enchanting or it might be lost.";
    menu "Okay I have it",-;
    next;
    mes "1 ^0000ffJotun Eye^000000.";
    if(countitem(607) < 1 ) goto Lne; // testing used Ygg berry -  change the catalyst here
    next;
    mes .n$;
    mes "First, let's see what you have equipped...:";
    next;
    set .@part,EQI_HAND_R; // Save equip location
    mes .n$;
    if(!getequipid(.@part)) {
    	mes "You don't have anything equipped!";
    	close;
    Lne:
    mes "Are you trying to fool me!?";
    close;
    }
    switch(getequipid(.@part)) {
    	case 1268: // Wild Beast Claw
    	case 1236: // Sucsamad
    	case 1363: // Bloody Axe
    	case 1141: // Immaterial Sword
    	case 1175: // Atlas Weapon
    	case 1474: // Gae Bolg
    	case 1559: // Legacy of Dragon
    	case 1815: // Garm Claw
    	set .@Type$,"P";
    	break;
    	
    	case 2005: // Dea Staff
    	case 1631: // Holy Stick
    	case 1541: // Nemesis
    	set .@Type$,"M";
    	break;
    	
    	case 1223: // Fortune Sword
    	case 1420: // Long Horn
    	case 1722: // Ballista
    	case 1919: // Bass Guitar
    	case 13170: // Lever Action Rifle
    	case 1970: // Queen's Whip
    	set .@Type$,"R";
    	break;
    	
    	default:
    	mes "I don't recognize this weapon, please be sure to equip one and come back again.";
    	close;
    }
    mes "Equipped Weapon: "+getitemname(getequipid(.@part));
    set .@ropt1,getequiprandomoption(.@part,0,ROA_ID);
    set .@ropt2,getequiprandomoption(.@part,1,ROA_ID);
    set .@ropt3,getequiprandomoption(.@part,2,ROA_ID);
    if(.@ropt1 || .@ropt2 || .@ropt2) {
    	mes " ";
    	mes "I'm sorry, but this weapon already has bonus properities applied.";
    	mes "Please choose a different one.";
    	close;
    }
    next;
    // Randomize each Option Slot:
    // Random Option 1
    set .@Opt1,rand(getarraysize(getd(".RandOpt1_"+.@Type$)));
    if(getd(".RandOpt1_"+.@Type$+"_MinV["+.@Opt1+"]") != getd(".RandOpt1_"+.@Type$+"_MaxV["+.@Opt1+"]"))
    	set .@Opt1_V,rand(getd(".RandOpt1_"+.@Type$+"_MinV["+.@Opt1+"]"),getd(".RandOpt1_"+.@Type$+"_MaxV["+.@Opt1+"]"));
    else 
    	set .@Opt1_V,getd(".RandOpt1_"+.@Type$+"_MaxV["+.@Opt1+"]");
    	
    // Random Option 2
    set .@Opt2,rand(getarraysize(getd(".RandOpt2_"+.@Type$)));
    if(getd(".RandOpt2_"+.@Type$+"_MinV["+.@Opt2+"]") != getd(".RandOpt2_"+.@Type$+"_MaxV["+.@Opt2+"]"))
    	set .@Opt2_V,rand(getd(".RandOpt2_"+.@Type$+"_MinV["+.@Opt2+"]"),getd(".RandOpt2_"+.@Type$+"_MaxV["+.@Opt2+"]"));
    else 
    	set .@Opt2_V,getd(".RandOpt2_"+.@Type$+"_MaxV["+.@Opt2+"]");
    	
    // Random Option 3
    set .@Opt3,rand(getarraysize(getd(".RandOpt3_"+.@Type$)));
    if(getd(".RandOpt3_"+.@Type$+"_MinV["+.@Opt3+"]") != getd(".RandOpt3_"+.@Type$+"_MaxV["+.@Opt3+"]"))
    	set .@Opt3_V,rand(getd(".RandOpt3_"+.@Type$+"_MinV["+.@Opt3+"]"),getd(".RandOpt3_"+.@Type$+"_MaxV["+.@Opt3+"]"));
    else 
    	set .@Opt3_V,getd(".RandOpt3_"+.@Type$+"_MaxV["+.@Opt3+"]");
    
    // Apply options to equipped weapon
    setrandomoption(.@part,0,getd(".RandOpt1_"+.@Type$+"["+.@Opt1+"]"),.@Opt1_V,0);
    setrandomoption(.@part,1,getd(".RandOpt2_"+.@Type$+"["+.@Opt2+"]"),.@Opt2_V,0);
    setrandomoption(.@part,2,getd(".RandOpt3_"+.@Type$+"["+.@Opt3+"]"),.@Opt3_V,0);
    mes .n$;
    delitem	607,1;
    mes "Random bonus properities have been applied on your \""+getitemname(getequipid(.@part))+"\" successfully.";
    end;
    
    OnInit:
    set .n$,"[Vicious Enchanter]";
    // ========= Random Option Slot 1 ========= 
    // - Physical
    setarray .RandOpt1_P[0],RDMOPT_HP_DRAIN, // HP Drain
    					    RDMOPT_SP_DRAIN,	// SP Drain
    					    RDMOPT_VAR_HPACCELERATION,	// HP Regen
    					    RDMOPT_VAR_SPACCELERATION,	// SP Regen
    					    RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE,	// Perfect Dodge
    					    RDMOPT_VAR_AVOIDSUCCESSVALUE,	// Dodge
    					    RDMOPT_DEC_SP_CONSUMPTION,// Delay SP Cons
    					    RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,	 	// Damage to Neutral Element
    					    RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,	 	// Damage to Earth Element
    					    RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,		 	// Damage to Fire Element
    					    RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,	 	// Damage to Water Element
    					    RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,		 	// Damage to Wind Element
    					    RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,	 	// Damage to Poison Element
    					    RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,	 	// Damage to Holy Element
    					    RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,	 	// Damage to Dark Element
    					    RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,	// Damage to Ghost Element
    					    RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET,		// Damage to Undead Element
    					    RDMOPT_HEAL_MODIFY_PERCENT, // Heal Power %
    					    RDMOPT_WEAPON_INDESTRUCTIBLE, // Weapon Instructible
    					    RDMOPT_DAMAGE_SIZE_PERFECT; // Size will be ignored
    					    // ToDo: // Recover 1000 of Damage lost from size penalties
    						
    // - Magical
    setarray .RandOpt1_M[0],RDMOPT_HP_DRAIN, // HP Drain
    					    RDMOPT_SP_DRAIN,	// SP Drain
    					    RDMOPT_VAR_HPACCELERATION,	// HP Regen
    					    RDMOPT_VAR_SPACCELERATION,	// SP Regen
    					    RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE,	// Perfect Dodge
    					    RDMOPT_VAR_AVOIDSUCCESSVALUE,	// Dodge
    					    RDMOPT_DEC_SP_CONSUMPTION,// Delay SP Cons
    					    RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET,	 	// Damage to Neutral Element
    					    RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET,	 	// Damage to Earth Element
    					    RDMOPT_MDAMAGE_PROPERTY_FIRE_TARGET,	 	// Damage to Fire Element
    					    RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET,	 	// Damage to Water Element
    					    RDMOPT_MDAMAGE_PROPERTY_WIND_TARGET,	 	// Damage to Wind Element
    					    RDMOPT_MDAMAGE_PROPERTY_POISON_TARGET,		// Damage to Poison Element
    					    RDMOPT_MDAMAGE_PROPERTY_SAINT_TARGET,		// Damage to Holy Element
    					    RDMOPT_MDAMAGE_PROPERTY_DARKNESS_TARGET,	// Damage to Dark Element
    					    RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_TARGET,	// Damage to Ghost Element
    					    RDMOPT_MDAMAGE_PROPERTY_UNDEAD_TARGET,	 	// Damage to Undead Element
    					    RDMOPT_HEAL_MODIFY_PERCENT, // Heal Power %
    					    RDMOPT_WEAPON_INDESTRUCTIBLE, // Weapon Instructible
    					    RDMOPT_DAMAGE_SIZE_PERFECT; // Size will be ignored
    					    // ToDo: // Recover 1000 of Damage lost from size penalties
    					  
    // - Ranged
    setarray .RandOpt1_R[0],RDMOPT_HP_DRAIN, // HP Drain
    					    RDMOPT_SP_DRAIN,	// SP Drain
    					    RDMOPT_VAR_HPACCELERATION,	// HP Regen
    					    RDMOPT_VAR_SPACCELERATION,	// SP Regen
    					    RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE,	// Perfect Dodge
    					    RDMOPT_VAR_AVOIDSUCCESSVALUE,	// Dodge
    					    RDMOPT_DEC_SP_CONSUMPTION,// Delay SP Cons
    						RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,	 	// Damage to Neutral Element
    					    RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,		// Damage to Earth Element
    					    RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,		 	// Damage to Fire Element
    					    RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,		// Damage to Water Element
    					    RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,		 	// Damage to Wind Element
    					    RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,		// Damage to Poison Element
    					    RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,		// Damage to Holy Element
    					    RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,	 	// Damage to Dark Element
    					    RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,	// Damage to Ghost Element
    					    RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET,		// Damage to Undead Element
    					    RDMOPT_HEAL_MODIFY_PERCENT, // Heal Power %
    					    RDMOPT_WEAPON_INDESTRUCTIBLE, // Weapon Instructible
    					    RDMOPT_DAMAGE_SIZE_PERFECT; // Size will be ignored
    					    // ToDo: // Recover 1000 of Damage lost from size penalties
    
    // - Values
    // Note: When MinV and MaxV are the same, rand() will not be used!
    setarray .RandOpt1_P_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,0;
    setarray .RandOpt1_P_MaxV[0],3,3,20,20,5,5,20,20,20,20,20,20,20,20,20,20,20,20,0,0;
    setarray .RandOpt1_M_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,0;
    setarray .RandOpt1_M_MaxV[0],3,3,20,20,5,5,20,20,20,20,20,20,20,20,20,20,20,20,0,0;
    setarray .RandOpt1_R_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,0;
    setarray .RandOpt1_R_MaxV[0],3,3,20,20,5,5,20,20,20,20,20,20,20,20,20,20,20,20,0,0;
    
    // ========= Random Option Slot 2 ========= 
    // - Physical
    setarray .RandOpt2_P[0],RDMOPT_RACE_DAMAGE_NOTHING,	// Damage to Neutral Race
    					    RDMOPT_RACE_DAMAGE_UNDEAD,	// Damage to Undead Race
    					    RDMOPT_RACE_DAMAGE_ANIMAL,	// Damage to Animal Race
    					    RDMOPT_RACE_DAMAGE_PLANT,	// Damage to Plant Race
    					    RDMOPT_RACE_DAMAGE_INSECT,	// Damage to Insect Race
    					    RDMOPT_RACE_DAMAGE_FISHS,	// Damage to Fish Race
    					    RDMOPT_RACE_DAMAGE_DEVIL,	// Damage to Demon Race
    					    RDMOPT_RACE_DAMAGE_HUMAN,	// Damage to Human Race
    					    RDMOPT_RACE_DAMAGE_ANGEL,	// Damage to Angel Race
    					    RDMOPT_RACE_DAMAGE_DRAGON,	// Damage to Dragon Race
    						RDMOPT_RACE_IGNORE_DEF_PERCENT_NOTHING,	// Bypass DEF of Neutral Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_UNDEAD,	// Bypass DEF of Undead Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANIMAL,	// Bypass DEF of Animal Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT,	// Bypass DEF of Plant Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_INSECT,	// Bypass DEF of Insect Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_FISHS,	// Bypass DEF of Fish Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DEVIL,	// Bypass DEF of Demon Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN,	// Bypass DEF of Human Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANGEL,	// Bypass DEF of Angel Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DRAGON,	// Bypass DEF of Dragon Race
    					    RDMOPT_CLASS_DAMAGE_NORMAL_TARGET,	// Bypass DEF of Normal Class Enemies
    					    RDMOPT_CLASS_DAMAGE_BOSS_TARGET; // Damage to Boss monsters
    						
    // - Magical
    setarray .RandOpt2_M[0],RDMOPT_RACE_MDAMAGE_NOTHING,// Damage to Neutral Race
    					    RDMOPT_RACE_MDAMAGE_UNDEAD,	// Damage to Undead Race
    					    RDMOPT_RACE_MDAMAGE_ANIMAL,	// Damage to Animal Race
    					    RDMOPT_RACE_MDAMAGE_PLANT,	// Damage to Plant Race
    					    RDMOPT_RACE_MDAMAGE_INSECT,	// Damage to Insect Race
    					    RDMOPT_RACE_MDAMAGE_FISHS,	// Damage to Fish Race
    					    RDMOPT_RACE_MDAMAGE_DEVIL,	// Damage to Devil Race
    					    RDMOPT_RACE_MDAMAGE_HUMAN,	// Damage to Human Race
    					    RDMOPT_RACE_MDAMAGE_ANGEL,	// Damage to Angel Race
    					    RDMOPT_RACE_MDAMAGE_DRAGON,	// Damage to Dragon Race
    						RDMOPT_RACE_IGNORE_MDEF_PERCENT_NOTHING,	// Bypass MDEF of Neutral Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_UNDEAD,	// Bypass MDEF of Undead Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANIMAL,	// Bypass MDEF of Animal Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLANT,	// Bypass MDEF of Plant Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_INSECT,	// Bypass MDEF of Insect Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_FISHS,	// Bypass MDEF of Fish Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_DEVIL,	// Bypass MDEF of Demon Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_HUMAN,	// Bypass MDEF of Human Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANGEL,	// Bypass MDEF of Angel Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_DRAGON,	// Bypass MDEF of Dragon Race
    						RDMOPT_CLASS_MDAMAGE_NORMAL,	// Bypass MDEF of Normal Class Enemies
    					    RDMOPT_CLASS_MDAMAGE_BOSS; // Damage to Boss monsters
    					  
    // - Ranged
    setarray .RandOpt2_R[0],RDMOPT_RACE_DAMAGE_NOTHING,	// Damage to Neutral Race
    					    RDMOPT_RACE_DAMAGE_UNDEAD,	// Damage to Undead Race
    					    RDMOPT_RACE_DAMAGE_ANIMAL,	// Damage to Animal Race
    					    RDMOPT_RACE_DAMAGE_PLANT,	// Damage to Plant Race
    					    RDMOPT_RACE_DAMAGE_INSECT,	// Damage to Insect Race
    					    RDMOPT_RACE_DAMAGE_FISHS,	// Damage to Fish Race
    					    RDMOPT_RACE_DAMAGE_DEVIL,	// Damage to Demon Race
    					    RDMOPT_RACE_DAMAGE_HUMAN,	// Damage to Human Race
    					    RDMOPT_RACE_DAMAGE_ANGEL,	// Damage to Angel Race
    					    RDMOPT_RACE_DAMAGE_DRAGON,	// Damage to Dragon Race
    						RDMOPT_RACE_IGNORE_DEF_PERCENT_NOTHING,	// Bypass DEF of Neutral Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_UNDEAD,	// Bypass DEF of Undead Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANIMAL,	// Bypass DEF of Animal Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT,	// Bypass DEF of Plant Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_INSECT,	// Bypass DEF of Insect Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_FISHS,	// Bypass DEF of Fish Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DEVIL,	// Bypass DEF of Demon Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN,	// Bypass DEF of Human Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANGEL,	// Bypass DEF of Angel Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DRAGON,	// Bypass DEF of Dragon Race
    					    RDMOPT_CLASS_DAMAGE_NORMAL_TARGET,	// Bypass DEF of Normal Class Enemies
    					    RDMOPT_CLASS_DAMAGE_BOSS_TARGET; // Damage to Boss monsters
    
    // - Values
    // Note: When MinV and MaxV are the same, rand() will not be used!
    setarray .RandOpt2_P_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,20;
    setarray .RandOpt2_P_MaxV[0],20,20,20,20,20,20,20,20,20,20,30,30,30,30,30,30,30,30,30,30,25,20;
    setarray .RandOpt2_M_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,20;
    setarray .RandOpt2_M_MaxV[0],20,20,20,20,20,20,20,20,20,20,30,30,30,30,30,30,30,30,30,30,25,20;
    setarray .RandOpt2_R_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,20;
    setarray .RandOpt2_R_MaxV[0],20,20,20,20,20,20,20,20,20,20,30,30,30,30,30,30,30,30,30,30,25,20;
    
    // ========= Random Option Slot 3 ========= 
    // - Physical
    setarray .RandOpt3_P[0],RDMOPT_VAR_STRAMOUNT, // STR
    					    RDMOPT_VAR_AGIAMOUNT, // AGI
    					    RDMOPT_VAR_VITAMOUNT, // VIT
    					    RDMOPT_VAR_INTAMOUNT, // INT
    					    RDMOPT_VAR_DEXAMOUNT, // DEX
    					    RDMOPT_VAR_LUKAMOUNT, // LUK
    					    RDMOPT_VAR_ATTPOWER,  // ATK
    					    RDMOPT_VAR_CRITICALSUCCESSVALUE, // Crit Chance
    					    RDMOPT_DAMAGE_CRI_TARGET,	// Crit Damage %
    					    RDMOPT_VAR_PLUSASPDPERCENT,	// ASPD %
    						RDMOPT_DEC_SPELL_CAST_TIME,	// Variable Cast Time -%
    					    RDMOPT_DEC_SPELL_DELAY_TIME,// Cast Delay -%
    					    RDMOPT_DEC_SP_CONSUMPTION;	// Skill SP Cost -%
    						
    // - Magical
    setarray .RandOpt3_M[0],RDMOPT_VAR_STRAMOUNT, // STR
    					    RDMOPT_VAR_AGIAMOUNT, // AGI
    					    RDMOPT_VAR_VITAMOUNT, // VIT
    					    RDMOPT_VAR_INTAMOUNT, // INT
    					    RDMOPT_VAR_DEXAMOUNT, // DEX
    					    RDMOPT_VAR_LUKAMOUNT, // LUK
    					    RDMOPT_VAR_ATTMPOWER, // MATK
    						RDMOPT_DEC_SPELL_CAST_TIME,	// Variable Cast Time -%
    					    RDMOPT_DEC_SPELL_DELAY_TIME,// Cast Delay -%
    					    RDMOPT_DEC_SP_CONSUMPTION;	// Skill SP Cost -%
    					  
    // - Ranged
    setarray .RandOpt3_R[0],RDMOPT_VAR_STRAMOUNT, // STR
    					    RDMOPT_VAR_AGIAMOUNT, // AGI
    					    RDMOPT_VAR_VITAMOUNT, // VIT
    					    RDMOPT_VAR_INTAMOUNT, // INT
    					    RDMOPT_VAR_DEXAMOUNT, // DEX
    					    RDMOPT_VAR_LUKAMOUNT, // LUK
    					    RDMOPT_VAR_ATTPOWER,  // ATK
    						RDMOPT_VAR_ATTMPOWER, // MATK
    					    RDMOPT_VAR_CRITICALSUCCESSVALUE, // Crit Chance
    					    RDMOPT_DAMAGE_CRI_TARGET,	// Crit Damage %
    					    RDMOPT_VAR_PLUSASPDPERCENT,	// ASPD %
    						RDMOPT_DEC_SPELL_CAST_TIME,	// Variable Cast Time -%
    					    RDMOPT_DEC_SPELL_DELAY_TIME,// Cast Delay -%
    					    RDMOPT_DEC_SP_CONSUMPTION,	// Skill SP Cost -%
    						RDMOPT_RANGE_ATTACK_DAMAGE_TARGET; // Ranged Damage +%
    
    // - Values
    // Note: When MinV and MaxV are the same, rand() will not be used!
    setarray .RandOpt3_P_MinV[0],1,1,1,1,1,1,4,10,1,1,1,1,1;
    setarray .RandOpt3_P_MaxV[0],10,10,10,10,10,10,25,19,20,5,5,5,5;
    setarray .RandOpt3_M_MinV[0],1,1,1,1,1,1,4,1,1,1;
    setarray .RandOpt3_M_MaxV[0],10,10,10,10,10,10,30,10,10,5;
    setarray .RandOpt3_R_MinV[0],1,1,1,1,1,1,4,4,10,1,1,1,5,5,1;
    setarray .RandOpt3_R_MaxV[0],10,10,10,10,10,10,25,20,19,20,5,20,20,5,8;
    end;
    }

    Thanks rathena, I learn a lot

  5. Hello, it is me again.., I need a help to make Priest's MG can deal damage to every type and monster element. I tried to change the RC_DEMON to RC_ALL but it found it didnt change anything ?
     

    		case UNT_MAGNUS:
    			if (!battle_check_undead(tstatus->race,tstatus->def_ele) && tstatus->race!=RC_ALL)
    				break;
    			skill_attack(BF_MAGIC,ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
    			break;

     

  6. Woa, thanks alot, I just need to modify it a little ?

    for specific mob i just changed the the MOB_MVPEXP into specific mob id ?

    -	script	PartyLoot	-1,{
    OnNPCKillEvent:
    if ( getmonsterinfo( killedrid, 1014 ) && rand(100) < 40 ) {
    	if ( getcharid(1) ) {
    		getpartymember getcharid(1), 1;
    		getpartymember getcharid(1), 2;
    		for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    			if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
    				.@partymemberaid[.@c] = $@partymemberaid[.@i];
    				.@c++;
    			}

    Hello, someone gave me a link about a script which can give a party member similar chance to get specific item from a mob even they are not the killer.
    However, I would like to make it only work on certain mob for example, Spore. But when I killed other mob, the script also being activated.

    -	script	PartyLoot	-1,{
    OnNPCKillEvent:
    if ( getmonsterinfo( killedrid, 1014 ) && rand(100) < 40 ) {
    	if ( getcharid(1) ) {
    		getpartymember getcharid(1), 1;
    		getpartymember getcharid(1), 2;
    		for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    			if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
    				.@partymemberaid[.@c] = $@partymemberaid[.@i];
    				.@c++;
    			}

    I would appreciate if anyone telling me how to make this script only worked on specific mob..

  7. Hello, I found this script from one of our contributor. However, due to the lack of my ability, I could not reproduce the script like making the NPC asking for catalyst or fee/zeny before giving ramdom opt enchantment. So would you mind helping me making one?

    //===== rAthena Script =======================================
    //= Vicious Mind Weapon Random Option Enchanter
    //===== By ===================================================
    //= llchrisll
    //===== Version ==============================================
    //= 1.0 - Initial Version
    //===== Tested With ==========================================
    //= rAthena 03/26/2018 Revision
    //= GIT Hash: 333f0dddc8353663eacba0423751988c9bc38e34
    //===== Description ==========================================
    //= This script handles the random options for the Vicious Mind Weapons
    //  until rAthena changes the way the Random Option Database is handled.
    //= Instead of defining every possible random option for each option slot
    //  this enchanter will be used.
    //===== Comments =============================================
    
    //===== Credits ==============================================
    //= NovaRo for their Information regarding the possible Options.
    //============================================================
    prontera,158,179,4	script	Disciple of Hades	101,{
    
    mes .n$;
    mes "Hey.., "+strcharinfo(0)+"!";
    mes "You look strong, I can make you stronger";
    mes "I am the lost gods disciples, he taught me many things.";
    mes "Including art of enchanting.";
    if(select("- Enchant Ancient Weapons:- Nevermind") - 1) close;
    next;
    mes .n$;
    mes "To apply an random properity to an Ancient weapon, you need to have it equipped in your right hand.";
    mes "Also be warned, that what you get and with which value is completely random!";
    next;
    mes .n$;
    mes "First, let's see what you have equipped...:";
    next;
    set .@part,EQI_HAND_R; // Save equip location
    mes .n$;
    if(!getequipid(.@part)) {
    	mes "You don't have anything equipped!";
    	close;
    }
    switch(getequipid(.@part)) {
    	case 1268: // Wild Beast Claw
    	case 1236: // Sucsamad
    	case 1363: // Bloody Axe
    	case 1141: // Immaterial Sword
    	case 1175: // Atlas Weapon
    	case 1474: // Gae Bolg
    	case 1559: // Legacy of Dragon
    	case 1815: // Garm Claw
    	set .@Type$,"P";
    	break;
    	
    	case 2005: // Dea Staff
    	case 1631: // Holy Stick
    	case 1541: // Nemesis
    	set .@Type$,"M";
    	break;
    	
    	case 1223: // Fortune Sword
    	case 1420: // Long Horn
    	case 1722: // Ballista
    	case 1919: // Bass Guitar
    	case 13170: // Lever Action Rifle
    	case 1970: // Queen's Whip
    	set .@Type$,"R";
    	break;
    	
    	default:
    	mes "I don't recognize this weapon, please be sure to equip one and come back again.";
    	close;
    }
    mes "Equipped Weapon: "+getitemname(getequipid(.@part));
    set .@ropt1,getequiprandomoption(.@part,0,ROA_ID);
    set .@ropt2,getequiprandomoption(.@part,1,ROA_ID);
    set .@ropt3,getequiprandomoption(.@part,2,ROA_ID);
    if(.@ropt1 || .@ropt2 || .@ropt2) {
    	mes " ";
    	mes "I'm sorry, but this weapon already has bonus properities applied.";
    	mes "Please choose a different one.";
    	close;
    }
    next;
    // Randomize each Option Slot:
    // Random Option 1
    set .@Opt1,rand(getarraysize(getd(".RandOpt1_"+.@Type$)));
    if(getd(".RandOpt1_"+.@Type$+"_MinV["+.@Opt1+"]") != getd(".RandOpt1_"+.@Type$+"_MaxV["+.@Opt1+"]"))
    	set .@Opt1_V,rand(getd(".RandOpt1_"+.@Type$+"_MinV["+.@Opt1+"]"),getd(".RandOpt1_"+.@Type$+"_MaxV["+.@Opt1+"]"));
    else 
    	set .@Opt1_V,getd(".RandOpt1_"+.@Type$+"_MaxV["+.@Opt1+"]");
    	
    // Random Option 2
    set .@Opt2,rand(getarraysize(getd(".RandOpt2_"+.@Type$)));
    if(getd(".RandOpt2_"+.@Type$+"_MinV["+.@Opt2+"]") != getd(".RandOpt2_"+.@Type$+"_MaxV["+.@Opt2+"]"))
    	set .@Opt2_V,rand(getd(".RandOpt2_"+.@Type$+"_MinV["+.@Opt2+"]"),getd(".RandOpt2_"+.@Type$+"_MaxV["+.@Opt2+"]"));
    else 
    	set .@Opt2_V,getd(".RandOpt2_"+.@Type$+"_MaxV["+.@Opt2+"]");
    	
    // Random Option 3
    set .@Opt3,rand(getarraysize(getd(".RandOpt3_"+.@Type$)));
    if(getd(".RandOpt3_"+.@Type$+"_MinV["+.@Opt3+"]") != getd(".RandOpt3_"+.@Type$+"_MaxV["+.@Opt3+"]"))
    	set .@Opt3_V,rand(getd(".RandOpt3_"+.@Type$+"_MinV["+.@Opt3+"]"),getd(".RandOpt3_"+.@Type$+"_MaxV["+.@Opt3+"]"));
    else 
    	set .@Opt3_V,getd(".RandOpt3_"+.@Type$+"_MaxV["+.@Opt3+"]");
    
    // Apply options to equipped weapon
    setrandomoption(.@part,0,getd(".RandOpt1_"+.@Type$+"["+.@Opt1+"]"),.@Opt1_V,0);
    setrandomoption(.@part,1,getd(".RandOpt2_"+.@Type$+"["+.@Opt2+"]"),.@Opt2_V,0);
    setrandomoption(.@part,2,getd(".RandOpt3_"+.@Type$+"["+.@Opt3+"]"),.@Opt3_V,0);
    mes .n$;
    mes "Random bonus properities have been applied on your \""+getitemname(getequipid(.@part))+"\" successfully.";
    end;
    
    OnInit:
    set .n$,"[Vicious Enchanter]";
    // ========= Random Option Slot 1 ========= 
    // - Physical
    setarray .RandOpt1_P[0],RDMOPT_HP_DRAIN, // HP Drain
    					    RDMOPT_SP_DRAIN,	// SP Drain
    					    RDMOPT_VAR_HPACCELERATION,	// HP Regen
    					    RDMOPT_VAR_SPACCELERATION,	// SP Regen
    					    RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE,	// Perfect Dodge
    					    RDMOPT_VAR_AVOIDSUCCESSVALUE,	// Dodge
    					    RDMOPT_DEC_SP_CONSUMPTION,// Delay SP Cons
    					    RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,	 	// Damage to Neutral Element
    					    RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,	 	// Damage to Earth Element
    					    RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,		 	// Damage to Fire Element
    					    RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,	 	// Damage to Water Element
    					    RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,		 	// Damage to Wind Element
    					    RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,	 	// Damage to Poison Element
    					    RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,	 	// Damage to Holy Element
    					    RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,	 	// Damage to Dark Element
    					    RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,	// Damage to Ghost Element
    					    RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET,		// Damage to Undead Element
    					    RDMOPT_HEAL_MODIFY_PERCENT, // Heal Power %
    					    RDMOPT_WEAPON_INDESTRUCTIBLE, // Weapon Instructible
    					    RDMOPT_DAMAGE_SIZE_PERFECT; // Size will be ignored
    					    // ToDo: // Recover 1000 of Damage lost from size penalties
    						
    // - Magical
    setarray .RandOpt1_M[0],RDMOPT_HP_DRAIN, // HP Drain
    					    RDMOPT_SP_DRAIN,	// SP Drain
    					    RDMOPT_VAR_HPACCELERATION,	// HP Regen
    					    RDMOPT_VAR_SPACCELERATION,	// SP Regen
    					    RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE,	// Perfect Dodge
    					    RDMOPT_VAR_AVOIDSUCCESSVALUE,	// Dodge
    					    RDMOPT_DEC_SP_CONSUMPTION,// Delay SP Cons
    					    RDMOPT_MDAMAGE_PROPERTY_NOTHING_TARGET,	 	// Damage to Neutral Element
    					    RDMOPT_MDAMAGE_PROPERTY_GROUND_TARGET,	 	// Damage to Earth Element
    					    RDMOPT_MDAMAGE_PROPERTY_FIRE_TARGET,	 	// Damage to Fire Element
    					    RDMOPT_MDAMAGE_PROPERTY_WATER_TARGET,	 	// Damage to Water Element
    					    RDMOPT_MDAMAGE_PROPERTY_WIND_TARGET,	 	// Damage to Wind Element
    					    RDMOPT_MDAMAGE_PROPERTY_POISON_TARGET,		// Damage to Poison Element
    					    RDMOPT_MDAMAGE_PROPERTY_SAINT_TARGET,		// Damage to Holy Element
    					    RDMOPT_MDAMAGE_PROPERTY_DARKNESS_TARGET,	// Damage to Dark Element
    					    RDMOPT_MDAMAGE_PROPERTY_TELEKINESIS_TARGET,	// Damage to Ghost Element
    					    RDMOPT_MDAMAGE_PROPERTY_UNDEAD_TARGET,	 	// Damage to Undead Element
    					    RDMOPT_HEAL_MODIFY_PERCENT, // Heal Power %
    					    RDMOPT_WEAPON_INDESTRUCTIBLE, // Weapon Instructible
    					    RDMOPT_DAMAGE_SIZE_PERFECT; // Size will be ignored
    					    // ToDo: // Recover 1000 of Damage lost from size penalties
    					  
    // - Ranged
    setarray .RandOpt1_R[0],RDMOPT_HP_DRAIN, // HP Drain
    					    RDMOPT_SP_DRAIN,	// SP Drain
    					    RDMOPT_VAR_HPACCELERATION,	// HP Regen
    					    RDMOPT_VAR_SPACCELERATION,	// SP Regen
    					    RDMOPT_VAR_PLUSAVOIDSUCCESSVALUE,	// Perfect Dodge
    					    RDMOPT_VAR_AVOIDSUCCESSVALUE,	// Dodge
    					    RDMOPT_DEC_SP_CONSUMPTION,// Delay SP Cons
    						RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,	 	// Damage to Neutral Element
    					    RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,		// Damage to Earth Element
    					    RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,		 	// Damage to Fire Element
    					    RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,		// Damage to Water Element
    					    RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,		 	// Damage to Wind Element
    					    RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,		// Damage to Poison Element
    					    RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,		// Damage to Holy Element
    					    RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,	 	// Damage to Dark Element
    					    RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,	// Damage to Ghost Element
    					    RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET,		// Damage to Undead Element
    					    RDMOPT_HEAL_MODIFY_PERCENT, // Heal Power %
    					    RDMOPT_WEAPON_INDESTRUCTIBLE, // Weapon Instructible
    					    RDMOPT_DAMAGE_SIZE_PERFECT; // Size will be ignored
    					    // ToDo: // Recover 1000 of Damage lost from size penalties
    
    // - Values
    // Note: When MinV and MaxV are the same, rand() will not be used!
    setarray .RandOpt1_P_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,0;
    setarray .RandOpt1_P_MaxV[0],3,3,20,20,5,5,20,20,20,20,20,20,20,20,20,20,20,20,0,0;
    setarray .RandOpt1_M_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,0;
    setarray .RandOpt1_M_MaxV[0],3,3,20,20,5,5,20,20,20,20,20,20,20,20,20,20,20,20,0,0;
    setarray .RandOpt1_R_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,20,0,0;
    setarray .RandOpt1_R_MaxV[0],3,3,20,20,5,5,20,20,20,20,20,20,20,20,20,20,20,20,0,0;
    
    // ========= Random Option Slot 2 ========= 
    // - Physical
    setarray .RandOpt2_P[0],RDMOPT_RACE_DAMAGE_NOTHING,	// Damage to Neutral Race
    					    RDMOPT_RACE_DAMAGE_UNDEAD,	// Damage to Undead Race
    					    RDMOPT_RACE_DAMAGE_ANIMAL,	// Damage to Animal Race
    					    RDMOPT_RACE_DAMAGE_PLANT,	// Damage to Plant Race
    					    RDMOPT_RACE_DAMAGE_INSECT,	// Damage to Insect Race
    					    RDMOPT_RACE_DAMAGE_FISHS,	// Damage to Fish Race
    					    RDMOPT_RACE_DAMAGE_DEVIL,	// Damage to Demon Race
    					    RDMOPT_RACE_DAMAGE_HUMAN,	// Damage to Human Race
    					    RDMOPT_RACE_DAMAGE_ANGEL,	// Damage to Angel Race
    					    RDMOPT_RACE_DAMAGE_DRAGON,	// Damage to Dragon Race
    						RDMOPT_RACE_IGNORE_DEF_PERCENT_NOTHING,	// Bypass DEF of Neutral Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_UNDEAD,	// Bypass DEF of Undead Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANIMAL,	// Bypass DEF of Animal Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT,	// Bypass DEF of Plant Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_INSECT,	// Bypass DEF of Insect Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_FISHS,	// Bypass DEF of Fish Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DEVIL,	// Bypass DEF of Demon Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN,	// Bypass DEF of Human Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANGEL,	// Bypass DEF of Angel Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DRAGON,	// Bypass DEF of Dragon Race
    					    RDMOPT_CLASS_DAMAGE_NORMAL_TARGET,	// Bypass DEF of Normal Class Enemies
    					    RDMOPT_CLASS_DAMAGE_BOSS_TARGET; // Damage to Boss monsters
    						
    // - Magical
    setarray .RandOpt2_M[0],RDMOPT_RACE_MDAMAGE_NOTHING,// Damage to Neutral Race
    					    RDMOPT_RACE_MDAMAGE_UNDEAD,	// Damage to Undead Race
    					    RDMOPT_RACE_MDAMAGE_ANIMAL,	// Damage to Animal Race
    					    RDMOPT_RACE_MDAMAGE_PLANT,	// Damage to Plant Race
    					    RDMOPT_RACE_MDAMAGE_INSECT,	// Damage to Insect Race
    					    RDMOPT_RACE_MDAMAGE_FISHS,	// Damage to Fish Race
    					    RDMOPT_RACE_MDAMAGE_DEVIL,	// Damage to Devil Race
    					    RDMOPT_RACE_MDAMAGE_HUMAN,	// Damage to Human Race
    					    RDMOPT_RACE_MDAMAGE_ANGEL,	// Damage to Angel Race
    					    RDMOPT_RACE_MDAMAGE_DRAGON,	// Damage to Dragon Race
    						RDMOPT_RACE_IGNORE_MDEF_PERCENT_NOTHING,	// Bypass MDEF of Neutral Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_UNDEAD,	// Bypass MDEF of Undead Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANIMAL,	// Bypass MDEF of Animal Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_PLANT,	// Bypass MDEF of Plant Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_INSECT,	// Bypass MDEF of Insect Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_FISHS,	// Bypass MDEF of Fish Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_DEVIL,	// Bypass MDEF of Demon Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_HUMAN,	// Bypass MDEF of Human Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_ANGEL,	// Bypass MDEF of Angel Race
    					    RDMOPT_RACE_IGNORE_MDEF_PERCENT_DRAGON,	// Bypass MDEF of Dragon Race
    						RDMOPT_CLASS_MDAMAGE_NORMAL,	// Bypass MDEF of Normal Class Enemies
    					    RDMOPT_CLASS_MDAMAGE_BOSS; // Damage to Boss monsters
    					  
    // - Ranged
    setarray .RandOpt2_R[0],RDMOPT_RACE_DAMAGE_NOTHING,	// Damage to Neutral Race
    					    RDMOPT_RACE_DAMAGE_UNDEAD,	// Damage to Undead Race
    					    RDMOPT_RACE_DAMAGE_ANIMAL,	// Damage to Animal Race
    					    RDMOPT_RACE_DAMAGE_PLANT,	// Damage to Plant Race
    					    RDMOPT_RACE_DAMAGE_INSECT,	// Damage to Insect Race
    					    RDMOPT_RACE_DAMAGE_FISHS,	// Damage to Fish Race
    					    RDMOPT_RACE_DAMAGE_DEVIL,	// Damage to Demon Race
    					    RDMOPT_RACE_DAMAGE_HUMAN,	// Damage to Human Race
    					    RDMOPT_RACE_DAMAGE_ANGEL,	// Damage to Angel Race
    					    RDMOPT_RACE_DAMAGE_DRAGON,	// Damage to Dragon Race
    						RDMOPT_RACE_IGNORE_DEF_PERCENT_NOTHING,	// Bypass DEF of Neutral Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_UNDEAD,	// Bypass DEF of Undead Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANIMAL,	// Bypass DEF of Animal Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_PLANT,	// Bypass DEF of Plant Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_INSECT,	// Bypass DEF of Insect Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_FISHS,	// Bypass DEF of Fish Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DEVIL,	// Bypass DEF of Demon Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_HUMAN,	// Bypass DEF of Human Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_ANGEL,	// Bypass DEF of Angel Race
    					    RDMOPT_RACE_IGNORE_DEF_PERCENT_DRAGON,	// Bypass DEF of Dragon Race
    					    RDMOPT_CLASS_DAMAGE_NORMAL_TARGET,	// Bypass DEF of Normal Class Enemies
    					    RDMOPT_CLASS_DAMAGE_BOSS_TARGET; // Damage to Boss monsters
    
    // - Values
    // Note: When MinV and MaxV are the same, rand() will not be used!
    setarray .RandOpt2_P_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,20;
    setarray .RandOpt2_P_MaxV[0],20,20,20,20,20,20,20,20,20,20,30,30,30,30,30,30,30,30,30,30,25,20;
    setarray .RandOpt2_M_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,20;
    setarray .RandOpt2_M_MaxV[0],20,20,20,20,20,20,20,20,20,20,30,30,30,30,30,30,30,30,30,30,25,20;
    setarray .RandOpt2_R_MinV[0],1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,20;
    setarray .RandOpt2_R_MaxV[0],20,20,20,20,20,20,20,20,20,20,30,30,30,30,30,30,30,30,30,30,25,20;
    
    // ========= Random Option Slot 3 ========= 
    // - Physical
    setarray .RandOpt3_P[0],RDMOPT_VAR_STRAMOUNT, // STR
    					    RDMOPT_VAR_AGIAMOUNT, // AGI
    					    RDMOPT_VAR_VITAMOUNT, // VIT
    					    RDMOPT_VAR_INTAMOUNT, // INT
    					    RDMOPT_VAR_DEXAMOUNT, // DEX
    					    RDMOPT_VAR_LUKAMOUNT, // LUK
    					    RDMOPT_VAR_ATTPOWER,  // ATK
    					    RDMOPT_VAR_CRITICALSUCCESSVALUE, // Crit Chance
    					    RDMOPT_DAMAGE_CRI_TARGET,	// Crit Damage %
    					    RDMOPT_VAR_PLUSASPDPERCENT,	// ASPD %
    						RDMOPT_DEC_SPELL_CAST_TIME,	// Variable Cast Time -%
    					    RDMOPT_DEC_SPELL_DELAY_TIME,// Cast Delay -%
    					    RDMOPT_DEC_SP_CONSUMPTION;	// Skill SP Cost -%
    						
    // - Magical
    setarray .RandOpt3_M[0],RDMOPT_VAR_STRAMOUNT, // STR
    					    RDMOPT_VAR_AGIAMOUNT, // AGI
    					    RDMOPT_VAR_VITAMOUNT, // VIT
    					    RDMOPT_VAR_INTAMOUNT, // INT
    					    RDMOPT_VAR_DEXAMOUNT, // DEX
    					    RDMOPT_VAR_LUKAMOUNT, // LUK
    					    RDMOPT_VAR_ATTMPOWER, // MATK
    						RDMOPT_DEC_SPELL_CAST_TIME,	// Variable Cast Time -%
    					    RDMOPT_DEC_SPELL_DELAY_TIME,// Cast Delay -%
    					    RDMOPT_DEC_SP_CONSUMPTION;	// Skill SP Cost -%
    					  
    // - Ranged
    setarray .RandOpt3_R[0],RDMOPT_VAR_STRAMOUNT, // STR
    					    RDMOPT_VAR_AGIAMOUNT, // AGI
    					    RDMOPT_VAR_VITAMOUNT, // VIT
    					    RDMOPT_VAR_INTAMOUNT, // INT
    					    RDMOPT_VAR_DEXAMOUNT, // DEX
    					    RDMOPT_VAR_LUKAMOUNT, // LUK
    					    RDMOPT_VAR_ATTPOWER,  // ATK
    						RDMOPT_VAR_ATTMPOWER, // MATK
    					    RDMOPT_VAR_CRITICALSUCCESSVALUE, // Crit Chance
    					    RDMOPT_DAMAGE_CRI_TARGET,	// Crit Damage %
    					    RDMOPT_VAR_PLUSASPDPERCENT,	// ASPD %
    						RDMOPT_DEC_SPELL_CAST_TIME,	// Variable Cast Time -%
    					    RDMOPT_DEC_SPELL_DELAY_TIME,// Cast Delay -%
    					    RDMOPT_DEC_SP_CONSUMPTION,	// Skill SP Cost -%
    						RDMOPT_RANGE_ATTACK_DAMAGE_TARGET; // Ranged Damage +%
    
    // - Values
    // Note: When MinV and MaxV are the same, rand() will not be used!
    setarray .RandOpt3_P_MinV[0],1,1,1,1,1,1,4,10,1,1,1,1,1;
    setarray .RandOpt3_P_MaxV[0],10,10,10,10,10,10,25,19,20,5,5,5,5;
    setarray .RandOpt3_M_MinV[0],1,1,1,1,1,1,4,1,1,1;
    setarray .RandOpt3_M_MaxV[0],10,10,10,10,10,10,30,10,10,5;
    setarray .RandOpt3_R_MinV[0],1,1,1,1,1,1,4,4,10,1,1,1,5,5,1;
    setarray .RandOpt3_R_MaxV[0],10,10,10,10,10,10,25,20,19,20,5,20,20,5,8;
    end;
    }

     

  8. Hello, I need a help.. I'd like to make the Ghost Palace can be accessed by party member.., so maybe someone can tell how to configure the script to make it so?

     

    //===== rAthena Script =======================================
    //= Ghost Palace
    //===== Description: =========================================
    //= [Walkthrough Conversion]
    //= Ghost Palace Instance
    //===== Changelogs: ==========================================
    //= 1.0 First version. [Capuche]
    //============================================================
    
    prontera,171,152,5	script	Unpleasant Royal Guard#	4_M_SAKRAYROYAL,{
    	if (BaseLevel < 90) {
    		mes "[Unpleasant Royal Guard]";
    		mes "Althought I need help with a task, you are not strong enough to assist me, noob~!";
    		next;
    		mes "[Unpleasant Royal Guard]";
    		mes "Come back later when you have done some training and are at least level 90!";
    		close;
    	}
    	.@party_id = getcharid(1);
    	if (getcharid(0) != getpartyleader(.@party_id,2) || .@party_id < 1) {
    		mes "[Unpleasant Royal Guard]";
    		mes "I can only open the secret passage for party leaders. Please have your party leader talk to me.";
    		close;
    	}
    	switch( checkquest(1261,PLAYTIME) ) {
    	case -1:
    		break;
    	case 0:
    	case 1:
    		mes "[Unpleasant Royal Guard]";
    		mes "Have you found the princess yet?! Is she safe?";
    		close;
    	case 2:
    		mes "[Unpleasant Royal Guard]";
    		mes "The monsters around the secret passage have disappeared. Now is our chance to save the princess!";
    		erasequest 1261;// Cursed Swordman
    		close;
    	}
    	mes "[Unpleasant Royal Guard]";
    	mes "I need help, even from the likes of you.";
    	next;
    	mes "[Unpleasant Royal Guard]";
    	mes "In the middle of battle the princess disappeared while I was guarding the palace.";
    	next;
    	mes "[Unpleasant Royal Guard]";
    	mes "You run ahead and I will catch up. We must save her.";
    	next;
    	if (select( "I will help.", "This is not a good time." ) == 2) {
    		mes "[Unpleasant Royal Guard]";
    		mes "Even now all the royal guards are fighting and dying from the monsters.";
    		next;
    		mes "[Unpleasant Royal Guard]";
    		mes "We must, no matter how much fear grips our hearts, save the princess!";
    		close;
    	}
    	instance_create("Ghost Palace");
    	mes "[Unpleasant Royal Guard]";
    	mes "Thank you..";
    	mes "I will open the secret passage to the ^0000ffGhost Palace^000000.";
    	mes "Please be ready!";
    	close;
    }
    
    prontera,178,149,5	script	Interdimensional Device#dk	PORTAL,{
    	if (BaseLevel < 90) {
    		mes "[Unpleasant Royal Guard]";
    		mes "Althought I need help with a task, you are not strong enough to assist me, noob~!";
    		next;
    		mes "[Unpleasant Royal Guard]";
    		mes "Come back later when you have done some training and are at least level 90!";
    		close;
    	}
    	mes "[Unpleasant Royal Guard]";
    	mes "I can see the secret passage into the palace. Are you ready to save the princess?!";
    	next;
    	if (select( "Enter", "Stop" ) == 2) {
    		mes "[Unpleasant Royal Guard]";
    		mes "Even now all the royal guards are fighting and dying from the monsters.";
    		next;
    		mes "[Unpleasant Royal Guard]";
    		mes "We must, no matter how much fear grips our hearts, save the princess!";
    		close;
    	}
    	switch( checkquest(1261,PLAYTIME) ) {
    	case -1:
    		break;
    	case 0:
    	case 1:
    		mes "[Unpleasant Royal Guard]";
    		mes "The monsters that attacked the palace are wandering around the secret entrance. It would be very bad if they spotted us... Please wait.";
    		next;
    		mes "When the time limit for the entrance is up";
    		mes "let's try to re-enter.";
    		close;
    	case 2:
    		mes "^0000ffThe time limit for entering to the Curse of the Swordsman is finished. Please try to talk to the Unpleasent Royal Guard again..^000000";
    		erasequest 1261;// Cursed Swordman
    		close;
    	}
    	.@party_id = getcharid(1);
    	if (getcharid(0) != getpartyleader(.@party_id,2) || .@party_id < 1) {
    		mes "[Unpleasant Royal Guard]";
    		mes "I can only open the secret passage for party leaders. Please have your party leader talk to me.";
    		close;
    	}
    
    	.@md_name$ = "Ghost Palace";
    	switch( instance_enter(.@md_name$) ) {
    	case IE_OTHER:
    		mes "An unknown error occurred.";
    		close;
    	case IE_NOINSTANCE:
    		mes "^ff0000Inside the devices you see a dark hole. If you wish to enter you must to talk to the Unpleasent Royal Guard first.^000000";
    		close;
    	case IE_NOMEMBER:
    		mes "Only registered members can enter the " + .@md_name$ + " instance.";
    		close;
    	case IE_OK:
    		mapannounce "prontera", "" + strcharinfo(0) + " of the party, " + getpartyname(.@party_id) + ", is entering the Ghost Palace.", bc_map, 0x00ff99;
    		// warp "1@spa",42,196;
    		setquest 1261;// Cursed Swordman
    		end;
    	}
    }
    
    // 1st floor
    1@spa,41,204,5	script	King#dk	4_M_RUSKING,{
    	mes "[King]";
    	mes "You are hereby appointed as the personal guard to Princess Tiara. I trust your loyalty above all else.";
    	npctalk "King: You are hereby appointed as the personal guard to Princess Tiara. I trust your loyalty above all else.";
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "I will protect the princess with my life.";
    	npctalk "Lurid Royal Guard: I will protect the princess with my life.", instance_npcname("Lurid Royal Guard#dk");
    	next;
    	mes "[King]";
    	mes "The marriage arrangements are going as planned. The prince is here to meet with the princess.";
    	npctalk "King: The marriage arrangements are going as planned. The prince is here to meet with the princess.";
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "...Yes, your majesty.";
    	npctalk "Lurid Royal Guard: ...Yes, your majesty.", instance_npcname("Lurid Royal Guard#dk");
    	next;
    	mes "[King]";
    	mes "My gods, there are monsters in the castle! Get rid of them now!";
    	npctalk "King: My gods, there are monsters in the castle! Get rid of them now!";
    	close2;
    	donpcevent instance_npcname("#gp_control_1") + "::OnStart";
    	end;
    
    OnInstanceInit:
    	// 1: enabled potential double spawn (official), 0: disabled
    	'bool_double_spawn = 1;
    
    	'map_spa$ = instance_mapname("1@spa");
    
    	// warps
    	disablenpc instance_npcname("The second floor of Palace");
    	disablenpc instance_npcname("3rd floor in the palace");
    	disablenpc instance_npcname("4th floor in the palace");
    	disablenpc instance_npcname("5th floor of Palace");
    	disablenpc instance_npcname("Way out of Palace");
    
    	// first floor
    	disablenpc instance_npcname("#gp_control_1");
    
    	// second floor
    	disablenpc instance_npcname("Lurid Royal Guard#dk1");
    	disablenpc instance_npcname("Princess Tiara#dk");
    	disablenpc instance_npcname("#gp_control_2");
    
    	// 3rd floor
    	disablenpc instance_npcname("King#dk1");
    	disablenpc instance_npcname("Lurid Royal Guard#dk2");
    	disablenpc instance_npcname("Captain of the Guard#dk");
    	disablenpc instance_npcname("Soldier#dk1");
    	disablenpc instance_npcname("Soldier#dk2");
    	disablenpc instance_npcname("Soldier#dk3");
    	disablenpc instance_npcname("Lurid Royal Guard#dk3");
    	disablenpc instance_npcname("Thanatos Magic Trace#dk1");
    	disablenpc instance_npcname("#gp_control_3");
    
    	// 4th floor
    	disablenpc instance_npcname("#gp_control_4");
    	disablenpc instance_npcname("#gp_control_5");
    	disablenpc instance_npcname("Thanatos Magic Trace#dk2");
    	disablenpc instance_npcname("Visiting Prince#dk");
    	disablenpc instance_npcname("Lurid Royal Guard#dk4");
    	disablenpc instance_npcname("King's Corpse#dk");
    	disablenpc instance_npcname("Captain's Corpse#dk");
    	disablenpc instance_npcname("Soldier's Corpse#dk");
    	disablenpc instance_npcname("Soldier's Corpse#dk1");
    	disablenpc instance_npcname("Soldier's Corpse#dk2");
    	disablenpc instance_npcname("Soldier's Corpse#dk3");
    	disablenpc instance_npcname("Soldier's Corpse#dk4");
    
    	// 5th floor
    	disablenpc instance_npcname("#gp_control_6");
    	disablenpc instance_npcname("Princess Tiara#dk1");
    	disablenpc instance_npcname("Lurid Royal Guard#dk5");
    	disablenpc instance_npcname("King#dk11");
    	disablenpc instance_npcname("Sakray#dk");
    	disablenpc instance_npcname("Thanatos Magic Trace#dk3");
    	disablenpc instance_npcname("#tb");
    	disablenpc instance_npcname("#sv");
    	disablenpc instance_npcname("#tv");
    	end;
    }
    
    1@spa,42,201,1	script	Lurid Royal Guard#dk	4_M_SAKRAYROYAL,{ end; }
    
    1@spa,1,1,1	script	#gp_control_1	HIDDEN_WARP_NPC,{
    	end;
    OnStart:
    	enablenpc instance_npcname("#gp_control_1");
    	disablenpc instance_npcname("King#dk");
    	disablenpc instance_npcname("Lurid Royal Guard#dk");
    	initnpctimer;
    	end;
    OnTimer2000:
    	.@label$ = instance_npcname("#gp_control_1") + "::OnMyMobDead1";
    	monster 'map_spa$,50,194,"Cursed Soldier",2948,1, .@label$;		// CURSED_SOLDIER
    	monster 'map_spa$,34,208,"Cursed Soldier",2948,1, .@label$;		// CURSED_SOLDIER
    	monster 'map_spa$,32,194,"Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	monster 'map_spa$,52,209,"Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	stopnpctimer;
    	end;
    OnMyMobDead1:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead1") < (1 + 'bool_double_spawn)) {
    		deltimer instance_npcname("#gp_control_1") + "::OnSpawn1";	// stop double spawn if timer is running
    		addtimer 2000, instance_npcname("#gp_control_1") + "::OnSpawn1";
    	}
    	end;
    OnSpawn1:
    	.@label$ = instance_npcname("#gp_control_1") + "::OnMyMobDead2";
    	monster 'map_spa$,37,182,"Cursed Soldier",2948,1, .@label$;		// CURSED_SOLDIER
    	monster 'map_spa$,46,182,"Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	end;
    OnMyMobDead2:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead2") < 1) {
    		deltimer instance_npcname("#gp_control_1") + "::OnSpawn1";	// stop double spawn if timer is running
    		deltimer instance_npcname("#gp_control_1") + "::OnSpawn2";
    		addtimer 2000, instance_npcname("#gp_control_1") + "::OnSpawn2";
    	}
    	end;
    OnSpawn2:
    	.@label$ = instance_npcname("#gp_control_1") + "::OnMyMobDead3";
    	monster 'map_spa$,30,200,"Cursed Soldier",2948,1, .@label$;		// CURSED_SOLDIER
    	monster 'map_spa$,51,200,"Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	monster 'map_spa$,53,199,"Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	end;
    OnMyMobDead3:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead3") < 1) {
    		mapannounce 'map_spa$, "The passage on the 2nd floor in the palace of ghost is open .", bc_map,0xFFFF00;
    		enablenpc instance_npcname("The second floor of Palace");
    		enablenpc instance_npcname("Lurid Royal Guard#dk1");
    		enablenpc instance_npcname("Princess Tiara#dk");
    	}
    	end;
    }
    
    // 2nd floor
    1@spa,132,122,7	script	Lurid Royal Guard#dk1	4_M_SAKRAYROYAL,{
    	.@tiara$ = instance_npcname("Princess Tiara#dk");
    	cutin "npc-tiara.bmp",3;
    	mes "[Lurid Royal Guard]";
    	mes "Your highness, the King has invited a prince from a neighboring country to be your betrothed. Be ready to meet him...";
    	npctalk "Lurid Royal Guard: Your highness, the King has invited a prince from a neighboring country to be your betrothed. Be ready to meet him...";
    	next;
    	mes "[Princess Tiara]";
    	mes "If...If a marriage is arranged what should I do?";
    	npctalk "Princess Tiara: If...If a marriage is arranged what should I do?", .@tiara$;
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "The only thing I can do is protect you from physical harm.";
    	npctalk "Lurid Royal Guard: The only thing I can do is protect you from physical harm.";
    	next;
    	mes "[Princess Tiara]";
    	mes "Then, what can I do?";
    	npctalk "Princess Tiara: Then, what can I do?", .@tiara$;
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "You must decide that for yourself your highness...";
    	npctalk "Lurid Royal Guard: You must decide that for yourself your highness...";
    	next;
    	mes "[Princess Tiara]";
    	mes "Would it be easier for you if I were married and sent off to another country?";
    	npctalk "Princess Tiara: Would it be easier for you if I were married and sent off to another country?", .@tiara$;
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "I will always stand by you and protect you forever.";
    	npctalk "Lurid Royal Guard: I will always stand by you and protect you forever.";
    	cutin "npc-tiara.bmp",255;
    	next;
    	mes "[Princess Tiara]";
    	mes "Monsters have gotten inside the castle? Please, protect me!";
    	npctalk "Princess Tiara: Monsters have gotten inside the castle? Please, protect me!", .@tiara$;
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "Stay behind me. Let's go!";
    	npctalk "Lurid Royal Guard: Stay behind me. Let's go!";
    	close2;
    	donpcevent instance_npcname("#gp_control_2") + "::OnStart";
    	end;
    }
    
    1@spa,135,125,3	duplicate(Lurid Royal Guard#dk)	Princess Tiara#dk	4_F_MAYSEL
    
    1@spa,1,1,1	script	#gp_control_2	HIDDEN_WARP_NPC,{
    	end;
    OnStart:
    	enablenpc instance_npcname("#gp_control_2");
    	disablenpc instance_npcname("Lurid Royal Guard#dk1");
    	disablenpc instance_npcname("Princess Tiara#dk");
    	disablenpc instance_npcname("The second floor of Palace");
    
    	killmonster 'map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead1";
    	killmonster 'map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead2";
    	killmonster 'map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead3";
    	disablenpc instance_npcname("#gp_control_1");
    	initnpctimer;
    	end;
    OnTimer2000:
    	.@label$ = instance_npcname("#gp_control_2") + "::OnMyMobDead1";
    	monster 'map_spa$,135,116,"Broken Promise",2950,1, .@label$;	// BROKEN_MIND
    	monster 'map_spa$,110,120,"Broken Promise",2950,1, .@label$;	// BROKEN_MIND
    	monster 'map_spa$,122,112,"Floating Sorrow",2951,1, .@label$;	// FLOATING_WORD
    	monster 'map_spa$,121,129,"Unfulfilled Love",2952,1, .@label$;	// LIKE_LOVE
    	stopnpctimer;
    	end;
    OnMyMobDead1:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_2") + "::OnMyMobDead1") < 1) {
    		sleep 2000;
    		.@label$ = instance_npcname("#gp_control_2") + "::OnMyMobDead2";
    		monster 'map_spa$,120,103,"Broken Promise",2950,1, .@label$;	// BROKEN_MIND
    		monster 'map_spa$,115,137,"Floating Sorrow",2951,1, .@label$;	// FLOATING_WORD
    		monster 'map_spa$,103,130,"Unfulfilled Love",2952,1, .@label$;	// LIKE_LOVE
    	}
    	end;
    OnMyMobDead2:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_2") + "::OnMyMobDead2") < 1) {
    		sleep 2000;
    		.@label$ = instance_npcname("#gp_control_2") + "::OnMyMobDead3";
    		monster 'map_spa$,98,119,"Floating Sorrow",2951,1, .@label$;	// FLOATING_WORD
    		monster 'map_spa$,98,120,"Floating Sorrow",2951,1, .@label$;	// FLOATING_WORD
    		monster 'map_spa$,103,109,"Unfulfilled Love",2952,1, .@label$;	// LIKE_LOVE
    	}
    	end;
    OnMyMobDead3:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_2") + "::OnMyMobDead3") < 1) {
    		mapannounce 'map_spa$, "The passage on the 3rd floor of the palace is open.", bc_map,0xFFFF00;
    		enablenpc instance_npcname("3rd floor in the palace");
    		enablenpc instance_npcname("King#dk1");
    		enablenpc instance_npcname("Lurid Royal Guard#dk2");
    		enablenpc instance_npcname("Captain of the Guard#dk");
    		enablenpc instance_npcname("Soldier#dk1");
    		enablenpc instance_npcname("Soldier#dk2");
    		enablenpc instance_npcname("Soldier#dk3");
    		disablenpc instance_npcname("#gp_control_2");
    	}
    	end;
    }
    
    // 3rd floor
    1@spa,32,54,1	script	King#dk1	4_M_RUSKING,{
    	mes "[King]";
    	mes "It was you who brought the monsters here! You want to get rid of me and have the princess for yourself?";
    	npctalk "King: It was you who brought the monsters here! You want to get rid of me and have the princess for yourself?";
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "It is a trap your majesty! You must trust me!";
    	npctalk "Lurid Royal Guard: It is a trap your majesty! You must trust me!", instance_npcname("Lurid Royal Guard#dk2");
    	next;
    	mes "[King]";
    	mes "Shut up! You've betrayed me! I trusted you... you must pay for your disgrace.";
    	npctalk "King: Shut up! You've betrayed me! I trusted you... you must pay for your disgrace.";
    	next;
    	mes "[King]";
    	mes "You will suffer for the rest of your life.";
    	npctalk "King: You will suffer for the rest of your life.";
    	close2;
    	disablenpc instance_npcname("3rd floor in the palace");
    	disablenpc instance_npcname("King#dk1");
    	disablenpc instance_npcname("Captain of the Guard#dk");
    	disablenpc instance_npcname("Soldier#dk1");
    	disablenpc instance_npcname("Soldier#dk2");
    	disablenpc instance_npcname("Soldier#dk3");
    	disablenpc instance_npcname("Lurid Royal Guard#dk2");
    	donpcevent instance_npcname("Thanatos Magic Trace#dk1") + "::OnStart";
    	end;
    }
    
    1@spa,35,56,5	script	Thanatos Magic Trace#dk1	4_TRACE,{
    	end;
    OnStart:
    	enablenpc instance_npcname("Thanatos Magic Trace#dk1");
    	enablenpc instance_npcname("Lurid Royal Guard#dk3");
    	initnpctimer;
    	end;
    OnTimer5000:
    	npctalk "Ominous Voice: Oh, faithful royal guard, you are trapped.";
    	end;
    OnTimer8000:
    	npctalk "Ominous Voice: The conspiracy in the palace has your princess in grave danger...";
    	end;
    OnTimer12000:
    	npctalk "Lurid Royal Guard: Who are you? Show yourself!", instance_npcname("Lurid Royal Guard#dk3");
    	end;
    OnTimer15000:
    	npctalk "Ominous Voice: Ah... so you do you hear me?";
    	end;
    OnTimer20000:
    	npctalk "Lurid Royal Guard: ...?", instance_npcname("Lurid Royal Guard#dk3");
    	end;
    OnTimer23000:
    	npctalk "Ominous Voice: I can give you unlimited power. If you make a pact with me.";
    	end;
    OnTimer28000:
    	npctalk "Lurid Royal Guard: I..I...", instance_npcname("Lurid Royal Guard#dk3");
    	end;
    OnTimer33000:
    	npctalk "Thanatos Magic Trace: Kukuku... What do you want boy?";
    	end;
    OnTimer34000:
    	stopnpctimer;
    	disablenpc instance_npcname("Thanatos Magic Trace#dk1");
    	disablenpc instance_npcname("Lurid Royal Guard#dk3");
    	donpcevent instance_npcname("#gp_control_3") + "::OnStart";
    	end;
    }
    
    1@spa,28,52,7	duplicate(Lurid Royal Guard#dk)	Captain of the Guard#dk	4_M_KY_KNT
    1@spa,25,53,7	duplicate(Lurid Royal Guard#dk)	Soldier#dk1	4_M_CRU_SOLD
    1@spa,34,53,1	duplicate(Lurid Royal Guard#dk)	Soldier#dk2	4_M_CRU_SOLD
    1@spa,30,52,7	duplicate(Lurid Royal Guard#dk)	Soldier#dk3	4_M_KY_SOLD
    1@spa,30,58,5	duplicate(Lurid Royal Guard#dk)	Lurid Royal Guard#dk2	4_M_SAKRAY_TIED
    1@spa,31,57,5	duplicate(Lurid Royal Guard#dk)	Lurid Royal Guard#dk3	4_M_SAKRAY_TIED
    
    1@spa,1,1,1	script	#gp_control_3	HIDDEN_WARP_NPC,{
    	end;
    OnStart:
    	enablenpc instance_npcname("#gp_control_3");
    	initnpctimer;
    	end;
    OnTimer2000:
    	.@label$ = instance_npcname("#gp_control_3") + "::OnMyMobDead1";
    	monster 'map_spa$,31,57, "Regretful Memory",2953,1, .@label$; 	// CURSED_MEMORY
    	monster 'map_spa$,59,24, "Regretful Memory",2953,1, .@label$; 	// CURSED_MEMORY
    	monster 'map_spa$,23,40, "Wasted Friendship",2955,1, .@label$; 	// OLD_FRIENDSHIP
    	monster 'map_spa$,54,45, "Tarnished Oath",2954,1, .@label$; 	// COLORLESS_VOW
    	monster 'map_spa$,26,20, "Tarnished Oath",2954,1, .@label$; 	// COLORLESS_VOW
    	stopnpctimer;
    	end;
    OnMyMobDead1:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead1") < 1)
    		addtimer 2000, instance_npcname("#gp_control_3") + "::OnSpawn1";
    	end;
    OnSpawn1:
    	.@label$ = instance_npcname("#gp_control_3") + "::OnMyMobDead2";
    	monster 'map_spa$,30,52, "Tarnished Oath",2954,1, .@label$; 	// COLORLESS_VOW
    	monster 'map_spa$,58,58, "Wasted Friendship",2955,1, .@label$; 	// OLD_FRIENDSHIP
    	monster 'map_spa$,54,24, "Regretful Memory",2953,1, .@label$; 	// CURSED_MEMORY
    	end;
    OnMyMobDead2:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead2") < (1 + 'bool_double_spawn)) {
    		deltimer instance_npcname("#gp_control_3") + "::OnAnnounce";
    		addtimer 500, instance_npcname("#gp_control_3") + "::OnAnnounce";
    	}
    	end;
    OnAnnounce:
    	mapannounce 'map_spa$, "The passage on the 4th floor of the palace is open.", bc_map,0xFFFF00;
    	enablenpc instance_npcname("4th floor in the palace");
    	deltimer instance_npcname("#gp_control_3") + "::OnSpawn2";	// stop double spawn if timer is running
    	addtimer 2000, instance_npcname("#gp_control_3") + "::OnSpawn2";
    	end;
    OnSpawn2:
    	donpcevent instance_npcname("#gp_control_4") + "::OnStart";
    	// 35 mobs
    	.@label$ = instance_npcname("#gp_control_3") + "::OnMyMobDead3";
    	monster 'map_spa$,67,46, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "You are trapped...";
    	monster 'map_spa$,62,48, "Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,57,46, "Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,51,48, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "Faithful royal guard...";
    	monster 'map_spa$,56,55, "Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,62,56, "Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "You are trapped...";
    	monster 'map_spa$,66,58, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "You put your princess in grave danger...";
    	monster 'map_spa$,66,64, "Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Faithful royal guard...";
    	monster 'map_spa$,62,65, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,57,67, "Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "You are trapped...";
    	monster 'map_spa$,49,66, "Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,44,66, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,45,20, "Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,38,20, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "You are trapped...";
    	monster 'map_spa$,32,20, "Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,51,22, "Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,26,34,"Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,21,37,"Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Faithful royal guard...";
    	monster 'map_spa$,18,39,"Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,21,45,"Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,23,49,"Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "You are trapped...";
    	monster 'map_spa$,25,54,"Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,29,54,"Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "You put your princess in grave danger...";
    	monster 'map_spa$,56,39,"Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,61,36,"Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Faithful royal guard...";
    	monster 'map_spa$,66,38,"Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away quickly!";
    	monster 'map_spa$,42,54,"Wasted Friendship",2955,1, .@label$;	// OLD_FRIENDSHIP
    	unittalk $@mobid[0], "Run away!";
    	monster 'map_spa$,35,54,"Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "You are trapped...";
    	monster 'map_spa$,43,60,"Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "Faithful royal guard...";
    	monster 'map_spa$,30,25,"Tarnished Oath",2954,1, .@label$;		// COLORLESS_VOW
    	unittalk $@mobid[0], "You put your princess in grave danger...";
    	monster 'map_spa$,30,31,"Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	unittalk $@mobid[0], "You are trapped...";
    	monster 'map_spa$,65,64, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	monster 'map_spa$,65,67, "Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	monster 'map_spa$,18,43,"Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	monster 'map_spa$,21,43,"Regretful Memory",2953,1, .@label$;	// CURSED_MEMORY
    	end;
    OnMyMobDead3:
    	end;
    }
    
    // 4th floor
    1@spa,1,1,1	script	#gp_control_4	HIDDEN_WARP_NPC,{
    	end;
    OnStart:
    	enablenpc instance_npcname("#gp_control_4");
    	.@label$ = instance_npcname("#gp_control_4") + "::OnMyMobDead1";
    	monster 'map_spa$,215,194, "Sweet Slaughter",2956,1, .@label$;		// SWEET_SLAUGHTER
    	monster 'map_spa$,194,178, "Sweet Slaughter",2956,1, .@label$;		// SWEET_SLAUGHTER
    	monster 'map_spa$,191,211, "Sweet Slaughter",2956,1, .@label$;		// SWEET_SLAUGHTER
    	monster 'map_spa$,185,203, "Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	monster 'map_spa$,209,218, "Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	end;
    OnMyMobDead1:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead1") < (1 + 'bool_double_spawn)) {
    		deltimer instance_npcname("#gp_control_4") + "::OnSpawn1";
    		addtimer 2000, instance_npcname("#gp_control_4") + "::OnSpawn1";
    	}
    	end;
    OnSpawn1:
    	.@label$ = instance_npcname("#gp_control_4") + "::OnMyMobDead2";
    	monster 'map_spa$,189,192, "Cursed Gatekeeper",2949,1, .@label$;	// CURSED_SENTINEL
    	monster 'map_spa$,211,209, "Sweet Slaughter",2956,1, .@label$;		// SWEET_SLAUGHTER
    	end;
    OnMyMobDead2:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead2") < 1) {
    		enablenpc instance_npcname("Thanatos Magic Trace#dk2");
    		enablenpc instance_npcname("Visiting Prince#dk");
    		enablenpc instance_npcname("Lurid Royal Guard#dk4");
    		enablenpc instance_npcname("King's Corpse#dk");
    		enablenpc instance_npcname("Captain's Corpse#dk");
    		enablenpc instance_npcname("Soldier's Corpse#dk");
    		enablenpc instance_npcname("Soldier's Corpse#dk1");
    		enablenpc instance_npcname("Soldier's Corpse#dk2");
    		enablenpc instance_npcname("Soldier's Corpse#dk3");
    		enablenpc instance_npcname("Soldier's Corpse#dk4");
    	}
    	end;
    }
    
    1@spa,199,214,1	script	Lurid Royal Guard#dk4	4_M_SAKRAYROYAL,{
    	.@prince$ = instance_npcname("Visiting Prince#dk");
    	mes "[Lurid Royal Guard]";
    	mes "Where is Princess Tiara?";
    	npctalk "Lurid Royal Guard: Where is Princess Tiara?";
    	next;
    	mes "[Visiting Prince]";
    	mes "You are too late... but you brought what I was looking for. Thanks for your help.";
    	npctalk "Visiting Prince: You are too late... but you brought what I was looking for. Thanks for your help.", .@prince$;
    	next;
    	mes "[Visiting Prince]";
    	mes "Cursed Thanatos Magic Trace! Are you ready to have a new master?";
    	npctalk "Visiting Prince: Cursed Thanatos Magic Trace! Are you ready to have a new master?", .@prince$;
    	next;
    	cutin "tartanos.bmp",3;
    	mes "[Thanatos Magic Trace]";
    	mes "How dare you!";
    	npctalk "Thanatos Magic Trace: How dare you!", instance_npcname("Thanatos Magic Trace#dk2");
    	next;
    	mes "[Visiting Prince]";
    	mes "aah, aah !!!";
    	npctalk "Visiting Prince: Aah, aah!!!", .@prince$;
    	donpcevent instance_npcname("#gp_control_5") + "::OnStart";
    	close2;
    	cutin "",255;
    	end;
    }
    1@spa,201,214,1	duplicate(Lurid Royal Guard#dk)	Thanatos Magic Trace#dk2	CLEAR_NPC
    1@spa,197,218,5	duplicate(Lurid Royal Guard#dk)	Visiting Prince#dk	4_M_KNIGHT_SILVER
    1@spa,194,214,5	duplicate(Lurid Royal Guard#dk)	King's Corpse#dk	4_M_TRISTAN
    1@spa,211,194,3	duplicate(Lurid Royal Guard#dk)	Captain's Corpse#dk	4_M_LIEMAN
    1@spa,201,198,1	duplicate(Lurid Royal Guard#dk)	Soldier's Corpse#dk	4_M_DIEMAN
    1@spa,197,190,1	duplicate(Lurid Royal Guard#dk)	Soldier's Corpse#dk1	4_M_DIEMAN
    1@spa,191,207,7	duplicate(Lurid Royal Guard#dk)	Soldier's Corpse#dk2	4_M_DIEMAN
    1@spa,206,209,7	duplicate(Lurid Royal Guard#dk)	Soldier's Corpse#dk3	4_M_DIEMAN
    1@spa,189,195,1	duplicate(Lurid Royal Guard#dk)	Soldier's Corpse#dk4	4_M_DIEMAN
    
    1@spa,1,1,1	script	#gp_control_5	HIDDEN_WARP_NPC,{
    	end;
    OnStart:
    	enablenpc instance_npcname("#gp_control_5");
    	disablenpc instance_npcname("Thanatos Magic Trace#dk2");
    	disablenpc instance_npcname("Visiting Prince#dk");
    	disablenpc instance_npcname("Lurid Royal Guard#dk4");
    	disablenpc instance_npcname("King's Corpse#dk");
    	disablenpc instance_npcname("Captain's Corpse#dk");
    	disablenpc instance_npcname("Soldier's Corpse#dk");
    	disablenpc instance_npcname("Soldier's Corpse#dk1");
    	disablenpc instance_npcname("Soldier's Corpse#dk2");
    	disablenpc instance_npcname("Soldier's Corpse#dk3");
    	disablenpc instance_npcname("Soldier's Corpse#dk4");
    	sleep 1000;
    	.@label$ = instance_npcname("#gp_control_5") + "::OnMyMobDead";
    	monster 'map_spa$,198,218, "Torturous Redeemer",2959,1, .@label$;	// TORTUROUS_REDEEMER
    	monster 'map_spa$,198,182, "Sweet Slaughter",2956,1, .@label$;		// SWEET_SLAUGHTER
    	end;
    OnMyMobDead:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_5") + "::OnMyMobDead") < 1) {
    		deltimer instance_npcname("#gp_control_4") + "::OnSpawn1";	// stop double spawn if timer is running
    		mapannounce 'map_spa$, "The passage on the 5th floor of the palace is open.", bc_map,0xFFFF00;
    		disablenpc instance_npcname("4th floor in the palace");
    		enablenpc instance_npcname("5th floor of Palace");
    		enablenpc instance_npcname("Princess Tiara#dk1");
    		enablenpc instance_npcname("Lurid Royal Guard#dk5");
    
    		killmonster 'map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead2";
    		killmonster 'map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead3";
    		disablenpc instance_npcname("#gp_control_3");
    	}
    	end;
    }
    
    // 5th floor
    1@spa,216,43,3	script	Princess Tiara#dk1	4_F_MAYSEL,{
    	.@guard$ = instance_npcname("Lurid Royal Guard#dk5");
    	mes "[Princess Tiara]";
    	mes "You kept your promise.";
    	npctalk "Princess Tiara: You kept your promise.";
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "princess!";
    	npctalk "Lurid Royal Guard: Princess!", .@guard$;
    	next;
    	cutin "npc-tiara.bmp",3;
    	mes "[Princess Tiara]";
    	mes "Thank you... now I can rest beside you...";
    	npctalk "Princess Tiara: Thank you... now I can rest beside you...";
    	next;
    	mes "[Lurid Royal Guard]";
    	mes "No..No!!!!!";
    	npctalk "Lurid Royal Guard: No..No!!!!!", .@guard$;
    	next;
    	mes "[The voice of Princess Tiara]";
    	mes "I want to be with you forever in peace...forever...";
    	npctalk "Princess Tiara: I want to be with you forever in peace...forever...";
    	next;
    	cutin "b-tiara.BMP",3;
    	mes "[Lurid Royal Guard]";
    	mes "no.....Ahh ahh ahh!!!!~!";
    	npctalk "Lurid Royal Guard: no.....Ahh ahh ahh!!!!~!", .@guard$;
    	next;
    	mes "[The voice of Princess Tiara]";
    	mes "I love you...";
    	npctalk "Princess Tiara: I love you...";
    	cutin "",255;
    	close2;
    	donpcevent instance_npcname("#gp_control_6") + "::OnStart";
    	end;
    }
    
    1@spa,213,42,7	duplicate(Lurid Royal Guard#dk)	Lurid Royal Guard#dk5	4_M_SAKRAYROYAL
    
    1@spa,1,1,1	script	#gp_control_6	HIDDEN_WARP_NPC,{
    	end;
    OnStart:
    	enablenpc instance_npcname("#gp_control_6");
    	disablenpc instance_npcname("Princess Tiara#dk1");
    	disablenpc instance_npcname("Lurid Royal Guard#dk5");
    
    	killmonster 'map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead1";
    	killmonster 'map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead2";
    	killmonster 'map_spa$, instance_npcname("#gp_control_5") + "::OnMyMobDead";
    	disablenpc instance_npcname("#gp_control_4");
    	disablenpc instance_npcname("#gp_control_5");
    	disablenpc instance_npcname("5th floor of Palace");
    	sleep 2000;
    	.@label$ = instance_npcname("#gp_control_6") + "::OnMyMobDead1";
    	monster 'map_spa$,217,52, "Forgotten Name" ,2957,1, .@label$;	// FORGOTTEN_NAME
    	unittalk $@mobid[0], "Wake up! look at us... We are monsters?";
    	monster 'map_spa$,190,21, "Tarnished Oath" ,2954,1, .@label$;	// COLORLESS_VOW
    	unittalk $@mobid[0], "Sakray killed the King and tried to kill us!";
    	monster 'map_spa$,198,49, "Tarnished Oath" ,2954,1, .@label$;	// COLORLESS_VOW
    	unittalk $@mobid[0], "What is this..??";
    	monster 'map_spa$,212,28, "Fatal Days" ,2958,1, .@label$;		// FATAL_DAYS
    	unittalk $@mobid[0], "Sakray killed a princess!";
    	end;
    OnMyMobDead1:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead1") < 1) {
    		sleep 2000;
    		.@label$ = instance_npcname("#gp_control_6") + "::OnMyMobDead2";
    		monster 'map_spa$,217,43, "Forgotten Name" ,2957,1, .@label$;	// FORGOTTEN_NAME
    		unittalk $@mobid[0], "Wake up! look at us... We are monsters?";
    		monster 'map_spa$,193,24, "Forgotten Name" ,2957,1, .@label$;	// FORGOTTEN_NAME
    		unittalk $@mobid[0], "Sakray..?? why.....Sakray!";
    		monster 'map_spa$,216,59, "Tarnished Oath" ,2954,1, .@label$;	// COLORLESS_VOW
    		unittalk $@mobid[0], "Sakray killed the King and tried to kill us!";
    		monster 'map_spa$,197,57, "Fatal Days" ,2958,1, .@label$;		// FATAL_DAYS
    		unittalk $@mobid[0], "Sakray killed a princess!";
    	}
    	end;
    OnMyMobDead2:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead2") < 1) {
    		sleep 2000;
    		.@label$ = instance_npcname("#gp_control_6") + "::OnMyMobDead3";
    		monster 'map_spa$,193,39, "Forgotten Name" ,2957,1, .@label$;	// FORGOTTEN_NAME
    		unittalk $@mobid[0], "Wake up! look at us... We are monsters?";
    		monster 'map_spa$,212,34, "Forgotten Name" ,2957,1, .@label$;	// FORGOTTEN_NAME
    		unittalk $@mobid[0], "Sakray..?? why.....Sakray!";
    		monster 'map_spa$,201,64, "Tarnished Oath" ,2954,1, .@label$;	// COLORLESS_VOW
    		unittalk $@mobid[0], "Sakray killed the King and tried to kill us!";
    		monster 'map_spa$,175,44, "Fatal Days" ,2958,1, .@label$;		// FATAL_DAYS
    		unittalk $@mobid[0], "Sakray killed a princess!";
    	}
    	end;
    OnMyMobDead3:
    	if (mobcount('map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead3") < 1) {
    		sleep 2000;
    		monster 'map_spa$,200,45, "Torturous Redeemer" ,2961,1, instance_npcname("#gp_control_6") + "::OnMyMobDead4";	// E_TORTUROUS_REDEEMER
    		unittalk $@mobid[0], "Thanatos Magic Trace! I will destroy you if I can't have you... Oh no! How could this be?";
    		sleep 5000;
    		killmonster 'map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead4";
    		enablenpc instance_npcname("Sakray#dk");
    		enablenpc instance_npcname("Thanatos Magic Trace#dk3");
    		disablenpc instance_npcname("#gp_control_6");
    	}
    	end;
    OnMyMobDead4:
    	end;
    }
    
    1@spa,196,44,5	script	Sakray#dk	4_M_SAKRAY,{
    	mes "[Lurid Royal Guard]";
    	mes "Are you satisfied..? Thanatos Magic Trace?";
    	npctalk "Lurid Royal Guard: Are you satisfied..? Thanatos Magic Trace?";
    	next;
    	mes "[Thanatos Magic Trace]";
    	mes "I need more blood..Sakray, offer me his blood.";
    	npctalk "Thanatos Magic Trace: I need more blood..Sakray, offer me his blood.", instance_npcname("Thanatos Magic Trace#dk3");
    	next;
    	mes "[Sakray]";
    	mes "Okay, that is good. A traveller. Did you see?";
    	npctalk "Sakray: Okay, that is good. A traveller. Did you see?";
    	next;
    	mes "[" + strcharinfo(0) + "]";
    	mes "Sakray, what do you want? Sympathy? Or is it a trap?";
    	unittalk getcharid(3), "" + strcharinfo(0) + " : Sakray, what do you want? Sympathy? Or is it a trap?";
    	next;
    	mes "[Sakray]";
    	mes "No... I do not need to make any effort to catch a novice.";
    	npctalk "Sakray: No... I do not need to make any effort to catch a novice.";
    	next;
    	mes "[" + strcharinfo(0) + "]";
    	mes "If so... then why...?";
    	unittalk getcharid(3), "" + strcharinfo(0) + " : If so... then why...?";
    	next;
    	cutin "cry-b.bmp",2;
    	mes "[Sakray]";
    	mes "I wanted to get rid of a piece of humanity inside of me through you.";
    	npctalk "Sakray: I wanted to get rid of a piece of humanity inside of me through you.";
    	next;
    	mes "[Sakray]";
    	mes "I am quite satisfied with the result.";
    	npctalk "Sakray: I am quite satisfied with the result.";
    	next;
    	mes "[Thanatos Magic Trace]";
    	mes "Sakray, offer the blood to me now!";
    	npctalk "Thanatos Magic Trace: Sakray, offer the blood to me now!", instance_npcname("Thanatos Magic Trace#dk3");
    	next;
    	mes "[Sakray]";
    	mes "If you were me, what would you do?";
    	npctalk "Sakray: If you were me, what would you do?";
    	next;
    	mes "[Sakray]";
    	mes "Can you set yourself free from this curse?";
    	npctalk "Sakray: Can you set yourself free from this curse?";
    	next;
    	mes "[" + strcharinfo(0) + "]";
    	mes "...";
    	unittalk getcharid(3), "" + strcharinfo(0) + " : ...";
    	next;
    	mes "[Sakray]";
    	mes "Heh heh... I will keep watching you until the day comes when you are old enough.";
    	npctalk "Sakray: Heh heh... I will keep watching you until the day comes when you are old enough.";
    	next;
    	mes "[Sakray]";
    	mes "I am willing to hunt you later for Thanatos.";
    	npctalk "Sakray: I am willing to hunt you later for Thanatos.";
    	cutin "",255;
    	next;
    	mes "[Sakray]";
    	mes "Farewell then.";
    	npctalk "Sakray: Farewell then.";
    	close2;
    	donpcevent instance_npcname("#tb") + "::OnStart";
    	end;
    }
    
    1@spa,196,46,1	script	#tb	CLEAR_NPC,{
    	end;
    OnStart:
    	disablenpc instance_npcname("Sakray#dk");
    	disablenpc instance_npcname("Thanatos Magic Trace#dk3");
    	enablenpc instance_npcname("#tb");
    	enablenpc instance_npcname("#sv");
    	enablenpc instance_npcname("#tv");
    	initnpctimer;
    	end;
    OnTimer3000:
    	npctalk "Voice of Princess Tiara : What can I do for you?";
    	end;
    OnTimer8000:
    	npctalk "Voice of Sakray : I will always stand by you. Please rest beside me.", instance_npcname("#sv");
    	end;
    OnTimer13000:
    	npctalk "Thanatos Magic Trace: Sakray, do not forget the covenant of blood between us.", instance_npcname("#tv");
    	end;
    OnTimer17000:
    	npctalk "Thanatos Magic Trace: Your soul is mine until you find the blood that satisfies me...", instance_npcname("#tv");
    	end;
    OnTimer22000:
    	npctalk "Voice of Sakray : Rest in the shadow with me.", instance_npcname("#sv");
    	end;
    OnTimer25000:
    	npctalk "Voice of Sakray : In the dark forever...", instance_npcname("#sv");
    	end;
    OnTimer28500:
    	disablenpc instance_npcname("#tb");
    	disablenpc instance_npcname("#sv");
    	disablenpc instance_npcname("#tv");
    	mapannounce 'map_spa$, "It is time to leave the Ghost Palace.", bc_map,0xFFFF00;
    	enablenpc instance_npcname("Way out of Palace");
    	enablenpc instance_npcname("King#dk11");
    	end;
    }
    
    1@spa,195,41,1	duplicate(Lurid Royal Guard#dk)	Thanatos Magic Trace#dk3	CLEAR_NPC
    1@spa,198,43,1	duplicate(Lurid Royal Guard#dk)	#sv	CLEAR_NPC
    1@spa,196,41,1	duplicate(Lurid Royal Guard#dk)	#tv	CLEAR_NPC
    
    1@spa,204,29,1	script	King#dk11	4_M_RUSKING,{
    	disable_items;
    	mes "[King]";
    	mes "Hey there, are you alive?";
    	mes "I did not expect to meet someone who is still alive.";
    	next;
    	mes "[King]";
    	mes "Do you possibly have the ^006400Gray Shard^000000?";
    	mes "Can you give it to me?";
    	mes "The memories of the faithful royal guard";
    	mes "and the memories of everyone he loved";
    	mes "are contained inside of these shards.";
    	next;
    	mes "[King]";
    	mes "Will you give the ^006400Gray Shard^000000 to me?";
    	mes "The guilt is eating my soul.";
    	mes "My soul is stuck within the Ghost Palace.";
    	next;
    	mes "[King]";
    	mes "I am collecting Sakray's abandoned memories from these shards.";
    	next;
    	mes "[King]";
    	mes "If you give any ^006400Gray Shard^000000s to me, I can make equipment for you.";
    	next;
    	mes "[King]";
    	mes "The cursed knight...";
    	mes "Please help me save the soul of Sakray.";
    	next;
    	setarray .@item_name$[0],
    		"Thanatos Sword", "Thanatos Great Sword", "Thanatos Spear", "Thanatos Long Spear", "Thanatos Staff",
    		"Thanatos Two-handed Staff", "Thanatos Bow", "Thanatos Dagger", "Thanatos Katar", "Thanatos Knuckle",
    		"Thanatos Hammer", "Thanatos Axe", "Thanatos Violin", "Thanatos Whip",
    		"Gray Shield", "Gray Armor", "Gray Robe", "Gray Cloak", "Gray Shoes", "Gray Helmet";
    	setarray .@items_list[0],13441,21009,1438,1496,1669,2023,18119,13093,28000,1836,16028,28100,1933,1988,2187,15090,15091,20721,22033,18820;
    
    	for ( .@i = 0; .@i < 20; .@i++ )
    		.@menu$ += .@item_name$[.@i] + ":";
    	.@menu$ += "Cancel";
    
    	while(true) {
    		.@s = select(.@menu$) - 1;
    		if (.@s == 20) {
    			mes "[King]";
    			mes "Someday, Sakray will";
    			mes "get out of this curse for sure.";
    			mes "I believe";
    			mes "^006400Gray Shard^000000s are the only method";
    			mes "to save him....";
    			close;
    		}
    		.@cost = ( .@s > 13 ? 200 : 200 );
    		mes "[King]";
    		mes "To make a ^FF0000" + .@item_name$[.@s] + "^000000";
    		mes "I need " + .@cost + " ^006400Gray Shard^000000.";
    		next;
    		if (select( "Cancel", "Hand over " + .@cost + " Gray Shard." ) == 1) {
    			mes "[King]";
    			mes "Someday, Sakray will";
    			mes "get out of this curse for sure.";
    			next;
    			continue;
    		}
    		if (countitem(6672) < .@cost) {
    			mes "[King]";
    			mes "You do not have enough ^006400Gray Shard^000000";
    			mes "to make a ^FF0000" + .@item_name$[.@s] + "^000000.";
    			mes "I need " + .@cost + " ^006400Gray Shard^000000.";
    			next;
    			continue;
    		}
    		mes "[King]";
    		mes "I will make a ^FF0000" + .@item_name$[.@s] + "^000000";
    		mes "with " + .@cost + " ^006400Gray Shard^000000.";
    		next;
    		mes "You see a light through the folded hands of the king and it gradually takes on a shape.";
    		next;
    		mes "[King]";
    		mes "All right, it is done.";
    		mes "Take this ^FF0000" + .@item_name$[.@s] + "^000000";
    		mes "to confront Sakray and Thanatos.";
    		next;
    		mes "[King]";
    		mes "The power requires a sacrifice.";
    		mes "Please be careful...";
    		delitem 6672,.@cost;// Gray Shard
    		getitem .@items_list[.@s],1;
    		close;
    	}
    }
    
    1@spa,210,28,0	script	Way out of Palace	WARPNPC,2,2,{
    	end;
    OnTouch_:
    	mes "It is time to leave the Ghost Palace.";
    	mes "Everything is now complete";
    	mes "and will vanish..";
    	close2;
    	if (isbegin_quest(1263) == 2)
    		getitem 6672,1;// Gray Shard
    	else {
    		setquest 1263;// Cursed Swordman
    		completequest 1263;
    		getexp 900000,500000;
    		getitem 6672,2;// Gray Shard
    	}
    	warp "prontera",178,149;
    	end;
    }
    
    1@spa,41,217,0	warp	The second floor of Palace	2,2,1@spa,114,120
    1@spa,117,137,0	warp	3rd floor in the palace	2,2,1@spa,60,43
    1@spa,54,28,0	warp	4th floor in the palace	2,2,1@spa,218,186
    1@spa,178,186,0	warp	5th floor of Palace	2,2,1@spa,186,57

     

  9. Hello, I'm sorry I ask a newbie question. I tried editing itemsthat would have different effects based on the class using this item. However, when I tried to implement it. The server notified that there is a wrong effect. I beg if there are friends here who can provide solutions for this script? Thank you in advance.

     

    20507,C_Poring_Bag,Costume Poring Bag,4,0,,0,,0,,0,0xFFFFFFFF,63,2,8192,,1,0,16,{ if(BaseJob==Job_Rogue) bonus2 bSkillAtk,"RG_RAID",25; bonus2 bSkillAtk,"RG_BACKSTAP",25; bonus5 bAutoSpell,"NPC_WIDESTONE",1,70,BF_WEAPON,0; else if(BaseJob==Job_Knight) bonus bAspdRate,10; bonus bCritical,15; bonus2 bSkillAtk,"KN_PIERCE",30; bonus2 bSkillAtk,"KN_BRANDISHSPEAR",30; bonus2 bSkillAtk,"KN_SPEARSTAB",30; bonus2 bSkillAtk,"KN_SPEARBOOMERANG",30; else if(BaseJob==Job_Crusader) bonus2 bSkillAtk,"CR_GRANDCROSS",30; bonus2 bSkillAtk,"CR_SHIELDBOOMERANG",10; bonus2 bSubClass,Class_Boss,25; bonus2 bSubSize,Size_Large,25; else if(BaseJob==Job_Monk) bonus3 bAutoSpell,"MO_CALLSPIRITS",1,20; bonus bHit,30; bonus bAspdRate,5; bonus2 bSkillAtk,"MO_COMBOFINISH",40; bonus2 bSkillCooldown,"MO_EXTREMITYFIST",20000; else if(BaseJob==Job_Priest) bonus bMaxSPrate,25; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus2 bVariableCastrate,"PR_MAGNUS",-30; bonus bMatkRate,20; skill "ALL_ODINS_POWER",1; else if(BaseJob==Job_Hunter) bonus bCritical,15; bonus2 bSkillAtk,"HT_BLITZBEAT",30; bonus3 bAutoSpell,"HT_BLITZBEAT",5,500; bonus bLongAtkRate,10; else if(BaseJob==Job_Bard) bonus bLongAtkRate,10; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",300; bonus4 bAutoSpellOnSkill,"BA_MUSICALSTRIKE","BA_PANGVOICE",1,1000; else if(BaseJob==Job_Dancer) bonus bLongAtkRate,10; bonus2 bSkillAtk,"DC_THROWARROW",300; bonus4 bAutoSpellOnSkill,"DC_THROWARROW","DC_WINKCHARM",1,1000; else if(BaseJob==Job_Wizard) bonus2 bSkillAtk,"WZ_EARTHSPIKE",40; bonus2 bVariableCastrate,"WZ_EARTHSPIKE",-25; bonus4 bAutoSpellOnSkill,"WZ_HEAVENDRIVE","WZ_EARTHSPIKE",5,2500; bonus2 bSubEle,Ele_Neutral,15; else if(BaseJob==Job_Sage) bonus2 bSkillAtk,"MG_THUNDERSTORM",40; bonus2 bVariableCastrate,"MG_THUNDERSTORM",-10; bonus bLongAtkDef,15; bonus2 bSkillAtk,"MG_NAPALMBEAT",40; else if(BaseJob==Job_Blacksmith) bonus bSplashRange,1; bonus bBaseAtk,50; bonus2 bSubEle,Ele_Neutral,15; bonus2 bSubEle,Ele_Fire,15; bonus2 bSkillAtk,"MC_MAMMONITE",20; else if(BaseJob==Job_Alchemist) bonus2 bSkillAtk,"AM_ACIDTERROR",20; bonus2 bSkillAtk,"AM_DEMONSTRATION",20; bonus2 bAddMonsterDropItem,929,2500; else if(BaseJob==Job_Assassin) bonus bAspdRate,5; bonus bCritAtkRate,20; bonus2 bIgnoreDefClassRate,Class_Normal,25; bonus2 bSkillAtk,"AS_SPLASHER",25; },{},{}

     

  10. Hello, Just cut to the chase. I have a problem with the fluxcp.  Before, everything runs smoothly. However, when I changed the 'ServerName'     => 'FluxRO', in the server.php. The control panel/website always show Install and Update panel. My question is how to resolve this matter, I mean how to make it show the normal flux cp control panel?
    problem.jpg.5f908c75c28110aa7ecc6645a2daa955.jpg

  11. Hello, just jump into it. I intended to add new staff/admin account so I also edited the clientinfo.xml hoping that the sprite would occur. However it does not. So I hope my rathena fellows can find out what wrong with my clientinfo.xml. Thanks.
     

    <?xml version="1.0" encoding="euc-kr" ?>
    <clientinfo>
    	<desc>Ragnarok Client Information</desc>
    	<servicetype>korea</servicetype>
    	<servertype>primary</servertype>
    	<connection>
    		<display>Ragnarok</display>
          	<address>127.0.0.0</address>
          	<port>6900</port>
          	<version>55</version>
          	<langtype>0</langtype>
    		<registrationweb>www.ragnarok.com</registrationweb>
    		<yellow>
    			<admin>2000000</admin>
    			<admin>2000001</admin>
    			<admin>2000002</admin>
    			<admin>2000003</admin>
    			<admin>2000004</admin>
    			<admin>2000005</admin>
    			<admin>2000006</admin>
    			<admin>2000007</admin>
    			<admin>2000008</admin>
    			<admin>2000009</admin>
    		</yellow>
    		<loading>
    			<image>loading00.jpg</image>
    			<image>loading01.jpg</image>
    			<image>loading02.jpg</image>
    			<image>loading03.jpg</image>
    			<image>loading04.jpg</image>
    			<image>loading05.jpg</image>
    			<image>loading06.jpg</image>
    		</loading>
       	</connection>
    </clientinfo>

     

  12. Hello, I have a problem with my server since I can't use every MAGIC GEAR oriented skill even though I had fulfilled every requirement for the skill. For example, I tried to use KNUCKLE BOOTS in MADO mode but it says that the skill cannot be used without MADO gear.. -__-. I hope someone can explain to me what happened here. I would be grateful ?

    534559012_whileusingknuckleboots.thumb.jpg.f2e839781fd1c7667b26babdabe8d586.jpg

  13. How to disable certain class from this jobmaster script, for example, soul linker? since when I edit the menu, the taekwon still can access the soul linker option. I would be grateful if someone can help me.

    //===== rAthena Script =======================================
    //= Job Master
    //===== Description: =========================================
    //= A fully functional job changer.
    //===== Additional Comments: =================================
    //= 1.0 Initial script. [Euphy]
    //= 1.1 Fixed reset on Baby job change.
    //= 1.2 Added Expanded Super Novice support and initial Kagerou/Oboro support.
    //= 1.3 Kagerou/Oboro added.
    //= 1.4 Rebellion added.
    //= 1.5 Added option to disable RebirthClass. [mazvi]
    //= 1.6 Added option to get job related equipment on change. [Braniff]
    //= 1.7 Readability changes. Also added BabyExpanded and BabySummoner classes. [Jey]
    //= 1.8 Added option to disable Baby Novice Only but Baby Class can be Enabled [mazvi]
    //= 1.9 Migrate/Integrate to Global Functions Platinum Skills. [mazvi]
    //============================================================
    
    prontera,153,193,6	script	Job Master	123,{
    function Get_Job_Equip;
    // Checks if the Player has the required level.
    // closes if not, returns if yes
    function	Require_Level	{
    	if (BaseLevel < getarg(0) || JobLevel < getarg(1)) {
    		.@blvl = getarg(0) - BaseLevel;
    		.@jlvl = getarg(1) - JobLevel;
    		mes "Level requirement:";
    		mes ((getarg(0)>1)? 
    			"^bb0000"+getarg(0)+"^000000 (^bb0000Base^000000) / ":"")+"^00bb00"+
    			getarg(1)+"^000000 (^00bb00Job^000000)";
    		mes "You need " +
    			((.@blvl > 0) ? "^bb0000"+.@blvl+"^000000 more base levels " + 
    				((.@jlvl > 0) ? "and " : "") : "") +
    			((.@jlvl > 0) ? "^00bb00"+.@jlvl+"^000000 more job levels " : "") +
    			"to continue.";
    		close;
    	}
    	return;
    }
    
    // Checks if the given eac is a baby class
    function Is_Baby	{
    	return ((getarg(0, eaclass())&EAJL_BABY)>0);
    }
    
    // Checks if the player can change to third class.
    // Note: This does not include the level checks.
    function	Can_Change_Third	{
    	// To change to third class you either need to be:
    	// * Second Class
    	// * Transcendent Second Class
    	// * Baby Second Class
    	if( !.ThirdClass )
    		return false; // Third job change disabled
    	if( !(eaclass()&EAJL_2) )
    		return false; // Not second Class
    	if( eaclass()&EAJL_THIRD )
    		return false; // Already Third Class
    	if( roclass(eaclass()|EAJL_THIRD) < 0 )
    		return false; // Job has no third Class
    	if( (eaclass()&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE )
    		return false; // Exp. Super Novice equals 3rd Cls, but has it's own case
    	if( Is_Baby() && (!.BabyClass || !.BabyThird) )
    		return false; // No Baby (Third) change allowed
    	return true;
    }
    
    function	Can_Rebirth	{
    	// To rebirth, you need to be:
    	// * Second Class
    	if( !.RebirthClass )
    		return false; // Rebirth disabled
    	if( !(eaclass()&EAJL_2) )
    		return false; // Not second Class
    	if( eaclass()&EAJL_UPPER )
    		return false; // Already Rebirthed
    	if( roclass(eaclass()|EAJL_UPPER) < 0 )
    		return false; // Job has no transcended class
    	if( Is_Baby() && !.BabyClass )
    		return false; // No Baby changes allowed
    	return true;
    }
    
    // Checks if the given eac is a first class
    function	Is_First_Cls	{
    	return (getarg(0) <= EAJ_TAEKWON);
    }
    
    function	Check_Riding	{
    	// Note: Why we should always check for Riding:
    	// Mounts are considered as another class, which
    	// would make this NPC bigger just to handle with
    	// those special cases.
    	if (checkfalcon() || checkcart() || checkriding() || ismounting()) {
    		mes "Please remove your " +
    			((checkfalcon()) ? "falcon" : "") +
    			((checkcart()) ? "cart" : "") +
    			((checkriding()) ? "Peco" : "") +
    			((ismounting()) ? "mount" : "") +
    			" before proceeding.";
    		close;
    	}
    	return;
    }
    function	Check_SkillPoints	{
    	if (.SkillPointCheck && SkillPoint) {
    		mes "Please use all your skill points before proceeding.";
    		close;
    	}
    	return;
    }
    
    // addJobOptions is essentially the same like
    // setarray .@array[getarraysize(.@array)],opt1,opt2,...;
    // It's just easier to read, since we're using it very often
    function	Job_Options	{
    	.@argcount = getargcount();
    	.@arr_size = getarraysize(getarg(0));
    	for( .@i = 1; .@i < .@argcount; .@i++) {
    		setarray getelementofarray(getarg(0), .@arr_size++),getarg(.@i);
    	}
    }
    
    // Begin of the NPC
    	mes .NPCName$;
    	Check_Riding();
    	Check_SkillPoints();
    
    	// initialisation
    	deletearray .@job_opt[0],getarraysize(.@job_opt);
    	.@eac = eaclass();
    	.@third_possible = Can_Change_Third();
    	.@rebirth_possible = Can_Rebirth();
    	.@first_eac = .@eac&EAJ_BASEMASK;
    	.@second_eac = .@eac&EAJ_UPPERMASK;
    	// Note: These are already set in pc.c
    	// BaseClass = roclass(.@eac&EAJ_BASEMASK) which is the players First Class
    	// BaseJob = roclass(.@eac&EAJ_UPPERMASK) which is the players Second Class
    	//dispbottom "Debug: eac ("+.@eac+"), third ("+.@third_possible+"), rebirth("+.@rebirth_possible+"), BaseClass ("+BaseClass+"), BaseJob ("+BaseJob+")";
    		
    	// From here on the jobmaster checks the current class
    	// and fills the the array `.@job_opt` with possible
    	// job options for the player.
    	
    	if( .@rebirth_possible ) {
    		// Rebirth option (displayed on the top of the menu)
    		Require_Level(.Req_Rebirth[0], .Req_Rebirth[1]);
    		Job_Options(.@job_opt, Job_Novice_High);
    	}
    	if( .@third_possible ) {
    		// Third Job change (displayed below rebirth)
    		Require_Level(.Req_Third[0], .Req_Third[1]);
    		Job_Options(.@job_opt, roclass(.@eac|EAJL_THIRD));
    	}
    	 
    	if (.SecondExpanded && 
    	   (.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE && // is Super Novice
    	   !(eaclass()&EAJL_THIRD) ) {				 	// not already Expanded SN
    		// (Baby) Super Novice to Expanded (Baby) Super Novice
    	   	if( !Is_Baby(.@eac) || (.BabyClass && .BabyExpanded) ) {
    			// .BabyClass & .BabyExpanded must be enabled if the is a baby
    			Require_Level(.Req_Exp_SNOVI[0], .Req_Exp_SNOVI[1]);
    			Job_Options(.@job_opt,roclass(.@eac|EAJL_THIRD)); // Expanded SN is "third" cls
    		}
    	}
    	
    	if (.SecondExpanded && 
    		((.@eac&(~EAJL_BABY)) == EAJ_NINJA || 		// is (Baby) Ninja
    		(.@eac&(~EAJL_BABY)) == EAJ_GUNSLINGER)) {	// is (Baby) Gunslinger
    		// (Baby) Ninja to (Baby) Kagerou / Oboro
    		// (Baby) Gunslinger to (Baby) Rebellion
    		if( !Is_Baby(.@eac) || (.BabyClass && .BabyExpanded) ) {
    			// .BabyClass & .BabyExpanded must be enabled if the is a baby
    			Require_Level(.Req_Exp_NJ_GS[0], .Req_Exp_NJ_GS[1]);
    			// Kagerou, Oboro, Rebellion are considered as a 2-1 class
    			Job_Options(.@job_opt, roclass(.@eac|EAJL_2_1));
    		}
    	}
    	
    	// Player is Job_Novice, Job_Novice_High or Job_Baby
    	if (.@first_eac == EAJ_NOVICE && .@second_eac != EAJ_SUPER_NOVICE) {
    		// MAPID_NOVICE, MAPID_SUPER_NOVICE, MAPID_NOVICE_HIGH, MAPID_BABY
    		Require_Level(.Req_First[0], .Req_First[1]);
    		switch(Class) {
    			case Job_Novice:
    				// First job change
    				Job_Options(.@job_opt,Job_Swordman,
    					Job_Mage, Job_Archer, Job_Acolyte, Job_Merchant, Job_Thief,
    					Job_Super_Novice, Job_Taekwon, Job_Gunslinger, Job_Ninja);
    				if( .BabyNovice )
    					Job_Options(.@job_opt, Job_Baby);
    				break;
    			case Job_Novice_High:
    				// Job change after rebirth
    				if( .LastJob && lastJob )
    					Job_Options(.@job_opt,
    						roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER));
    				else
    					Job_Options(.@job_opt, 
    						Job_Swordman_High, Job_Mage_High, Job_Archer_High,
    						Job_Acolyte_High, Job_Merchant_High, Job_Thief_High);
    				break;
    			case Job_Baby:
    				if( !.BabyClass )
    					break;
    				// First job change as a baby
    				Job_Options(.@job_opt, Job_Baby_Swordman, Job_Baby_Mage,
    					Job_Baby_Archer,Job_Baby_Acolyte, Job_Baby_Merchant,
    					Job_Baby_Thief);
    				if( .BabyExpanded )
    					Job_Options(.@job_opt, Job_Super_Baby, Job_Baby_Taekwon,
    						Job_Baby_Gunslinger, Job_Baby_Ninja);
    				if( .BabySummoner )
    					Job_Options(.@job_opt, Job_Baby_Summoner);
    				break;
    			default:
    				mes "An error has occurred.";
    				close;
    		}
    	} else if( Is_First_Cls(.@eac) || 				// First Class
    			   Is_First_Cls(.@eac&(~EAJL_UPPER)) ||	// Trans. First Cls
    			   (.BabyClass && Is_First_Cls(.@eac&(~EAJL_BABY))) ) {	// Baby First Cls
    		// Player is First Class (not Novice)
    		// most jobs should have two options here  (2-1 and 2-2)
    		.@class1 = roclass(.@eac|EAJL_2_1); // 2-1
    		.@class2 = roclass(.@eac|EAJL_2_2); // 2-2
    		// dispbottom "Debug: Classes: class1 ("+.@class1+"), class2 ("+.@class2+")";
    		if(.LastJob && lastJob && (.@eac&EAJL_UPPER)) {
    			// Player is rebirth Cls and linear class changes are enforced
    			Require_Level(.Req_Second[0], .Req_Second[1]);
    			Job_Options(.@job_opt, lastJob + Job_Novice_High);
    		} else {
    			// Class is not enforced, player can decide.
    			if( .@class1 > 0 ) { // 2-1
    				Require_Level(.Req_Second[0], .Req_Second[1]);
    				Job_Options(.@job_opt, .@class1);
    			}
    			if( .@class2 > 0 ) { // 2-2
    				Require_Level(.Req_Second[0], .Req_Second[1]);
    				Job_Options(.@job_opt, .@class2);
    			}
    		}
    	}
    	
    	// Displaying the Job Menu defined by .@job_opt.
    	// .@job_opt should not be changed below this line.
    	function Job_Menu;
    	Job_Menu(.@job_opt);
    	close;
    
    // Displays the job menu
    function	Job_Menu	{
    	// getarg(0) is the .@job_opt array holding all available job changes.
    	function Confirm_Change;
    	while(true) {
    		.@opt_cnt =  getarraysize(getarg(0));
    		if( .@opt_cnt <= 0 ) {
    			mes "No more jobs are available.";
    			close;
    		}
    
    		.@selected = 0; // Just a single job class given, no select needed
    		if (.@opt_cnt > 1) {
    			// Multiple job classes given. Select one and save it to .@class
    			// After that confirm .@class
    			mes "Select a job.";
    			.@menu$ = "";
    			for (.@i = 0; .@i < .@opt_cnt; .@i++) {
    				if( getelementofarray(getarg(0), .@i) == Job_Novice_High)
    					.@jobname$ = "^0055FFRebirth^000000";
    				else
    					.@jobname$ = jobname(getelementofarray(getarg(0), .@i));
    				.@menu$ = .@menu$ + " ~ " + .@jobname$ + ":";
    			}
    			.@menu$ = .@menu$+" ~ ^777777Cancel^000000";
    			.@selected = select(.@menu$) - 1;
    			if( .@selected < 0 || .@selected >= .@opt_cnt )
    				close;
    			next;
    			mes .NPCName$;
    		}
    		.@class = getelementofarray(getarg(0), .@selected);
    		if ((.@class == Job_Super_Novice || .@class == Job_Super_Baby) &&
    				BaseLevel < .SNovice) {
    			// Special Level Requirement because Super Novice and
    			// Super Baby can both be selected in one of the first class
    			// changes. That's why the Level Requirement is after and not before
    			// the selection.
    			mes "A base level of " + .SNovice +
    				" is required to turn into a " + jobname(.@class) + ".";
    			return;
    		}
    		// Confirm the Class
    		Confirm_Change(.@class, .@opt_cnt > 1);
    		next;
    		mes .NPCName$;
    	}
    	return;
    }
    
    
    // Executes the actual jobchange and closes.
    function	Job_Change	{
    	.@to_cls = getarg(0);
    	next;
    	mes .NPCName$;
    	mes "You are now " + callfunc("F_InsertArticle", jobname(.@to_cls)) + "!";
    	if (.@to_cls == Job_Novice_High && .LastJob)
    		lastJob = Class; // Saves the lastJob for rebirth
    	jobchange .@to_cls;
    	if (.@to_cls == Job_Novice_High)
    		resetlvl(1);
    	else if (.@to_cls == Job_Baby) {
    		resetstatus;
    		resetskill;
    		set SkillPoint,0;
    	}
    	specialeffect2 EF_ANGEL2;
    	specialeffect2 EF_ELECTRIC;
    	if (.Platinum)
    		callfunc "F_GetPlatinumSkills";
    	if (.GetJobEquip)
    		Get_Job_Equip();
    	close; // Always closes after the change
    }
    
    function	Confirm_Change	{
    	// Player confirms he want to change into .@class
    	.@class = getarg(0, -1);
    	.@back = getarg(1, false);
    	if( .@class < 0 ) {
    		mes "Unknown Class Error.";
    		close;
    	}
    	mes "Do you want to change into ^0055FF"+jobname(.@class)+"^000000 class?";
    	.@job_option$ = " ~ Change into ^0055FF"+jobname(.@class)+"^000000 class";
    	if( .@class == Job_Novice_High)
    		.@job_option$ = " ~ ^0055FFRebirth^000000";
    	
    	if (select(.@job_option$+": ~ ^777777" + 
    			((.@back) ?"Go back" : "Cancel") + "^000000") == 1) {
    		Job_Change(.@class);
    	}
    	if (!.@back)
    		close; // "Cancel" pressed
    	return;
    }
    
    // Function which gives a job related item to the player
    // the items are the rewards from the original job change quests
    function	Get_Job_Equip	{
    	// Note: The item is dropping, when the player can't hold it.
    	// But that's better than not giving the item at all.
    	.@eac = eaclass();
    	if( .@eac&EAJL_THIRD ) {
    		// Third Class Items
    		getitem 2795,1;	//	Green Apple Ring for every 3rd Class
    		switch(BaseJob) {
    			// BaseJob of Third Cls
    			// For Normal Third, Baby Third and Transcended Third Cls
    			case Job_Knight:
    				getitem 5746,1;	break;	//	Rune Circlet [1]
    			case Job_Wizard:
    				getitem 5753,1;	break;	//	Magic Stone Hat [1]
    			case Job_Hunter:
    				getitem 5748,1;	break;	//	Sniper Goggle [1]
    			case Job_Priest:
    				getitem 5747,1;	break;	//	Mitra [1]
    			case Job_Blacksmith:
    				getitem 5749,1;	break;	//	Driver Band [1]
    			case Job_Assassin:
    				getitem 5755,1;	break;	//	Silent Executor [1]
    			case Job_Crusader:
    				getitem 5757,1;	break;	//	Dip Schmidt Helm [1]
    			case Job_Sage:
    				getitem 5756,1;	break;	//	Wind Whisper [1]
    			case Job_Bard:
    				getitem 5751,1;	break;	//	Maestro Song's Hat [1]
    			case Job_Dancer:
    				getitem 5758,1;	break;	//	Dying Swan [1]
    			case Job_Monk:
    				getitem 5754,1;	break;	//	Blazing Soul [1]
    			case Job_Alchemist:
    				getitem 5752,1;	break;	//	Midas Whisper[1]
    			case Job_Rogue:
    				getitem 5750,1; 		//	Shadow Handicraft [1]
    				getitem 6121,1;			//	Makeover Brush
    				getitem 6122,1;	break;	//	Paint Brush
    		}
    	} else if (.@eac&EAJL_2) {
    		// Second Class (And not Third Class)
    		switch(BaseJob) {
    			// Second Class
    			case Job_Knight:
    				getitem 1163,1;	break;	//	Claymore [0]
    			case Job_Priest:
    				getitem 1522,1;	break;	//	Stunner [0]
    			case Job_Wizard:
    				getitem 1617,1;	break;	//	Survivor's Rod [0]
    			case Job_Blacksmith:
    				getitem 1360,1;	break;	//	Two-Handed-Axe [1]
    			case Job_Hunter:
    				getitem 1718,1;	break;	//	Hunter Bow [0]
    			case Job_Assassin:
    				getitem 1254,1;	break;	//	Jamadhar [0]
    			case Job_Crusader:
    				getitem 1410,1;	break;	//	Lance [0]
    			case Job_Monk:
    				getitem 1807,1;	break;	//	Fist [0]
    			case Job_Sage:
    				getitem 1550,1;	break;	//	Book [3]
    			case Job_Rogue:
    				getitem 1222,1;	break;	//	Damascus [1]
    			case Job_Alchemist:
    				getitem 1126,1;	break;	//	Saber [2]
    			case Job_Bard:
    				getitem 1907,1;	break;	//	Guitar [0]
    			case Job_Dancer:
    				getitem 1960,1;	break;	//	Whip [1]
    			case Job_Super_Novice:
    				getitem 1208,1;	break;	//	Main Gauche [4]
    			case Job_Gunslinger:
    				getitem 13101,1; break;	//	Six Shooter [2]
    			case Job_Ninja:
    				getitem 13010,1; break;	//	Asura [2]
    			case Job_Star_Gladiator:
    				getitem 1550,1;	break;	//	Book [3]
    			case Job_Soul_Linker:
    				getitem 1617,1;	break;	//	Survivor's Rod [0]
    		}
    	} else {
    		// Neither Second or Third Cls
    		// => First Cls or not covered by the switch
    		switch(BaseClass) {
    			// First Class
    			case Job_Swordman:
    				getitem 1108,1;	break;	//	Blade [4]
    			case Job_Mage:
    				getitem 1602,1;	break;	//	Rod [4]
    			case Job_Archer:
    				getitem 1705,1;	break;	//	Composite Bow [4]
    			case Job_Acolyte:
    				getitem 1505,1;	break;	//	Mace [4]
    			case Job_Merchant:
    				getitem 1302,1;	break;	//	Axe [4]
    			case Job_Thief:
    				getitem 1208,1;	break;	//	Main Gauche [4]
    		}
    	}
    	return;
    }
    
    OnInit:
    	// Initialisation, do not edit these
    	.NPCName$ = "[Job Master]";
    	
    	// Settings
    	.ThirdClass = true;			// Enable third classes?
    	.RebirthClass = true;			// Enable rebirth classes?
    	.SecondExpanded = true;		// Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion?
    	.BabyNovice = true;	// Enable Baby novice classes? Disable it if you like player must have parent to get job baby.
    	.BabyClass = true;				// Enable Baby classes?
    	.BabyThird = true;				// Enable Baby third classes?
    	.BabyExpanded = true;			// Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc.
    	.BabySummoner = true;			// Enable Baby Summoner?
    	.LastJob = true;				// Enforce linear class changes?
    	.SkillPointCheck = true;		// Force player to use up all skill points?
    	.Platinum = true;				// Get platinum skills automatically?
    	.GetJobEquip = false;			// Get job equipment (mostly weapons) on job change?
    
    	// Level Requirements
    	setarray .Req_First[0],1,10; 		// Minimum base level, job level to turn into 1st class
    	setarray .Req_Second[0],1,40; 		// Minimum base level, job level to turn into 2nd class
    	setarray .Req_Rebirth[0],99,50;		// Minimum base level, job level to rebirth
    	setarray .Req_Third[0],99,50;		// Minimum base level, job level to change to third class
    	setarray .Req_Exp_NJ_GS[0],99,70; 	// Minimum base level, job level to turn into Expanded Ninja and Gunslinger
    	setarray .Req_Exp_SNOVI[0],99,99; 	// Minimum base level, job level to turn into Expanded Super Novice
    	.SNovice = 45;						// Minimum base level to turn into Super Novice
    	
    	// Setting adjustments by PACKETVER
    	if( PACKETVER < 20161207 ) {
    		if( .BabyExpanded )
    			debugmes "jobmaster: BabyExpanded is disabled due to outdated PACKETVER.";
    		if( .BabySummoner )
    			debugmes "jobmaster: BabySummoner is disabled due to outdated PACKETVER.";
    		.BabyExpanded = false;
    		.BabySummoner = false;
    	}
    	end;
    }
    

     

  14. 59 minutes ago, crazyarashi said:
    
    if (rand(1,10) == 7){ 10%
    TO
    if (rand(1,10) >= 6){ 40%
    
    if (rand(1,10) == 1) { 10%
    	dispbottom "[Fishing] Kraken drags your feet!!!";
    
    if (rand(1,10) >= 5) { 50%
    	dispbottom "[Fishing] Kraken drags your feet!!!";

    Well if you apply basic math to it you can just simply increase it or reduce it.

    it means, if I want to make it 20%, it would be like this, if (rand(1,10) >=8) ?
    thanks for your respond..

×
×
  • Create New...