Jump to content

cook1e

Members
  • Posts

    171
  • Joined

  • Days Won

    7

Posts posted by cook1e

  1. -	script	buff_cmd	-1,{
    	
    OnInit:
    	bindatcmd "buffs", strnpcinfo(0)+"::OnCommand";
    	end;
    
    OnCommand:
    	if(getgroupid() <= 7) {
    		message strcharinfo(0),"Falha, você não possui VIP.";
    		end;
    	}
    	// This will bestow the effect of Level 10 Blessing.
    	skilleffect 74,0; sc_start SC_MAGNIFICAT,360000,5;
    	skilleffect 75,0; sc_start SC_GLORIA,360000,5;
    	skilleffect 66,0; sc_start SC_IMPOSITIO,360000,5;
    	skilleffect 67,0; sc_start SC_SUFFRAGIUM,360000,3;
    	skilleffect 34,0; sc_start SC_BLESSING,360000,10;
    	skilleffect 29,0; sc_start SC_INCREASEAGI,360000,10;
    	skilleffect 357,0; sc_start SC_CONCENTRATION,360000,5;
    	skilleffect 155,0; sc_start SC_LOUD,360000,1;
    	sc_start SC_ASPDPOTION2,360000,0;
    	sc_start SC_STRFood,360000,10;
    	sc_start SC_AGIFood,360000,10;
    	sc_start SC_VITFood,360000,10;
    	sc_start SC_INTFood,360000,10;
    	sc_start SC_DEXFood,360000,10;
    	sc_start SC_LUKFood,360000,10;
    	sc_start SC_HitFood,1200000,30;
    	sc_start SC_FleeFood,1200000,30;
    	sc_start SC_BATKFood,1200000,10;
    	sc_start SC_MATKFood,120000,10;
    }

     

    • Love 1
  2. //===== rAthena Script ======================================= 
    //= Find the gm event (hide and seek)
    //===== By: ==================================================
    //= Mastagoon
    //===== Description: =========================================
    //= The npc (GM sprite) will teleport to a random location on
    //= the map, and will open a waiting room. The first player to
    //= join that waiting room will win the round.
    //===== Current Version: =====================================
    //= 1.0
    //= 1.0.1 Fixed a typo that prevented automatic event start (credit to AinsLord)
    //===== Featuers: ============================================
    //= Can set the number of rounds, map, item&zeny rewards.
    //= the event can start manually or automatically.
    //= There is another version of this script compatiable with 
    //= Stolao's event manager. You can DM me if you want that file.
    //============================================================
    freya,209,214,5    script    GM Pritong Kandule#findgm    871,{
        if(.status < 2) {
            mes "["+.npcName+"]";
            mes "When the event begins, i will teleport to a random location on this map.";
            mes "And you need to find me to win!";
            close;
        }
        end;
    
    OnInit:
        //SETTINGS
        .rounds = 10; // for how many rounds should the event last?
        setarray .map$,"freya","prontera","payon"; // the event where the gm will hide
        .itemReward = 1;  
        setarray .rewards[0],6242,1;   // [itemId, itemAmount, {....}]
        .zenyReward = 0;
        .zenyAmount = 1000;
        .debugMode = 0;
        .npcName$ = "GM Pritong Kandule";
        .countdown = 3; // the time between event announcements and when the event actually starts.
        .automatic = 1;    // automatic event or does it need a gm to run it manually?
        .runEvery = 1;    // (ignore if manual) run the event ever X hours 
        .offset = 1;    // (ignore if manual) sometimes, you might have another event/announcement at the same time as the event announcement. you can set an offset (announce X minutes after event time.)
        // Do not edit the code below.
        if(.countdown < 0) .countdown = 1;
        if(.rounds < 1) .rounds = 1;
        if(.winnersPerRound < 1) .winnersPerRound = 1;
        for(.@i = 0; .@i < getarraysize(.rewards); .@i = .@i+2) {
            if(getitemname(.rewards[.@i]) == "null") {
                debugmes "[Find GM]: Invalid item id provided "+.rewards[.@i]+" removing item from the rewards list..";
                deletearray .rewards[.@i],2;
                .@i -= 2;
            }
        }
        .status = 0;
        bindatcmd("eventstart", strnpcinfo(3)+"::OnEventAnnounce",60,99);
        strnpcinfo(3);
        end;
    
    OnMinute00:
        if(.status || !.automatic || gettime(DT_HOUR) % .runEvery != 0 || agitcheck() || agitcheck2() || agitcheck3()) end;
        sleep .offset * 1000 * 60;
    	.rand_map$ = .map$[rand(getarraysize(.map$))];										   
    
    OnEventAnnounce:
        .status = 1;
    	.rand_map$ = .map$[rand(getarraysize(.map$))];										   
        for(.@i = .countdown; .@i > 0; .@i--) {
            announce "[Find "+.npcName$+"] : The event will begin in "+callfunc("F_InsertPlural",.@i,"minute")+"!",bc_all|bc_blue;
            sleep .debugMode ? 5000 : 60000;
        }
        announce "[Find "+.npcName$+"] : The event has now begun!",bc_all|bc_blue;
    
    OnEventStart:
        sleep 2000;
        npctalk "I will now teleport to a random location";
        sleep 2000;
        npctalk "You must find me to win the event!";
        sleep 2000;
        npctalk "This event will last for "+callfunc("F_InsertPlural",.rounds,"round");
        sleep 2000;
        npctalk "Goodluck!";
        donpcevent strnpcinfo(3)+"::OnRoundStart";
        .status = 2;
        .round = 1;
        end;
    
    OnRoundStart:
        initnpctimer;
        do {
            .@x = rand(0,450);
            .@y = rand(0,450);
    	} while (!checkcell(.rand_map$,.@x,.@y,cell_chkpass));
    	unitwarp getnpcid(0),.rand_map$,.@x,.@y;
        debugmes "[Event]: npc is at: "+.@x+" & "+.@y;
       announce "[Find "+.npcName$+"] :"+.npcName$+" is hiding in a random place in "+.rand_map$+", Find him now!",bc_all|bc_blue;
        delwaitingroom;
        waitingroom "Here!", 2, strnpcinfo(3)+"::OnRoundEnd",1;
        .status = 2;
        end;
    
    OnRoundEnd:
        if(.status != 2) end;
        .status = 1; 
        //#TODO the winner should be already attached here no?
        getwaitingroomusers strnpcinfo(3);
        for(.@i = 0; .@i < getarraysize(.@waitingroom_users); .@i++) {
            if(.@waitingroom_users[.@i] > 0) {
                .@winner = .@waitingroom_users[.@i];
            }
        }
        if(!attachrid(.@winner)) {
            .status = 2;
            end;
        }
        specialeffect2 EF_SPHERE;
        announce .npcName$+": I've been found by "+strcharinfo(0)+"!",bc_all|bc_blue;
        if(.itemReward) {
            for(.@i = 0; .@i < getarraysize(.rewards); .@i = .@i +2) {
                getitem .rewards[.@i],.rewards[.@i+1];
            }
        }
        if(.zenyReward) {
            Zeny += .zenyAmount;
            dispbottom "You've gained "+.zenyAmount+" zeny for winning a round in the event.";
        }
        sleep 1000;
        if(.round >= .rounds) {
            donpcevent strnpcinfo(3)+"::OnEventEnd";
            end;
        }
        .round++;
        donpcevent strnpcinfo(3)+"::OnRoundStart";
        end;
    
    OnEventEnd:
        .status = 0;
        announce "[Find "+.npcName$+"]: The event is over! thank you for participating.",bc_all|bc_blue;
        unitwarp getnpcid(0),.rand_map$,195,58;
        delwaitingroom;
        sleep 5000;
        end;
    
    OnTimer1800000:
        if(.status) {
            stopnpctimer;
            donpcevent strnpcinfo(3)+"::OnEventEnd";
        }
        end;
    }

     

     

  3. -	script	Healer	-1,{
    	percentheal 100,100;
    	if(vip_status(VIP_STATUS_ACTIVE)) {
    		specialeffect2 EF_INCAGILITY;
    		sc_start SC_INCREASEAGI,240000,10;
    		specialeffect2 EF_BLESSING;
    		sc_start SC_BLESSING,240000,10;
    	}
    	end;
    }
    
    prontera,162,193,4	duplicate(Healer)	Healer#prt	909

     

  4. //===== 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]
    //= 2.0 Added 4th class [Lemongrass]
    //============================================================
    
    maintown,223,223,3	script	Job Master	10300,{
    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 fourth class.
    // Note: This does not include the level checks.
    function	Can_Change_Fourth	{
    	// To change to fourth class you need to be:
    	// * Transcendent Third Class
    	if( !.FourthClass )
    		return false; // Fourth job change disabled
    	if( (eaclass()&(EAJL_THIRD|EAJL_UPPER)) != (EAJL_THIRD|EAJL_UPPER) )
    		return false; // Not Transcendent Third Class
    	if( eaclass()&EAJL_FOURTH )
    		return false; // Already Fourth Class
    	if( roclass(eaclass()|EAJL_FOURTH) < 0 )
    		return false; // Job has no Fourth Class
    	return true;
    }
    
    // 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|EAJL_THIRD) )
    		return false; // Already Rebirthed/ Third Class
    	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
    	.@eac = eaclass();
    	.@fourth_possible = Can_Change_Fourth();
    	.@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.cpp
    	// 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( .@fourth_possible ) {
    		// Fourth Job change (displayed below rebirth)
    		Require_Level(.Req_Fourth[0], .Req_Fourth[1]);
    		Job_Options(.@job_opt, roclass(.@eac|EAJL_FOURTH));
    	}
    	 
    	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	{
    	.@previous_class = Class;
    	.@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
    	if (.@to_cls == Job_Soul_Linker) {
    		clear;
    		mes .NPCName$;
    		mes "You can't change into Soul Linker.";
    		close;
    	}
    	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 (.@previous_class != Class) {
    		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 || eaclass(.@class) == -1 ) {
    		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_FOURTH ) {
    		// Fourth Class Items
    		getitem 490087,1; // Hourglass Necklace
    	} else 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_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]
    			case Job_Gunslinger:
    				getitem 13101,1; break;	//	Six Shooter [2]
    			case Job_Ninja:
    				getitem 13010,1; break;	//	Asura [2]
    		}
    	}
    	return;
    }
    
    OnInit:
    	// Initialisation, do not edit these
    	.NPCName$ = "[Job Master]";
    	
    	// Settings
    	.FourthClass = false;				// Enable fourth classes?
    	.ThirdClass = false;					// Enable third classes?
    	.RebirthClass = true;				// Enable rebirth classes?
    	.SecondExpanded = false;				// 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 = false;					// Enable Baby third classes?
    	.BabyExpanded = true;				// Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc.
    	.BabySummoner = false;				// Enable Baby Summoner?
    	.LastJob = true;					// Enforce linear class changes?
    	.SkillPointCheck = true;			// Force player to use up all skill points?
    	.Platinum = false;					// 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_Fourth[0],200,70;		// Minimum base level, job level to change to fourth 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;
    }

    May not be the correct way of doing it, but here it is.

    I just added this in the function Job_Change.

    	if (.@to_cls == Job_Soul_Linker) {
    		clear;
    		mes .NPCName$;
    		mes "You can't change into Soul Linker.";
    		close;
    	}

     

    • Upvote 1
  5. 8 hours ago, Sergardo said:

    hi how about rental item? not detecting  

    prontera,100,200,3	script	VIPBuffer	78,{
    
    	specialeffect2 EF_HEAL2; percentheal 100,100;
    	specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,600000,10;
    	specialeffect2 EF_BLESSING; sc_start SC_BLESSING,600000,10;
    	
    	if ( countitem(.VIP_item) || rentalcountitem(.VIP_item) ) {
    		specialeffect2 EF_ANGELUS; sc_start SC_ANGELUS,600000,10;
    		specialeffect2 EF_SUFFRAGIUM; sc_start SC_SUFFRAGIUM,600000,3;
    		specialeffect2 EF_IMPOSITIO; sc_start SC_IMPOSITIO,600000,5;
    		specialeffect2 EF_GLORIA; sc_start SC_GLORIA,600000,5;
    		specialeffect2 EF_MAGNIFICAT; sc_start SC_MAGNIFICAT,600000,5;
    		specialeffect2 EF_CHEMICALPROTECTIOn; sc_start SC_CP_WEAPON,600000,5;
    		sc_start SC_CP_ARMOR,600000,5;
    		sc_start SC_CP_SHIELD,600000,5;
    		sc_start SC_CP_HELM,600000,5;
    		specialeffect2 EF_ASSUMPTIO; sc_start SC_ASSUMPTIO,600000,5;
    		sc_start SC_ADRENALINE2,600000,1;
    		specialeffect2 EF_MAXPOWER; sc_start SC_MAXIMIZEPOWER,600000,5;
    		specialeffect2 EF_PERFECTION; sc_start SC_WEAPONPERFECTION,600000,5;
    		specialeffect2 EF_ENDURE; sc_start SC_ENDURE,600000,10;
    		sc_start SC_KAUPE,600000,3;
    		sc_start SC_KAITE,600000,7;
    		sc_start SC_STRFOOD,600000,5;
    		sc_start SC_AGIFOOD,600000,5;
    		sc_start SC_VITFOOD,600000,5;
    		sc_start SC_INTFOOD,600000,5;
    		sc_start SC_DEXFOOD,600000,5;
    		sc_start SC_LUKFOOD,600000,5;
    
    		switch ( CLASS ) {
    			case 18:
    			case 4019:
    			case 4071:
    			case 4078:
    				skilleffect "SL_ALCHEMIST",0;
    				sc_start4 SC_SPIRIT,9999999,5,455,0,0;
    				break;
    			case 15:
    			case 4016:
    			case 4070:
    			case 4077:
    				skilleffect "SL_MONK",0;
    				sc_start4 SC_SPIRIT,9999999,5,447,0,0;
    				break;
    			case 4047:
    				skilleffect "SL_STAR",0;
    				sc_start4 SC_SPIRIT,9999999,5,448,0,0;
    				break;
    			case 16:
    			case 4017:
    			case 4067:
    			case 4074:
    				skilleffect "SL_SAGE",0;
    				sc_start4 SC_SPIRIT,9999999,5,449,0,0;
    				break;
    			case 14:
    			case 4015:
    			case 4066:
    			case 4073:
    				skilleffect "SL_CRUSADER",0;
    				sc_start4 SC_SPIRIT,9999999,5,450,0,0;
    				break;
    			case 23:
    			case 4190:
    				skilleffect "SL_SUPERNOVICE",0;
    				sc_start4 SC_SPIRIT,9999999,5,451,0,0;
    				break;
    			case 7:
    			case 4008:
    			case 4054:
    			case 4060:
    				skilleffect "SL_KNIGHT",0;
    				sc_start4 SC_SPIRIT,9999999,5,452,0,0; 
    				break;
    			case 9:
    			case 4010:
    			case 4055:
    			case 4061:
    				skilleffect "SL_WIZARD",0;
    				sc_start4 SC_SPIRIT,9999999,5,453,0,0;
    				break;
    			case 8:
    			case 4009:
    			case 4057:
    			case 4063:
    				skilleffect "SL_PRIEST",0;
    				sc_start4 SC_SPIRIT,9999999,5,454,0,0;
    				break;
    			case 19:
    			case 20:
    			case 4020:
    			case 4021:
    			case 4068:
    			case 4069:
    			case 4075:
    			case 4076:
    				skilleffect "SL_BARDDANCER",0;
    				sc_start4 SC_SPIRIT,9999999,5,455,0,0;
    				break;
    			case 17:
    			case 4018:
    			case 4072:
    			case 4079:
    				skilleffect "SL_ROGUE",0;
    				sc_start4 SC_SPIRIT,9999999,5,456,0,0;
    				break;
    			case 12:
    			case 4013:
    			case 4059:
    			case 4065:
    				skilleffect "SL_ASSASIN",0;
    				sc_start4 SC_SPIRIT,9999999,5,457,0,0;
    				break;
    			case 10:
    			case 4011:
    				skilleffect "SL_BLACKSMITH",0;
    				sc_start4 SC_SPIRIT,9999999,5,458,0,0;
    				break;
    			case 11:
    			case 4012:
    			case 4056:
    			case 4062:
    				skilleffect "SL_HUNTER",0;
    				sc_start4 SC_SPIRIT,9999999,5,460,0,0;
    				break;
    			case 4049:
    				skilleffect "SL_SOULLINKER",0;
    				sc_start4 SC_SPIRIT,9999999,5,461,0,0;
    				break;
    			default:
    				break;
    		}
    	}
    	end;
    	
    OnInit:
    	.VIP_item = 3000; //itemId
    	end;
    }

     

  6. https://github.com/rathena/rathena/blob/master/doc/script_commands.txt#L2778

     

    EQI_COMPOUND_ON (-1)      - Item slot that calls this script (In context of item script) - exclusive to getequipid
    EQI_ACC_L (0)             - Accessory 1
    EQI_ACC_R (1)             - Accessory 2
    EQI_SHOES (2)             - Footgear (shoes, boots)
    EQI_GARMENT (3)           - Garment (mufflers, hoods, manteaux)
    EQI_HEAD_LOW (4)          - Lower Headgear (beards, some masks)
    EQI_HEAD_MID (5)          - Middle Headgear (masks, glasses)
    EQI_HEAD_TOP (6)          - Upper Headgear
    EQI_ARMOR (7)             - Armor (jackets, robes)
    EQI_HAND_L (8)            - Left hand (weapons, shields)
    EQI_HAND_R (9)            - Right hand (weapons)
    EQI_COSTUME_HEAD_TOP (10) - Upper Costume Headgear
    EQI_COSTUME_HEAD_MID (11) - Middle Costume Headgear
    EQI_COSTUME_HEAD_LOW (12) - Lower Costume Headgear
    EQI_COSTUME_GARMENT (13)  - Costume Garment
    EQI_AMMO (14)    		  - Arrow/Ammunition
    EQI_SHADOW_ARMOR (15)     - Shadow Armor
    EQI_SHADOW_WEAPON (16)    - Shadow Weapon
    EQI_SHADOW_SHIELD (17)    - Shadow Shield
    EQI_SHADOW_SHOES (18)     - Shadow Shoes
    EQI_SHADOW_ACC_R (19)     - Shadow Accessory 2
    EQI_SHADOW_ACC_L (20)     - Shadow Accessory 1

     

    • Love 1
  7. On 6/1/2022 at 3:19 PM, Gidz Cross said:

    Works like charm. Thanks @cook1e!

     

    Heya @cook1e Ive discovered  that i cannot use token of siegfried anywhere. I have set my prontera with mapflag. Im trying to use token of siegfried in other maps but it doesnt work anymore. Hehe!

    I enabled the mapflag only in prontera and i can't use the token, but i can anywhere else.

    Everything is working as intended

  8. Tested and is working as intended, if you want some extra features in it just let me know.

     

    -	script	dotd	-1,{
    OnInit:
    .exp_bonus = 10; // change exp % here
    OnClock0000: // new dungeon of the day will be changed at 00:00 server time
    	setarray .random_maps$,"prontera","pay_dun00"; // add your maps here
    	.map = rand(getarraysize(.random_maps$));
    	announce "New Dungeon of the Day is '"+.random_maps$[.map]+"' with ["+.exp_bonus+"%] more EXP.",bc_all;
    	end;
    	
    OnNPCKillEvent:
    	getmapxy(.@map$,.@x,.@y,BL_PC);
    	if(.@map$ == .random_maps$[.map]) {
    		set BaseExp, BaseExp + (getmonsterinfo(killedrid,3) * .exp_bonus / 100);
    		set JobExp, JobExp + (getmonsterinfo(killedrid,4) * .exp_bonus / 100);
    	}
    	end;
    	
    OnPCLoginEvent:
    	dispbottom "Dungeon of the Day is '"+.random_maps$[.map]+"' with ["+.exp_bonus+"%] more EXP.",0x00FFFF;
    	end;
    }

     

  9. You can make a quest like Elysium said or use this one.
     

    new_1-3,100,35,4	script	Newbie Guide	418,{
    	mes "==^741188Equipment Guide^000000==";
    	mes "Hello welcome to our server,";
    	mes "i am here to guide all new";
    	mes "player that have joined our server";
    	mes "to craft your starting gear";
    	next;
    	switch(select("- Tell me more:- Craft Beginner Equipment:- Exit"))
    	{
    		case 1:
    			mes "==^741188Equipment Guide^000000==";
    			mes "As you may or my not knowing";
    			mes "that equipment will not drop by";
    			mes "monster, but player can still";
    			mes "obtain offical equipment from";
    			mes "merchat class equipment crafting";
    			mes "or from offical quest";
    			next;
    			mes "==^741188Equipment Guide^000000==";
    			mes "This server does not follow";
    			mes "offical equipment drop";
    			mes "but each server custom ";
    			mes "equipment will have it's own";
    			mes "speciality";
    			end;
    		case 2:
    			mes "==^741188Equipment Guide^000000==";
    			mes "To craft your starting gear";
    			mes "which is Beginner Dagger";
    			mes "firstly i will need you to";
    			mes "hunt 50 poring, i will reward";
    			mes "you with 1 Common Blue Print";
    			mes "Common Blue Print are use to craft";
    			mes "Common equipment";
    			next;
    			menu "Take this quest",Acc,"No Thanks",Den;
    				Acc:
    					if(dagger) {
    						mes "You already have this hunting quest.";
    						close;
    					}
    					mes "==^741188Equipment Guide^000000==";
    					mes "Now please help me hunt 50 poring";
    					set dagger, 1;
    					end;
    				Den:
    					mes "==^741188Equipment Guide^000000==";
    					mes "Sure just come back to me when you change your mind";
    					end;
    		case 3:
    			mes "==^741188Equipment Guide^000000==";
    			mes "Very well, come to me if you need guide";
    			close;
    		
    	}
    	end;
    OnNPCKillEvent:
    	if(!dagger) end;
    	if(killedrid == .mob_id) {
    		poring_count++;
    		dispbottom "You have killed "+poring_count+"/"+.kill_amount+"] "+getmonsterinfo(.mob_id, MOB_NAME)+".";
    	}
    	if(poring_count >= .kill_amount) {
    		poring_count = 0;
    		for(.@i = 0; .@i < getarraysize(.reward); .@i += 2) {
    			getitem .reward[.@i],.reward[.@i+1];
    		}
    	}
    	end;
    	
    OnInit:
    	setarray .reward,501,1,502,1; // add rewards here
    	.mob_id = 1002; // monster id
    	.kill_amount = 50; // amount of porings needed
    	end;
    }

     

  10. If you don't use the Roulette button, you can use the roulette as the config button, you can also change the roulette icon in your grf.

    go to src/map/clif.cpp

    Change
     

    void clif_roulette_open( struct map_session_data* sd ){
    	nullpo_retv( sd );
    
    	struct packet_roulette_open_ack p;
    
    	p.PacketType = 0xa1a;
    	p.Result = 0; // result
    	p.Serial = 0; // serial
    	p.Step = (sd->roulette.claimPrize) ? sd->roulette.stage - 1 : 0;
    	p.Idx = (sd->roulette.claimPrize) ? sd->roulette.prizeIdx : -1;
    	p.AdditionItemID = -1; //! TODO: Display bonus item
    	p.GoldPoint = sd->roulette_point.gold;
    	p.SilverPoint = sd->roulette_point.silver;
    	p.BronzePoint = sd->roulette_point.bronze;
    
    	sd->state.roulette_open = true;
    
    	clif_send( &p, sizeof( p ), &sd->bl, SELF );
    }

    to
     

    void clif_roulette_open( struct map_session_data* sd ){
    	nullpo_retv( sd );
    	npc_event_do_id("NPCNAME::OnLabel", sd->status.account_id);
    }


    and make a script like this, for example.

     

    -	script	NPCNAME	-1,{
    OnLabel:
    	mes "add whatever you want.";
    	end;
    }

     

    • Upvote 2
×
×
  • Create New...