Jump to content

Eross

Members
  • Posts

    378
  • Joined

  • Last visited

Posts posted by Eross

  1. Hi ! can anyone edit my this script .. I made a share exp for event MOTD . but I need to check if the member is on the same map with the mob killer because every time I kill a monster an exp applies on members wherever they are. Thanks a lot guys 

    OnNPCKillEvent:
    	query_sql ("SELECT `exp` FROM `party` WHERE `party_id` = "+ getcharid(1), .@exp);
    	if(killedrid!=$MobTypeLow && killedrid!=$MobTypeMid && killedrid!=$MobTypeHard ) { end; }
    	.@map$ = strcharinfo(3);
    	.mobid = killedrid;
    	if (.@exp) {addrid(2,0,getcharid(1));}
    	dispbottom "[Monster of the Day]: Experience Gained Base:"+strmobinfo(6,.mobid)+" Job:"+strmobinfo(7,.mobid)+"";
    	set BaseExp,(BaseExp+strmobinfo(6,.mobid));
    	set JobExp,(JobExp+strmobinfo(7,.mobid));
    	end;

     

  2. Hi ! Is it possible to rename homunculus like @petrename command ???

    /*==========================================
     *
     *------------------------------------------*/
    ACMD_FUNC(petrename)
    {
    	struct pet_data *pd;
    	nullpo_retr(-1, sd);
    	if (!sd->status.pet_id || !sd->pd) {
    		clif_displaymessage(fd, msg_txt(sd,184)); // Sorry, but you have no pet.
    		return -1;
    	}
    	pd = sd->pd;
    	if (!pd->pet.rename_flag) {
    		clif_displaymessage(fd, msg_txt(sd,188)); // You can already rename your pet.
    		return -1;
    	}
    
    	pd->pet.rename_flag = 0;
    	intif_save_petdata(sd->status.account_id, &pd->pet);
    	clif_send_petstatus(sd);
    	clif_displaymessage(fd, msg_txt(sd,187)); // You can now rename your pet.
    
    	return 0;
    }

     

  3. Hi ! Im using Monster of the Day script .. I just want to ask how to attach a certain party member on OnNPCKillEvent script ?? I made it work but the problem is I have a party level gap of 15 .. I want to disable this to a certain member if he/she is below or above the said level gap ... 

     

    //**********************************************************************************
    // ____                    _                                            _   _  ____ 
    //|  _ \ ___   ___   ____ | |  ___   ____   ___   ___   __  ___   _  _ | |_| |/ __ |
    //| |__// _ \ / _ \ |  _ \| | / _ \ |  _ \ / _ \ /  _| / _)/ _ \ | \| ||___  |\__  |
    //| |  |  __/ ||_|| | |__/| ||  __/ | |__/|  __/ | |  _\ \ ||_|| | \\ |    | |   | |
    //|_|___\___|_\___/_| |___|_|_\___|_| |____\___|_|_|_(___/ \___/_|_|\_|____|_|___|_|
    //------------------|_|-------------|_|---------------------------------------------
    //**********************************************************************************
    //===== rAthena Script =============================================================
    //= Monster Of The Day
    //===== By: ========================================================================
    //= Peopleperson49 (Eddie) - [email protected]
    //===== Start Date: ================================================================
    //= 20NOV2011
    //===== Current Version: ===========================================================
    //= 1.4
    //===== Compatible With: ===========================================================
    //= rAthena SVN
    //===== Description: ===============================================================
    //= Another Monster Of The Day script. I made this one from scratch to be very
    //=	simple and work automatically. Uses almost the full list of monsters from
    //=	the mob_branch. I included the dispbottom here when players login, but I
    //=	actually perfer to use a login script with this in it.
    //===== Version Control: ===========================================================
    //= 1.0 First Version.
    //= 1.1	Broke .MobTypeArray[0] into ten seperate arrays to allow full list of mobs
    //=	to be used without overflowing the array. Before I had to limit the number
    //=	of mobs in an array to around 100 or I would randomly get an error from it.
    //= 1.2	Modified script to not change mobs if scripts are reloaded. Will set mob if
    //=	not already set on OnInit.
    //= 1.3 Changed getexp to BaseExp.
    //= 1.4 Added bindatcmd to allow GM to repick the MOTD.
    //===== Additional Comments:========================================================
    //= 
    //==================================================================================
    //-	script	MOTD#RoUG	-1,{
    //end;
    prontera,151,191,4	script	Monster of the Day	802 ,{
    mes "[Monster Of The Day]";
    mes "You will earn twice the EXP from killing the following monsters today!:";
    mes "[^FF0000Low Difficulty^000000] "+getmonsterinfo($MobTypeLow,0)+"s [^0000ff"+$MobTypeLow+"^000000] ";
    mes "[^FF0000Mid Difficulty^000000] "+getmonsterinfo($MobTypeMid,0)+"s [^0000ff"+$MobTypeMid+"^000000] ";
    mes "[^FF0000Hard Difficulty^000000] "+getmonsterinfo($MobTypeHard,0)+"s [^0000ff"+$MobTypeHard+"^000000] ";
    end;
    OnInit:
    bindatcmd "motd",strnpcinfo(0)+"::OnCheck";
    bindatcmd("repickmotd",strnpcinfo(3)+"::OnAtcommand");
    if($MobType!=0) { end; }
    OnClock0000:
    setarray .MobTypeArrayLow[0],1033, //Elder Willow
    							1060, //Bigfoot
    							1294, //Mantis
    							1013, //Wolves
    							1054, //Male Theif bug
    							1018, //Creamy
    							1111, //Drainliar
    							1015, //Zombie
    							1068, //Hydra
    							1057, //Yoyo
    							1019, //Pecopeco
    							1170, //Sohee
    							1007, //Fabre
    							1113, //Drops
    							1055, //Muka
    							1026, //Munak
    							1128; //Horn
    
    setarray .MobTypeArrayMid[0],1035, //Hunter Fly
    							 1278, //Stalactic Golem
    							 1061, //Nightmare
    							 1001, //Scorpion
    							 1243, //Sasquatch
    							 1099, //Argiope
    							 1158, //Phen
    							 1032, //Verit
    							 1029, //Isis
    							 1069, //Swordfish
    							 1149, //Minorous
    							 1178, //Zerom
    							 1044, //Obeanue
    							 1034, //Thara Frog
    							 1045, //Marc
    							 1152, //Skeletal Orc
    							 1213; //High Orc
    
    setarray .MobTypeArrayHard[0],1098, //Anubis
    							  1379, //Nightmare Terror	
    							  1777, //Ice Golem
    							  1163, //Raydric
    							  1783, //Galion
    							  1365, //Apocalypse
    							  1206, //Anolian
    							  1310, //Majorurous
    							  1320, //Owl Duke
    							  1682, //Remover
    							  1762, //Frus
    							  1752, //Skogul
    							  1714, //Ferus
    							  1713, //Acidus
    							  1315, //Assaulter
    							  1319, //Freezer
    							  1148, //Medusa
    							  1676, //Venatu
    							  1677, //Venatu
    							  1678, //Venatu
    							  1679; //Venatu
    
    set $MobTypeLow,.MobTypeArrayLow[rand(0,16)];
    set $MobTypeMid,.MobTypeArrayMid[rand(0,16)];
    set $MobTypeHard,.MobTypeArrayHard[rand(0,20)];
    announce "[Monster of the Day]: Players will earn twice the EXP from hunting "+getmonsterinfo($MobTypeLow,0)+"s ["+$MobTypeLow+"], "+getmonsterinfo($MobTypeMid,0)+"s ["+$MobTypeMid+"] and "+getmonsterinfo($MobTypeHard,0)+"s ["+$MobTypeHard+"] today!",0;
    end;
    
    OnNPCKillEvent:
    	if(killedrid!=$MobTypeLow && killedrid!=$MobTypeMid && killedrid!=$MobTypeHard ) { end; }
    	.mobid = killedrid;
    	addrid(2,0,getcharid(1));
    	dispbottom "[Monster of the Day]: Experience Gained Base:"+strmobinfo(6,.mobid)+" Job:"+strmobinfo(7,.mobid)+"";
    	set BaseExp,(BaseExp+strmobinfo(6,.mobid));
    	set JobExp,(JobExp+strmobinfo(7,.mobid));
    	end;
    
    OnAtcommand:
    setarray .MobTypeArrayLow[0],1033, //Elder Willow
    							1060, //Bigfoot
    							1294, //Mantis
    							1013, //Wolves
    							1054, //Male Theif bug
    							1018, //Creamy
    							1111, //Drainliar
    							1015, //Zombie
    							1068, //Hydra
    							1057, //Yoyo
    							1019, //Pecopeco
    							1170, //Sohee
    							1007, //Fabre
    							1113, //Drops
    							1055, //Muka
    							1026, //Munak
    							1128; //Horn
    
    setarray .MobTypeArrayMid[0],1035, //Hunter Fly
    							 1278, //Stalactic Golem
    							 1061, //Nightmare
    							 1001, //Scorpion
    							 1243, //Sasquatch
    							 1099, //Argiope
    							 1158, //Phen
    							 1032, //Verit
    							 1029, //Isis
    							 1069, //Swordfish
    							 1149, //Minorous
    							 1178, //Zerom
    							 1044, //Obeanue
    							 1034, //Thara Frog
    							 1045, //Marc
    							 1152, //Skeletal Orc
    							 1213; //High Orc
    
    setarray .MobTypeArrayHard[0],1098, //Anubis
    							  1379, //Nightmare Terror	
    							  1777, //Ice Golem
    							  1163, //Raydric
    							  1783, //Galion
    							  1365, //Apocalypse
    							  1206, //Anolian
    							  1310, //Majorurous
    							  1320, //Owl Duke
    							  1682, //Remover
    							  1762, //Frus
    							  1752, //Skogul
    							  1714, //Ferus
    							  1713, //Acidus
    							  1315, //Assaulter
    							  1319, //Freezer
    							  1148, //Medusa
    							  1676, //Venatu
    							  1677, //Venatu
    							  1678, //Venatu
    							  1679; //Venatu
    
    set $MobTypeLow,.MobTypeArrayLow[rand(0,16)];
    set $MobTypeMid,.MobTypeArrayMid[rand(0,16)];
    set $MobTypeHard,.MobTypeArrayHard[rand(0,20)];
    announce "[Monster of the Day]: Players will earn twice the EXP from hunting "+getmonsterinfo($MobTypeLow,0)+"s ["+$MobTypeLow+"], "+getmonsterinfo($MobTypeMid,0)+"s ["+$MobTypeMid+"] and "+getmonsterinfo($MobTypeHard,0)+"s ["+$MobTypeHard+"] today!",0;
    end;
    
    OnCheck:
    	dispbottom "[Monster of the Day]: Players will earn twice the EXP from hunting "+getmonsterinfo($MobTypeLow,0)+"s ["+$MobTypeLow+"], "+getmonsterinfo($MobTypeMid,0)+"s ["+$MobTypeMid+"] and "+getmonsterinfo($MobTypeHard,0)+"s ["+$MobTypeHard+"] today!",0xFFFF00;
    end;
    
    OnPCLoginEvent:
    if (#pcloginflag&128) end;
    	dispbottom "[Monster of the Day]: Players will earn twice the EXP from hunting "+getmonsterinfo($MobTypeLow,0)+"s ["+$MobTypeLow+"], "+getmonsterinfo($MobTypeMid,0)+"s ["+$MobTypeMid+"] and "+getmonsterinfo($MobTypeHard,0)+"s ["+$MobTypeHard+"] today!",0xFFFF00;
    	end;
    }
    }

     

  4. Hi ! Im using this MOTD script .. I just wanna ask how to also give atleast a portion of exp to party members when a player kills a monster ? Coz this script only give bonus exp to the mob killer.

    OnNPCKillEvent:
    	if(killedrid!=$MobTypeLow && killedrid!=$MobTypeMid && killedrid!=$MobTypeHard ) { end; }
    	dispbottom "[Monster of the Day]: Experience Gained Base:"+strmobinfo(6,killedrid)+" Job:"+strmobinfo(7,killedrid)+"";
    	set BaseExp,(BaseExp+strmobinfo(6,killedrid));
    	set JobExp,(JobExp+strmobinfo(7,killedrid));
    	end;

     

  5. Hi ! Im using hourly point system from rathena .. I just want to add a feature that check if there are other logged in players with same Gepard ID. regardless the map or area ... For example I logged in my first account , The hourly system will start the countdown for rewards, But if I login my 2nd account there will be a message that "We have detected same Gepard ID logged in in game. We will hault your hourly points system."

    Heres the script .. I hope someone can help me ?

    -	script	hourlypoints	FAKE_NPC,{
     
    OnInit:
        //announce "[30 Minutes Points System]: The system have been reloaded, please relog again to get more points.", bc_all;
        announce "[Hourly Reward System]: Hourly system has been reloaded, please relog again to get more points.", bc_all;
     
        .point_name$ = "Hourly Points";
        .point_amt = 5;    // Normal points gained.
        .dlimit = 900;    // Stop points if afk greater then in seconds. 600s = 10 minutes //43200
        .enable = 1;
        .level = 0;
        .online_time = 3600; // One hour = 3600 seconds
     
        bindatcmd "hourlyinfo", "hourlypoints::OnAtcommand", 0, 100;
    	//bindatcmd "hourlypoints", "hourlypoints::OnCheckPoints", 0, 100;
        end;
     
    OnPCLoginEvent:
        if (BaseLevel >= .level)
        {
            #idle = 0;
            @backup_time = 0;
     
            if (!#acctick || #acctick > .online_time)
                #acctick = gettimetick(2) + .online_time;
            else
                #acctick += gettimetick(2);
     
            while(.enable)
            {
                @idle_time = checkidle();
     
                if (checkvending() >= 1 || checkchatting() == 1 || @idle_time >= .dlimit) // 
                {
                    #acctick += @idle_time; // Add idle time
                    #idle = 1;
                    dispbottom "The hourly points event haulted because you were vending, chatting, or idle.";
                }
                else
                {
                    sleep2 1000;
     
                    @backup_time = .@time_left = #acctick - gettimetick(2);
     
                    if (.@time_left <= 0) {
                    
    					if (vip_status(1)) {
    						#HOURLYPOINTS += .point_amt + 1;
    						#acctick = gettimetick(2) + .online_time;
    					     dispbottom "[Hourly Reward System]: Gained " + .point_amt + " " + .point_name$ + " +1 " + .point_name$ + " [Vip Bonus]. Stay online and gain more points.";
    
    					}
    					else {
                        #HOURLYPOINTS += .point_amt;
                        #acctick = gettimetick(2) + .online_time;
                        dispbottom "[Hourly Reward System]: Gained " + .point_amt + " " + .point_name$ + ". Total " + #HOURLYPOINTS + " Hourly Points. Stay online to gain more points.";
    					}
                    }
                    else
                    {
                        .@time_left = .online_time - .@time_left;
                        .@Time$ = "";
                        .@Minutes = .@time_left / 60;
                        .@time_left -= (.@Minutes * 60);
     
                        if (.@Minutes > 1)
                            .@Time$ += .@Minutes + " minutes, ";
                        else if (.@Minutes > 0)
                            .@Time$ += .@Minutes + " minute, ";
     
                        if (.@time_left > 1 || .@time_left == 0)
                            .@Time$ += .@time_left + " seconds";
                        else if (.@time_left == 1)
                            .@Time$ += .@time_left + " second";
     
                        if (.@Minutes == 15 && .@time_left == 0 || .@Minutes == 30 && .@time_left == 0 || .@Minutes == 45 && .@time_left == 0)
                            dispbottom "[Hourly Reward System]: You spend a total of [" + .@Time$ + "] playing.";
                    }
                }
     
                if (#idle)
                    break;
            }
        }
        end;
     
    OnPCLogoutEvent:
        // BackUP online time
        if (BaseLevel >= .level)
        {
            if (@backup_time)
                #acctick = @backup_time;
        }
        end;
    OnCheckPoints: 
    	dispbottom "[Hourly Reward System]: You have a total of ["+ #HOURLYPOINTS +"] Hourly Points.",0xRRGGBB;
    	end;
    OnAtcommand:
        if (BaseLevel >= .level)
        {
            if (#idle)
            {
                .@Time$ = "";
                .@Minutes = @idle_time / 60;
                .@time_left = @idle_time - (.@Minutes * 60);
     
                if (.@Minutes > 1)
                    .@Time$ += .@Minutes + " minutes, ";
                else if (.@Minutes > 0)
                    .@Time$ += .@Minutes + " minute, ";
     
                if (.@time_left > 1 || .@time_left == 0)
                    .@Time$ += .@time_left + " seconds";
                else if (.@time_left == 1)
                    .@Time$ += .@time_left + " second";
     
                dispbottom "[Hourly Reward System]: You been idle for " + .@Time$ + ". Please relog again.",0xRRGGBB;
            }
            else
            {
                .@time_left = @backup_time;
                .@Time$ = "";
                .@Minutes = .@time_left / 60;
                .@time_left -= (.@Minutes * 60);
     
                if (.@Minutes > 1)
                    .@Time$ += .@Minutes + " minutes, ";
                else if (.@Minutes > 0)
                    .@Time$ += .@Minutes + " minute, ";
     
                if (.@time_left > 1 || .@time_left == 0)
                    .@Time$ += .@time_left + " seconds";
                else if (.@time_left == 1)
                    .@Time$ += .@time_left + " second";
     
                dispbottom "[Hourly Reward System]: You have [" + .@Time$ + "] left in able to gain a hourly points.",0xRRGGBB;
            }
        }
        end;
    }
    
    
    
    

      

  6. 11 minutes ago, Forshaken said:

    try to indicate inside the txt file of the the script the loadevent mapflag. You have to put it after the script just like how we do on the other mapflags or try to set an array to blocklist some maps to your list. 
    ex.
    prontera mapflag loadevent

    Yes I tried sir .. But every time I use fly wing in prontera the dispel still triggers .. It should be on warp only not on teleport

     

  7. Hi guys ! Ive created a simple script that will dispel a player on map load. But the problem is my only plan is to dispel players who enter the portal or who uses warps (priest), so inshort it has to be a different map to trigger the dispel and not by Teleport skill.. How to make teleport skip the dispel ?? thankyou ..

    OnPCLoadMapEvent:
    //for( set .i,0; .i < getarraysize( .Maps$ ); set .i,.i + 1 )
    	//if( strcharinfo(3) == .Maps$[.i] )
    		//sc_end sc_spirit;
    		sc_end sc_gospel;
    		sc_end SC_POEMBRAGI;
    		sc_end SC_APPLEIDUN;
    		sc_end SC_ASSNCROS;
    		sc_end SC_WHISTLE;
    		//sc_end 37; // holy weapon
    		//sc_end 38; // holy armor
    		sc_end 187; // increase all stat
    		sc_end 194; // increase hit
    		sc_end 196; // increase flee
    		sc_end 198; // max hp increase
    		sc_end 199; // max sp increase
    		sc_end 200; // attach strength
    		sc_end 202; // increase def	
    		sc_end 214; // SC_SCRESIST
    		sc_end 175; // POEMBRAGI
    		sc_end 181; // SERVICE4U
    		//specialeffect2 235;
    		end;

     

  8. 6 hours ago, Emistry said:
    -	script	atcmd_example	-1,{
    OnInit:
    	bindatcmd "killcount", strnpcinfo(3) + "::OnAtcommand";
    	end;
    	
    OnAtcommand:
    	if (compare(.@atcmd_parameters$, "reset")) {
    		#killcount_mob_id = 0;
    		#killcount_amount = 0;
    		dispbottom .@atcmd_command$+" reset successfully.";
    	}
    	else if (getmonsterinfo(atoi(.@atcmd_parameters$), MOB_NAME) != "null") {
    		.@killcount_mob_id = atoi(.@atcmd_parameters$);
    		if (.@killcount_mob_id != #killcount_mob_id) {
    			#killcount_mob_id = .@killcount_mob_id;
    			#killcount_amount = 0;
    			dispbottom .@atcmd_command$+" will start count "+getmonsterinfo(#killcount_mob_id, MOB_NAME)+".";
    		}
    	}
    	else if (#killcount_mob_id) {
    		dispbottom getmonsterinfo(#killcount_mob_id, MOB_NAME)+" Kill: "+F_InsertComma(#killcount_amount);
    	}
    	else {
    		dispbottom .@atcmd_command$+" failed. Usage: "+.@atcmd_command$+" <mob_id/reset>";
    	}
    	end;
    	
    OnNPCKillEvent:
    	if (killedrid == #killcount_mob_id) {
    		#killcount_amount++;
    		dispbottom getmonsterinfo(#killcount_mob_id, MOB_NAME)+" Kill: "+F_InsertComma(#killcount_amount);
    	}
    	end;
    }

     

    Thankyou sir !!! I will try this later ... One more question .. How about making it up to max 5 mob id ??? like for example I type @killcount Poring and @killcount Fabre and 3 other they all work but on 6th it should say , @killcount max is 5 only . with @killcount reset 1 to 5 ,,and @killcount will show 5 mobs ..Thankyou sir 

  9. Hi ! I would like to request for a script that counts mob kills .. 

     @killcount <mob id> or @killcount <mobname>
     

    For example. @killcount 1002 / @killcount Poring or poring (not case sensitive) . Everytime I kill poring a bottom message will show on my bottom chat saying "Poring kill: <number of kills>" .. When I type @killcount without monster name or ID it should show "Killed Porings: <kill count>" ..With @killcount reset function. Thanks 

  10. Hi ! Im using an old Hourly System, I just want to add a feature that will: 

    1. Allow first player of first account to login and activate hourly system

    2. the second and next dual character will automatically been hault its system and wont get any hourly points 

    3. Regardless the map, even they have different maps it will check the gepard id 

     

    Sorry for my bad english. I hope you can help me 

    The Script im using :

    -	script	hourlypoints	FAKE_NPC,{
     
    OnInit:
        //announce "[30 Minutes Points System]: The system have been reloaded, please relog again to get more points.", bc_all;
        announce "[Hourly Reward System]: Hourly system has been reloaded, please relog again to get more points.", bc_all;
     
        .point_name$ = "Hourly Points";
        .point_amt = 5;    // Normal points gained.
        .dlimit = 900;    // Stop points if afk greater then in seconds. 600s = 10 minutes //43200
        .enable = 1;
        .level = 0;
        .online_time = 3600; // One hour = 3600 seconds
     
        bindatcmd "hourlyinfo", "hourlypoints::OnAtcommand", 0, 100;
    	//bindatcmd "hourlypoints", "hourlypoints::OnCheckPoints", 0, 100;
        end;
     
    OnPCLoginEvent:
        if (BaseLevel >= .level)
        {
            #idle = 0;
            @backup_time = 0;
     
            if (!#acctick || #acctick > .online_time)
                #acctick = gettimetick(2) + .online_time;
            else
                #acctick += gettimetick(2);
     
            while(.enable)
            {
                @idle_time = checkidle();
     
                if (checkvending() >= 1 || checkchatting() == 1 || @idle_time >= .dlimit) // 
                {
                    #acctick += @idle_time; // Add idle time
                    #idle = 1;
                    dispbottom "The hourly points event haulted because you were vending, chatting, or idle.";
                }
                else
                {
                    sleep2 1000;
     
                    @backup_time = .@time_left = #acctick - gettimetick(2);
     
                    if (.@time_left <= 0) {
                    
    					if (vip_status(1)) {
    						#HOURLYPOINTS += .point_amt + 1;
    						#acctick = gettimetick(2) + .online_time;
    					     dispbottom "[Hourly Reward System]: Gained " + .point_amt + " " + .point_name$ + " +1 " + .point_name$ + " [Vip Bonus]. Stay online and gain more points.";
    
    					}
    					else {
                        #HOURLYPOINTS += .point_amt;
                        #acctick = gettimetick(2) + .online_time;
                        dispbottom "[Hourly Reward System]: Gained " + .point_amt + " " + .point_name$ + ". Total " + #HOURLYPOINTS + " Hourly Points. Stay online to gain more points.";
    					}
                    }
                    else
                    {
                        .@time_left = .online_time - .@time_left;
                        .@Time$ = "";
                        .@Minutes = .@time_left / 60;
                        .@time_left -= (.@Minutes * 60);
     
                        if (.@Minutes > 1)
                            .@Time$ += .@Minutes + " minutes, ";
                        else if (.@Minutes > 0)
                            .@Time$ += .@Minutes + " minute, ";
     
                        if (.@time_left > 1 || .@time_left == 0)
                            .@Time$ += .@time_left + " seconds";
                        else if (.@time_left == 1)
                            .@Time$ += .@time_left + " second";
     
                        if (.@Minutes == 15 && .@time_left == 0 || .@Minutes == 30 && .@time_left == 0 || .@Minutes == 45 && .@time_left == 0)
                            dispbottom "[Hourly Reward System]: You spend a total of [" + .@Time$ + "] playing.";
                    }
                }
     
                if (#idle)
                    break;
            }
        }
        end;
     
    OnPCLogoutEvent:
        // BackUP online time
        if (BaseLevel >= .level)
        {
            if (@backup_time)
                #acctick = @backup_time;
        }
        end;
    OnCheckPoints: 
    	dispbottom "[Hourly Reward System]: You have a total of ["+ #HOURLYPOINTS +"] Hourly Points.",0xRRGGBB;
    	end;
    OnAtcommand:
        if (BaseLevel >= .level)
        {
            if (#idle)
            {
                .@Time$ = "";
                .@Minutes = @idle_time / 60;
                .@time_left = @idle_time - (.@Minutes * 60);
     
                if (.@Minutes > 1)
                    .@Time$ += .@Minutes + " minutes, ";
                else if (.@Minutes > 0)
                    .@Time$ += .@Minutes + " minute, ";
     
                if (.@time_left > 1 || .@time_left == 0)
                    .@Time$ += .@time_left + " seconds";
                else if (.@time_left == 1)
                    .@Time$ += .@time_left + " second";
     
                dispbottom "[Hourly Reward System]: You been idle for " + .@Time$ + ". Please relog again.",0xRRGGBB;
            }
            else
            {
                .@time_left = @backup_time;
                .@Time$ = "";
                .@Minutes = .@time_left / 60;
                .@time_left -= (.@Minutes * 60);
     
                if (.@Minutes > 1)
                    .@Time$ += .@Minutes + " minutes, ";
                else if (.@Minutes > 0)
                    .@Time$ += .@Minutes + " minute, ";
     
                if (.@time_left > 1 || .@time_left == 0)
                    .@Time$ += .@time_left + " seconds";
                else if (.@time_left == 1)
                    .@Time$ += .@time_left + " second";
     
                dispbottom "[Hourly Reward System]: You have [" + .@Time$ + "] left in able to gain a hourly points.",0xRRGGBB;
            }
        }
        end;
    }
    
    
    
    

     

  11. Good day ! I've created a simple give away npc that has name of event GM on it 

    image.png.9d751bbaca9703a5576fbd8b99e3cc94.png

    My questions is .. Is it possible to broadcast the item name including the name that signed into it ?? For example, I will open this scroll and the broadcast should be : 

    "[Player Name] has obtained Battle Manual from [Eross's Angel Egg Scroll]!!!"

    Instead of just:

    "[Player Name] has obtained Battle Manual from [Angel Egg Scroll]!!!"

     

    Thankyou and a Blessed  Sunday to everyone

  12. Hi ! Does anyone here know how to revert the claymore trap behavior to its classic behavior ?? Claymore trap now can only hit 1 but my players want the old behavior which hits multiple .. Please help anyone .. I saw a guide in hercules but I think its not compatible with rathena 
     

     

  13. Hi ! Im using 2013 client with custom job diff and works perfectly fine ... Im using LUAs on admin 

    image.png.6de6e5743bddd31462d8c7f5139faed4.png

     

    My problem is, I decided to upgrade to 2015 client but seems like its not working anymore and Im getting loop error message when trying to launch client...Can anyone help me ? Thanks

  14. 7 hours ago, Easycore said:

    Okay, here we go:

    Open skill.cpp and search:

    	case ST_PRESERVE:

    And comment this line. (adding //)

    Then search:
     

    	case TK_DODGE:

    And add below case ST_PRESERVE:

    	case TK_DODGE:
    	case ST_PRESERVE:

    Open status.cpp and search:
     

    		/* Permanent effects */

    And add below case SC_PRESERVE:
     

    		/* Permanent effects */
    		case SC_PRESERVE:

    Then search:
     

    			switch (i) { // Type 0: PC killed -> Place here statuses that do not dispel on death.
    			case SC_ELEMENTALCHANGE: // Only when its Holy or Dark that it doesn't dispell on death
    				if( sc->data[i]->val2 != ELE_HOLY && sc->data[i]->val2 != ELE_DARK )
    					break;

    And add below case SC_PRESERVE:
     

    			switch (i) { // Type 0: PC killed -> Place here statuses that do not dispel on death.
    			case SC_ELEMENTALCHANGE: // Only when its Holy or Dark that it doesn't dispell on death
    				if( sc->data[i]->val2 != ELE_HOLY && sc->data[i]->val2 != ELE_DARK )
    					break;
    			case SC_PRESERVE:

    Open map.cpp and search:

    status_change_end(&sd->bl, SC_PRESERVE, INVALID_TIMER);

    Comment this line adding //.

    Now you done. Don't forget to recompile your emulator.

    Hi ! I've already did some of this but I noticed that there are some steps I didnt done ... Can you point out what step is for not removing the buff on relogin in ... Thankyou so much btw sir

     

    image.thumb.png.b523f3f2e53b25e493027f55d48ebda7.png

  15. 26 minutes ago, Emistry said:
    atcommand "@petrename "+.@name$;

    use this instead.

     

    if you are using the SQL method above, your char need to be disconnected from server before the SQL query is executed to update the server, otherwise your current character data will override the changes when it saved into database upon logout.

    Thanks ! how about in homunculus sir ?

  16. Hi ! I have a script that disable dual gepard id in a map ... How to make this allow only 3 same gepard ID in map ??? Thanks 

    -	script	disable_duals	-1,{
    	end;
    
    OnInit:
    	// 1= if you have gepard 0=if you do not use gepard
    	set .Gepard,1;
    	setarray .current_maps$[0] , "pvp_n_1-5",
    								 "guild_vs1",
    								 "guild_vs2",
    								 "guild_vs3",
    								 "guild_vs4",
    								 "guild_vs5",
    								 "pvp_y_1-2",
    								 "pvp_y_2-2",
    								 "prtg_cas01",
    								 "prtg_cas02",
    								 "prtg_cas03",
    								 "prtg_cas04",
    								 "prtg_cas05",
    								 "payg_cas01",
    								 "payg_cas02",
    								 "payg_cas03",
    								 "payg_cas04",
    								 "payg_cas05",
    								 "gefg_cas01",
    								 "gefg_cas02",
    								 "gefg_cas03",
    								 "gefg_cas04",
    								 "gefg_cas05",
    								 "aldeg_cas01",
    								 "aldeg_cas02",
    								 "aldeg_cas03",
    								 "aldeg_cas04",
    								 "aldeg_cas05",
    								 "arug_cas01",
    								 "arug_cas02",
    								 "arug_cas03",
    								 "arug_cas04",
    								 "arug_cas05",
    								 "schg_cas01",
    								 "schg_cas02",
    								 "schg_cas03",
    								 "schg_cas04",
    								 "schg_cas05",
    								 "ordeal_1-1";
    	end;
    	
    OnPCLoadMapEvent:
    	if (.Gepard == 1) {	//GEPARD SHIELD ID CHECKER
    		for(set .@i ,0;.@i<getarraysize(.current_maps$);set .@i,.@i+1) {
    			if (strcharinfo(3) == .current_maps$[.@i]) {	
    				getmapxy(.@map$,.@mapx,.@mapy,BL_PC);
    			}
    		}	
    		query_sql("SELECT last_unique_id FROM `login` WHERE account_id = "+getcharid(3)+"", .@UniqueId$);
    		query_sql("SELECT account_id FROM `login` WHERE last_unique_id = '"+.@UniqueId$+"'", .@CuentaId);
    		set .@error,getcharid(3,strcharinfo(0));
    		
    		for(set .@i ,0;.@i<getarraysize(.@CuentaId);set .@i,.@i+1) {
    			if(attachrid(.@CuentaId[.@i])) {
    				if (.@CuentaId == 2000001) {
    					set .@j,0;
    				} 
    				else {
    					getmapxy(.@map2$,.@mapx2,.@mapy2,BL_PC);
    					if (.@map2$ == .@map$){
    						set .@j,.@j+1;
    					}
    				}
    			}	
    		}
    		detachrid;
    	
    		attachrid .@error;
    		if(.@j > 1) {
    			dispbottom "Sorry, dual login is not allowed on this map.";
    			sleep2 500;
    			dispbottom "Warping you back to Savepoint now...";
    			sleep2 1000;
    			warp "SavePoint",0,0;
    		}
    		end;
    	} 
    	
    	else {
    		for(set .@i ,0;.@i<getarraysize(.current_maps$);set .@i,.@i+1) {
    			if (strcharinfo(3) == .current_maps$[.@i]) {	
    				getmapxy(.@map$,.@mapx,.@mapy,BL_PC);
    			}
    		}	
    		query_sql("SELECT last_ip FROM `login` WHERE account_id = "+getcharid(3)+"", .@UltimaIp$);
    		query_sql("SELECT account_id FROM `login` WHERE last_ip = '"+.@UltimaIp$+"'", .@CuentaId);
    		set .@error,getcharid(3,strcharinfo(0));
    		for(set .@i ,0;.@i<getarraysize(.@CuentaId);set .@i,.@i+1) {
    			if(attachrid(.@CuentaId[.@i])) {
    		//if .Gepard is 0 add id of accounts to which the system will not affect, brothers, couple, gms, etc ... .@CuentaId == accountId
    				if (.@CuentaId == 2000001 || .@cuentaId == 2000156 || .@CuentaId == 2000249 || .@CuentaId == 2000002 || .@CuentaId == 2000031 || .@CuentaId == 2000050 || .@CuentaId == 2000021 || .@CuentaId == 2000073 || .@CuentaId == 2000029) {
    					set .@j,0;
    				} 
    				else {
    					getmapxy(.@map2$,.@mapx2,.@mapy2,BL_PC);
    					if (.@map2$ == .@map$){
    						set .@j,.@j+1;
    					}
    				}
    			}	
    		}
    		detachrid;
    	
    		attachrid .@error;
    		if(.@j > 1) {
    			dispbottom "Sorry, Double Login is not allowed on this map.";
    			sleep2 1000;
    			dispbottom "Warping you back to Savepoint...";
    			sleep2 2000;
    			warp "SavePoint",0,0;
    		}
    		end;
    	}
    }
    

     

  17. Hi ! I just need help how to lessen the points given whenever a player goes AFK or IDLE .. This is an old Hourly system , I want to just give 1 point to those Afk players . they will continue gaining points while idle but not same as active players who have 5 to 6 points ... Thankyou !
     

    -	script	hourlypoints	FAKE_NPC,{
     
    OnInit:
        //announce "[30 Minutes Points System]: The system have been reloaded, please relog again to get more points.", bc_all;
        announce "[Hourly Reward System]: Hourly system has been reloaded, please relog again to get more points.", bc_all;
     
        .point_name$ = "Hourly Points";
        .point_amt = 5;    // Normal points gained.
        .dlimit = 900;    // Stop points if afk greater then in seconds. 600s = 10 minutes //43200
        .enable = 1;
        .level = 0;
        .online_time = 3600; // One hour = 3600 seconds
     
        bindatcmd "hourlytime", "hourlypoints::OnAtcommand", 0, 100;
    	bindatcmd "hourlypoints", "hourlypoints::OnCheckPoints", 0, 100;
        end;
     
    OnPCLoginEvent:
        if (BaseLevel >= .level)
        {
            #idle = 0;
            @backup_time = 0;
     
            if (!#acctick || #acctick > .online_time)
                #acctick = gettimetick(2) + .online_time;
            else
                #acctick += gettimetick(2);
     
            while(.enable)
            {
                @idle_time = checkidle();
     
                if (checkvending() >= 1 || checkchatting() == 1 || @idle_time >= .dlimit) // 
                {
                    #acctick += @idle_time; // Add idle time
                    #idle = 1;
                    dispbottom "The hourly points event haulted because you were vending, chatting, or idle.";
                }
                else
                {
                    sleep2 1000;
     
                    @backup_time = .@time_left = #acctick - gettimetick(2);
     
                    if (.@time_left <= 0) {
                    
    					if (vip_status(1)) {
    						#HOURLYPOINTS += .point_amt + 1;
    						#acctick = gettimetick(2) + .online_time;
    					     dispbottom "[Hourly Reward System]: Gained " + .point_amt + " " + .point_name$ + " +1 " + .point_name$ + " [Vip Bonus]. Stay online and gain more points.";
    
    					}
    					else {
                        #HOURLYPOINTS += .point_amt;
                        #acctick = gettimetick(2) + .online_time;
                        dispbottom "[Hourly Reward System]: Gained " + .point_amt + " " + .point_name$ + ". Total " + #HOURLYPOINTS + " Hourly Points. Stay online to gain more points.";
    					}
                    }
                    else
                    {
                        .@time_left = .online_time - .@time_left;
                        .@Time$ = "";
                        .@Minutes = .@time_left / 60;
                        .@time_left -= (.@Minutes * 60);
     
                        if (.@Minutes > 1)
                            .@Time$ += .@Minutes + " minutes, ";
                        else if (.@Minutes > 0)
                            .@Time$ += .@Minutes + " minute, ";
     
                        if (.@time_left > 1 || .@time_left == 0)
                            .@Time$ += .@time_left + " seconds";
                        else if (.@time_left == 1)
                            .@Time$ += .@time_left + " second";
     
                        if (.@Minutes == 15 && .@time_left == 0 || .@Minutes == 30 && .@time_left == 0 || .@Minutes == 45 && .@time_left == 0)
                            dispbottom "[Hourly Reward System]: You spend a total of [" + .@Time$ + "] playing.";
                    }
                }
     
                if (#idle)
                    break;
            }
        }
        end;
     
    OnPCLogoutEvent:
        // BackUP online time
        if (BaseLevel >= .level)
        {
            if (@backup_time)
                #acctick = @backup_time;
        }
        end;
    OnCheckPoints: 
    	dispbottom "[Hourly Reward System]: You have a total of ["+ #HOURLYPOINTS +"] Hourly Points.",0xRRGGBB;
    	end;
    OnAtcommand:
        if (BaseLevel >= .level)
        {
            if (#idle)
            {
                .@Time$ = "";
                .@Minutes = @idle_time / 60;
                .@time_left = @idle_time - (.@Minutes * 60);
     
                if (.@Minutes > 1)
                    .@Time$ += .@Minutes + " minutes, ";
                else if (.@Minutes > 0)
                    .@Time$ += .@Minutes + " minute, ";
     
                if (.@time_left > 1 || .@time_left == 0)
                    .@Time$ += .@time_left + " seconds";
                else if (.@time_left == 1)
                    .@Time$ += .@time_left + " second";
     
                dispbottom "[Hourly Reward System]: You been idle for " + .@Time$ + ". Please relog again.",0xRRGGBB;
            }
            else
            {
                .@time_left = @backup_time;
                .@Time$ = "";
                .@Minutes = .@time_left / 60;
                .@time_left -= (.@Minutes * 60);
     
                if (.@Minutes > 1)
                    .@Time$ += .@Minutes + " minutes, ";
                else if (.@Minutes > 0)
                    .@Time$ += .@Minutes + " minute, ";
     
                if (.@time_left > 1 || .@time_left == 0)
                    .@Time$ += .@time_left + " seconds";
                else if (.@time_left == 1)
                    .@Time$ += .@time_left + " second";
     
                dispbottom "[Hourly Reward System]: You have [" + .@Time$ + "] left in able to gain a hourly points.",0xRRGGBB;
            }
        }
        end;
    }
    
    
    
    

     

  18. 22 hours ago, Emistry said:

    use the updated version which allow non-equip to bulk purchase depend on your max stack setting.

    https://github.com/rathena/rathena/blob/master/npc/custom/quests/quest_shop.txt

    Thankyou !!

     

    Sir @Emistry I think the preview feature of that npc is not working 

    Hi ! Can you help me in this script .. Sir @Emistry suggested me this but I think the Preview feature is not working ..... 

    //===== rAthena Script =======================================
    //= Euphy's Quest Shop
    //===== By: ==================================================
    //= Euphy
    //===== Current Version: =====================================
    //= 1.6c
    //===== Compatible With: =====================================
    //= rAthena Project
    //===== Description: =========================================
    //= A dynamic quest shop based on Lunar's, with easier config.
    //= Includes support for multiple shops & cashpoints.
    //= Item Preview script by ToastOfDoom.
    //===== Additional Comments: =================================
    //= 1.0 Initial script.
    //= 1.2 Added category support.
    //= 1.3 More options and fixes.
    //= 1.4 Added debug settings.
    //= 1.5 Replaced categories with shop IDs.
    //= 1.6 Added support for purchasing stackables.
    //= 1.6a Added support for previewing costumes and robes.
    //= 1.6b Added 'disable_items' command.
    //= 1.6c Replaced function 'A_An' with "F_InsertArticle".
    //============================================================
    
    // Shop NPCs -- supplying no argument displays entire menu.
    //	callfunc "qshop"{,<shop ID>{,<shop ID>{,...}}};
    //  ADD YOUR NPC HERE
    //============================================================
    brasilis,182,241,6	script	Quest Shop#1	998,{ callfunc "qshop"; }
    // prontera,165,203,6	script	Quest Shop#2	998,{ callfunc "qshop",1,2; }	// call the shop 1 and 2 defined below
    // etc.. Add your Shop NPCs 'Quest Shop#XXX' here
    //============================================================
    
    
    // Script Core - DO NOT DUPLICATE THIS NPC !!!!!!!!!!!!!
    //============================================================
    -	script	quest_shop	-1,{
    function Add; function Chk; function Slot;
    OnInit:
    	freeloop(1);
    
    // -----------------------------------------------------------
    //  Basic shop settings.
    // -----------------------------------------------------------
    
    	set .Announce,1;	// Announce quest completion? (1: yes / 0: no)
    	set .ShowSlot,1;	// Show item slots? (2: all equipment / 1: if slots > 0 / 0: never)
    	set .ShowID,0;  	// Show item IDs? (1: yes / 0: no)
    	set .ShowZeny,0;	// Show Zeny cost, if any? (1: yes / 0: no)
    	set .MaxStack,100;	// Max number of quest items purchased at one time.
    
    // -----------------------------------------------------------
    //  Points variable -- optional quest requirement.
    //	setarray .Points$[0],"<variable name>","<display name>";
    // -----------------------------------------------------------
    
    	setarray .Points$[0],
    		"#CASHPOINTS", "Cash Points";
    
    
    //=====================================================================================
    // ------------------- ADD YOUR SHOPS NAME AND ITEMS SHOPS STARTING HERE --------------
    //=====================================================================================
    
    // -----------------------------------------------------------
    //  Shop IDs -- to add shops, copy dummy data at bottom of file.
    //	setarray .Shops$[1],"<Shop 1>","<Shop 2>"{,...};
    // -----------------------------------------------------------
    
    	setarray .Shops$[1],
    		"Headgears",	// Shop Named 1
    		"Weapons",		// Shop Named 2
    		"Other";		// Shop Named 3
    
    // -----------------------------------------------------------
    //  Quest items -- do NOT use a reward item more than once!
    //	Add(<shop ID>,<reward ID>,<reward amount>,
    //	    <Zeny cost>,<point cost>,
    //	    <required item ID>,<required item amount>{,...});
    // -----------------------------------------------------------
    
    // Shop 1
    	sleep 10;
    	Add(1,5022,1,0,0,7086,1,969,10,999,40,1003,50,984,2);
    	Add(1,5032,1,0,0,1059,250,2221,1,2227,1,7063,600);
    	Add(1,5027,1,0,0,2252,1,1036,400,7001,50,4052,1);
    	Add(1,5045,1,0,0,2252,1,1054,450,943,1200);
    
    // Shop 2
    	Add(2,1224,1,0,0,7297,30,969,10,999,50,714,10);
    	Add(2,1225,1,0,0,7292,30,969,10,999,50,714,10);
    
    // Shop 3
    	Add(3,531,1,3,0,512,1,713,1);
    	Add(3,532,1,3,0,513,1,713,1);
    	Add(3,533,1,3,0,514,1,713,1);
    	Add(3,534,1,3,0,515,1,713,1);
    
    // -----------------------------------------------------------
    
    //=====================================================================================
    // ------------------- YOUR SHOPS AND ITEMS SHOPS HAVE BEEN ADDED ---------------------
    //=====================================================================================
    
    	freeloop(0);
    	set .menu$,"";
    	for(set .@i,1; .@i<=getarraysize(.Shops$); set .@i,.@i+1) {
    		set .menu$, .menu$+.Shops$[.@i]+":";
    		npcshopdelitem "qshop"+.@i,909;
    	}
    	end;
    
    OnMenu:
    	set .@size, getarraysize(@i);
    	if (!.@size) set @shop_index, select(.menu$);
    	else if (.@size == 1) set @shop_index, @i[0];
    	else {
    		for(set .@j,0; .@j<.@size; set .@j,.@j+1)
    			set .@menu$, .@menu$+.Shops$[@i[.@j]]+":";
    		set @shop_index, @i[select(.@menu$)-1];
    	}
    	deletearray @i[0],getarraysize(@i);
    	if (.Shops$[@shop_index] == "") {
    		message strcharinfo(0),"An error has occurred.";
    		end;
    	}
    	dispbottom "Select one item at a time.";
    	callshop "qshop"+@shop_index,1;
    	npcshopattach "qshop"+@shop_index;
    	end;
    
    OnBuyItem:
    	// .@q[] : RewardID, BoughtAmt, RewardAmt, BaseAmt, ReqZeny, ReqPts, { ReqItem, ReqAmt, ... }
    	setarray .@q[0],@bought_nameid[0],((@bought_quantity[0] > .MaxStack)?.MaxStack:@bought_quantity[0]);
    	copyarray .@q[3],getd(".q_"+@shop_index+"_"+.@q[0]+"[0]"),getarraysize(getd(".q_"+@shop_index+"_"+.@q[0]));
    	set .@q[2],.@q[1]*.@q[3];
    	if (!.@q[2] || .@q[2] > 30000) {
    		message strcharinfo(0),"You can't purchase that many "+getitemname(.@q[0])+".";
    		end;
    	}
    	mes "[Quest Shop]";
    	mes "Reward: ^0055FF"+((.@q[2] > 1)?.@q[2]+"x ":"")+Slot(.@q[0])+"^000000";
    	mes "Requirements:";
    	disable_items;
    	if (.@q[4]) mes " > "+Chk(Zeny,.@q[4]*.@q[1])+(.@q[4]*.@q[1])+" Zeny^000000";
    	if (.@q[5]) mes " > "+Chk(getd(.Points$[0]),.@q[5]*.@q[1])+(.@q[5]*.@q[1])+" "+.Points$[1]+" ("+getd(.Points$[0])+"/"+(.@q[5]*.@q[1])+")^000000";
    	if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2)
    		mes " > "+Chk(countitem(.@q[.@i]),.@q[.@i+1]*.@q[1])+((.ShowID)?"{"+.@q[.@i]+"} ":"")+Slot(.@q[.@i])+" ("+countitem(.@q[.@i])+"/"+(.@q[.@i+1]*.@q[1])+")^000000";
    	next;
    	setarray @qe[1], getiteminfo(.@q[0], ITEMINFO_LOCATIONS), getiteminfo(.@q[0], ITEMINFO_VIEW);
    	if (@qe[2] > 0 && ((@qe[1] & EQP_HEAD_LOW) || (@qe[1] & EQP_HEAD_TOP) || (@qe[1] & EQP_HEAD_MID) || (@qe[1] & EQP_COSTUME_HEAD_TOP) || (@qe[1] & EQP_COSTUME_HEAD_MID) || (@qe[1] & EQP_COSTUME_HEAD_LOW) || (@qe[1] & EQP_GARMENT) || (@qe[1] & EQP_COSTUME_GARMENT)))
    		set .@preview,1;
    	addtimer 1000, strnpcinfo(0)+"::OnEnd";
    	while(1) {
    		switch(select(" ~ Purchase ^0055FF"+getitemname(.@q[0])+"^000000:"+((.@preview && !@qe[7])?" ~ Preview...":"")+": ~ ^777777Cancel^000000")) {
    		case 1:
    			if (@qe[0]) {
    				mes "[Quest Shop]";
    				mes "You're missing one or more quest requirements.";
    				close;
    			}
    			if (!checkweight(.@q[0],.@q[2])) {
    				mes "[Quest Shop]";
    				mes "^FF0000You need "+(((.@q[2]*getiteminfo(.@q[0], ITEMINFO_WEIGHT))+Weight-MaxWeight)/10)+" additional weight capacity to complete this trade.^000000";
    				close;
    			}
    			if (.@q[4]) set Zeny, Zeny-(.@q[4]*.@q[1]);
    			if (.@q[5]) setd .Points$[0], getd(.Points$[0])-(.@q[5]*.@q[1]);
    			if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2)
    				delitem .@q[.@i],.@q[.@i+1]*.@q[1];
    			getitem .@q[0],.@q[2];
    			if (.Announce) announce strcharinfo(0)+" has created "+((.@q[2] > 1)?.@q[2]+"x "+getitemname(.@q[0]):callfunc("F_InsertArticle",getitemname(.@q[0])))+"!",0;
    			specialeffect2 EF_FLOWERLEAF;
    			close;
    		case 2:
    			setarray @qe[3], getlook(LOOK_HEAD_BOTTOM), getlook(LOOK_HEAD_TOP), getlook(LOOK_HEAD_MID), getlook(LOOK_ROBE), 1;
    			if ((@qe[1] & 1) || (@qe[1] & 4096)) changelook LOOK_HEAD_BOTTOM, @qe[2];
    			else if ((@qe[1] & 256) || (@qe[1] & 1024)) changelook LOOK_HEAD_TOP, @qe[2];
    			else if ((@qe[1] & 512) || (@qe[1] & 2048)) changelook LOOK_HEAD_MID, @qe[2];
    			else if ((@qe[1] & 4) || (@qe[1] & 8192)) changelook LOOK_ROBE, @qe[2];
    			break;
    		case 3:
    			close;
    		}
    	}
    
    OnEnd:
    	if (@qe[7]) {
    		changelook LOOK_HEAD_BOTTOM, @qe[3];
    		changelook LOOK_HEAD_TOP, @qe[4];
    		changelook LOOK_HEAD_MID, @qe[5];
    		changelook LOOK_ROBE, @qe[6];
    	}
    	deletearray @qe[0],8;
    	end;
    
    function Add {
    	if (getitemname(getarg(1)) == "null") {
    		debugmes "Quest reward #"+getarg(1)+" invalid (skipped).";
    		return;
    	}
    	setarray .@j[0],getarg(2),getarg(3),getarg(4);
    	for(set .@i,5; .@i<getargcount(); set .@i,.@i+2) {
    		if (getitemname(getarg(.@i)) == "null") {
    			debugmes "Quest requirement #"+getarg(.@i)+" invalid (skipped).";
    			return;
    		} else
    			setarray .@j[.@i-2],getarg(.@i),getarg(.@i+1);
    	}
    	copyarray getd(".q_"+getarg(0)+"_"+getarg(1)+"[0]"),.@j[0],getarraysize(.@j);
    	npcshopadditem "qshop"+getarg(0),getarg(1),((.ShowZeny)?getarg(3):0);
    	return;
    }
    
    function Chk {
    	if (getarg(0) < getarg(1)) {
    		set @qe[0],1;
    		return "^FF0000";
    	} else
    		return "^00FF00";
    }
    
    function Slot {
    	set .@s$,getitemname(getarg(0));
    	switch(.ShowSlot) {
    		case 1: if (!getitemslots(getarg(0))) return .@s$;
    		case 2: if (getiteminfo(getarg(0), ITEMINFO_TYPE) == 4 || getiteminfo(getarg(0), ITEMINFO_TYPE) == 5) return .@s$+" ["+getitemslots(getarg(0))+"]";
    		default: return .@s$;
    	}
    }
    }
    
    function	script	qshop	{
    	deletearray @i[0],getarraysize(@i);
    	for(set .@i,0; .@i<getargcount(); set .@i,.@i+1)
    		set @i[.@i],getarg(.@i);
    	doevent "quest_shop::OnMenu";
    	end;
    }
    
    
    // Dummy shop data -- copy as needed.
    //============================================================
    -	shop	qshop1	-1,909:-1
    -	shop	qshop2	-1,909:-1
    -	shop	qshop3	-1,909:-1
    -	shop	qshop4	-1,909:-1
    -	shop	qshop5	-1,909:-1

     

×
×
  • Create New...