Jump to content

Yukaiii

Members
  • Posts

    111
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by Yukaiii

  1. Answering the solution in case anyone ever runs into this problem..

    \conf\import\char_conf

     

    Quote

    conf/import/char_conf.txt
    login_ip: 127.0.0.1
    char_ip: vps_ip
    conf/import/map_conf.txt
    char_ip: 127.0.0.1
    map_ip: vps_ip

    I'm answering this old topic because I went through this and couldn't find a solution, until I racked my brains and found out where to solve it.

  2. On 3/26/2024 at 10:18 AM, Skorm said:

    I'm just now seeing this and don't have the time to test things out, but I've had problems warping players with similar BG scripts. I can't exactly remember what the problem was because its been years, but you should try collecting all of the players cids/aids for each team and then warping them individually instead of mapwarp/partywarp.

     

     

    I tried it without success my friend..

     

    [Erro]: script_rid2sd: erro fatal! no associated players!
    [Depurar]: Function: getcharid (1 parametro):
    [Depurar]: Dado: number value=1
    [Depurar]: Source (NPC): 3 vs 3 Party on arena_room (105,93)

     

    I'm having this error and these warnings as soon as a game ends...
    Then when I register again, only the party leaders enter..

    I added all the code to the sorce... everything is fine, the only problem I've been encountering is this...

     

     

  3. Good night friends.
    Guys, I did a search on the forum, but I couldn't find a detailed explanation.
    If someone could tell me how I can reduce the freezing time based on luk.

     

     

    Would the modification be done right here?

    Quote

            case SC_FREEZE:
                sc_def = status->mdef*100;
                sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
                tick_def2 = status_src->luk*-10; // Caster can increase final duration with luk
                break;

    Example: Normal freezing lasts an average of 10 seconds.
    with 100 luk it would reduce it to 4 seconds frozen.

     

    I've already tried a few ways here but none with success.

     

    Thank you very much in advance!!

  4. 10 hours ago, Skorm said:

    I'm just now seeing this and don't have the time to test things out, but I've had problems warping players with similar BG scripts. I can't exactly remember what the problem was because its been years, but you should try collecting all of the players cids/aids for each team and then warping them individually instead of mapwarp/partywarp.

     

     

    I'll be testing it later, thanks for the tip friend.

  5. Guys, I wanted some tips or even some help from you...
    I know this is rathena, in fact I use it and have a rathena server too..
    but I'm trying to put another project of mine online, a very old project.
    And I would like to ask for your help so I can fix this script.

    Error: when both parties register, everything goes well in the first match, but then when you register again, instead of teleporting the entire party in case 3, you end up teleporting only 1 player, the leader.

    Thank you very much for any help you may have!!

    Quote

    arena_room,105,93,5    script    3 vs 3 Party    822,{
        if (BaseLevel < 250 || Class==Job_Novice || Class==Job_Baby || Class==Job_Novice_High) {
        mes "[Arena Guide]";
        mes "Sorry, you need to be above level 250 or not be an Apredinz.";
    close;
    }
    if (getpartyleader(getcharid(1),2) != getcharid(0)) {
    mes "Only the Party leader can Register!"; 
    close;


    if (getpartymembercount(getcharid(1)) != 3 && getpartycount(getcharid(1)) != 3){
     mes "Sorry, you don't meet the requirements, check if your Party has 3 people and try again.";
    close;
        }

     
    getpartymember getcharid(1),0;
    getpartymember getcharid(1),1;
    getpartymember getcharid(1),2;
    set .@count, $@partymembercount;
    if(.@count < 3)
    end; //Not enough members
    copyarray .@charid[0],$@partymembercid[0],$@partymembercount;
    //if($@partymembercount != ) end;
        for(set .@i,0; .@i < .@count; set .@i, .@i + 1){
        if( isloggedin($@partymemberaid[.@i],$@partymembercid[.@i]))
            set .@online, .@online + 1;
        }
        if(.@count != .@online){
    mes" Some group member is not online!";
            close;
    }    //Not all users on


    mes "Welcome to 3 vs 3 Party!!!";
    set .@i,0;
    mes "Do you want to register?";
    if ( select( "Sim", "Não" ) == 2 ) close;
    else if ( .signup_count == 128 ) {
    mes "Desculpe a fila está cheia";
            close;
        }
    while ( .signup_aid[.@i] != getcharid(3) && .@i < .signup_count )
    set .@i, .@i +1;
    if ( .@i < .signup_count ) {
    mes "Sua Party já está registrada.";
    mes "You have ^FF0000"+(.signup_count-1)+"^000000 Parties in front of you.";
     
            close;
        }
    set .signup_aid[ .signup_count ], getcharid(3);
    set .signup_count, .signup_count +1;
    mes "Congratulations, you are now on the waiting line for 3vs3 Party!";
    mes "Your position is: ^FF0000"+(.signup_count-1)+"^000000";
    dispbottom "You have  "+(.signup_count-1)+" Parties in front of you !";
        close2;
    L_start:
    if ( .signup_count < .min2start ) end;
    for ( set .@i, 0; .@i < .signup_count; set .@i, .@i +1 ) {
    if ( attachrid( .signup_aid[.@i] ) ) {
    if ( getmapflag( strcharinfo(3), mf_nowarp ) ) { // player has went into another event
         deletearray .signup_aid[.@i], 1;
                   set .signup_count, .signup_count -1;
                    set .@i, .@i -1;
                }
            }
            else {
                deletearray .signup_aid[.@i], 1;
                set .signup_count, .signup_count -1;
                set .@i, .@i -1;
            }    
        }
    if ( .start || .signup_count < .min2start ) end;
    announce "A 3vs3 Match Started!", 0;
    set .start, 1;
    for ( set .@i, 0; .@i < .signup_count; set .@i, .@i +1 )
    setbgid ( .@i %2 )? .red : .blue, .signup_aid[.@i];
    deletearray .signup_aid, .min2start;
    set .signup_count, .signup_count - .min2start;
    bg_warp .red, "guild_vs1-1", 7,49;
    bg_warp .blue, "guild_vs1-1", 92,49;
    cleararray .score[1], .startingscore, 2;
    bg_updatescore "guild_vs1-1", .score[1], .score[2];
    sleep .eventlasting * 1000;
        if ( .start == 1 ) {
          if ( .score[1] == .score[2] )
               mapannounce "guild_vs1-1", "Empate !", 0;
            else if ( .score[1] > .score[2] ) {
                mapannounce "guild_vs1-1", " Red side wins !", 0;
                callsub L_reward, .red;
            }
            else if ( .score[1] < .score[2] ) {
                mapannounce "guild_vs1-1", " Blue side wins !", 0;
                callsub L_reward, .blue;
            }
        }
        bg_warp .red, "izlude", 128,117;
        bg_warp .blue, "izlude", 128,117;
        bg_kickall .red;
        bg_kickall .blue;
        set .start, 0;
        deletearray .score;
        goto L_start;


    L_reward:
        getbgusers getarg(0);
        for ( set .@i, 0; .@i < $@arenamembersnum; set .@i, .@i +1 )
    //    getitem 501, 1, $@arenamembers[.@i]; // item reward
        bg_kickall .red;
        bg_kickall .blue;
        set .start, 0;
        deletearray .score;
        warpparty "lhz_cube",66,192,getcharid(1);
        enablenpc "Partytwo";
        enablenpc "Partyone";
        goto L_start;
        return;

    OnredDead: callsub L_dead, 1;
    OnblueDead: callsub L_dead, 2;

    L_dead:
        set .score[ getarg(0) ], .score[ getarg(0) ] -1;
        bg_updatescore "guild_vs1-1", .score[1], .score[2];
        if ( !.score[ getarg(0) ] )
            awake strnpcinfo(0);
        sleep2 1250;
        percentheal 100,100;
        end;
     
    OnredQuit: callsub L_quit, 1, .red;
    OnblueQuit: callsub L_quit, 2, .blue;
    L_quit:
     
        if ( bg_get_data( getarg(1), 0 ) ) end;
        set .score[ getarg(0) ], 0;
        awake strnpcinfo(0);
    end;
     
     
     
     
    OnInit:
        set .eventlasting, 100 * 60; // how long would the event last or it auto-reset. 30 *60 = 30 mins
        set .min2start, 2; // minimum player to start
        set .startingscore, 6; // score at start
        set .red, createbgid( "guild_vs1-1", 7,49, strnpcinfo(0)+"::OnredQuit", strnpcinfo(0)+"::OnredDead" );
        set .blue, createbgid( "guild_vs1-1", 92,49, strnpcinfo(0)+"::OnblueQuit", strnpcinfo(0)+"::OnblueDead" );
        set $psvp_map$,"guild_vs1-1";
        set $pvsp_grupo1,0;
        set $pvsp_grupo2,0;
        set $pvsp_kill1,0;
        set $pvsp_kill2,0;
        end;
     

    OnPCKillEvent:
    if(strcharinfo(3) == $psvp_map$)
     {
             if(getcharid(1) == $pvsp_grupo1)
         {
               set $pvsp_kill1,$pvsp_kill1+1;
                mapannounce $psvp_map$,"Party  ["+getpartyname($pvsp_grupo1)+"] Matou "+$pvsp_kill1+"/3 Membros da  Party ["+getpartyname($pvsp_grupo2)+"]!",bc_all;

               }
     
            if(getcharid(1) == $pvsp_grupo2)
                {
                set $pvsp_kill2,$pvsp_kill2+1;
                mapannounce $psvp_map$,"Party ["+getpartyname($pvsp_grupo2)+"] Matou "+$pvsp_kill2+"/3 Membros da Party ["+getpartyname($pvsp_grupo1)+"]!",bc_all;

           }
            if($pvsp_kill1 == 3)
                {
                announce "[3 vs 3] Party ["+getpartyname($pvsp_grupo1)+"] è a vencedora !",bc_all;
    sleep 3000;
    mapwarp "guild_vs1-1","lhz_cube",66,192;
        callsub L_reward, .red;
            }
     
            if($pvsp_kill2 == 3)
                {
               announce "[3 vs 3] Party ["+getpartyname($pvsp_grupo2)+"] é a vencedora !",bc_all;
    sleep 3000;
    mapwarp "guild_vs1-1","lhz_cube",66,192;
        callsub L_reward, .blue;
            }
    end;
        }
    }
    guild_vs1-1,7,49,0    script    Partyone    139,5,5,{
     
    warpparty "guild_vs1-1",7,49,getcharid(1);
    set $pvsp_grupo1,0;
    set $pvsp_kill1,0;
    if($pvsp_grupo1 == 0) set $pvsp_grupo1,getcharid(1);
    sleep 1000;
    disablenpc "Partyone";
    end;
    }
    guild_vs1-1,92,49,0    script    Partytwo    139,5,5,{
    set $pvsp_grupo2,0;
    set $pvsp_kill2,0;
    warpparty "guild_vs1-1",92,49,getcharid(1);
    if($pvsp_grupo2 == 0) set $pvsp_grupo2,getcharid(1);
    sleep 1000;
    disablenpc "Partytwo";
    end;
    }

    lhz_cube,66,192,3    script    partyvsparty0    139,5,5,{

    if(getcharid(1) == $pvsp_grupo1)
                   {
    getitem 20043,3;
    warp "arena_room",99,88;


        close;
         }
     
    if(getcharid(1) == $pvsp_grupo2)
                {
    getitem 20043,3;
    warp "arena_room",99,88;

    close;
          }

    }

    -    script    Remove_Buffs3    -1,{

    OnPCLoadMapEvent:

    if(strcharinfo(2) == "guild_vs1-1" || strcharinfo(2) == "guild_vs1-2" ){
    sc_end -1;
    }
    end;

    OnPCDieEvent:
        getmapxy(@map$,$@x,$@y,0);
        if (@map$ == "guild_vs1-1") {
        sleep2 1;
        atcommand "@alive";
        warp "prontera",156,191;
        end;
    }
    }

    guild_vs1-1    mapflag    nosave    SavePoint
    guild_vs1-1    mapflag    nowarp
    guild_vs1-1    mapflag    nowarpto
    guild_vs1-1    mapflag    noteleport
    guild_vs1-1    mapflag    nomemo
    guild_vs1-1    mapflag    nopenalty
    guild_vs1-1    mapflag    nobranch
    guild_vs1-1    mapflag    noicewall
    guild_vs1-1    mapflag    pvp

    guild_vs1-1    mapflag    noexp
    guild_vs1-1    mapflag    noreturn
    guild_vs1-1    mapflag    pvp_noguild

     

  6. Quote

    // Skill Damage Adjustment Database
    //
    // Structure of Database:
    // SkillName,Caster,Map,Damage against Players{,Damage against Mobs{,Damage against Bosses{,Damage against Other}}}
    //
    // Caster: The groups for which the adjustment takes effect. (bitmask)
    //         1 = Player
    //         2 = Monster
    //         4 = Pet
    //         8 = Homunculus
    //        16 = Mercenary
    //        32 = Elemental
    //
    // Map:
    //         1    - Normal (the maps that aren't classified as these maps below)
    //         2    - PVP
    //         4    - GVG
    //         8    - Battlegrounds
    //         16   - 'skill_damage' mapflag
    // Restricted zones - they're configured by 'restricted <number>' mapflag
    //         32   - Zone 1
    //         64   - Zone 2
    //         128  - Zone 3
    //         256  - Zone 4
    //         512  - Zone 5
    //         1024 - Zone 6
    //         2048 - Zone 7
    //
    // Notes:
    //      Damage is a percentage between -100 and 100000.
    //      Negative values decrease damage and positive values increase it (0 = no change).
    //
    // Examples:
    // MC_MAMMONITE,1,1,50 // In normal maps, players deal +50% damage to other players with Mammonite.
    // MO_EXTREMITYFIST,1,6,-50 // In PVP and GVG, players deal -50% (half) damage to other players with Asura Strike.
    // AB_ADORAMUS,1,6,50,0,10,15 // In PVP and GVG, players deal +50% damage to other players, +0% to mobs, +10% to bosses, and +15% to other with Adoramus.
    MO_EXTREMITYFIST,2,1,-100

    Good morning guys!!!
    I wish someone could explain to me how this works.
    I usually change the damage of skills in src, here I tried every way, but I never managed to make it work.
    I wanted to increase Magic Crash's damage here and reduce Asura by 100% on MVP's.
    I've tried it several times and I don't know if it's really working.

    MO_EXTREMITYFIST,2,1,-100

    If anyone can give me a more concrete explanation...
    thank you very much.

  7. 10 hours ago, Tokei said:

    Hmm, you'd definitely want to add more checks on this, but here:

    -	script	Mob Helper	-1,{
    OnNPCKillEvent:
    	// Fixed improper usage of rand for "chance"
    	if (500 < rand(10000)) end;
    	if (mkTimed && gettimetick(2) <= mkTimed) end;
    	// Don't use "set" anymore, that's way outdated.
    	// Using getmonsterinfo isn't a bad idea, but it's somewhat useless/broken now. You'd have to expand on it in the source to make it useful.
    	getunitdata(killedgid, .@mobdata);
    	// There's no reason to use player variables in this case, the variable has no purpose outside of the NPC block code. Therefore it should be a NPC variable.
    	.@MobMode = .@mobdata[UMOB_MODE];
    	.@MobClass = .@mobdata[UMOB_CLASS];
    	if (!(.@MobMode & MD_CANMOVE)) end;
    	if (!(.@MobMode & MD_CANATTACK)) end;
    	// MD_BOSS/32 isn't a thing anymore either, so that code won't work.
    	if (.@MobClass == CLASS_BOSS) end;
    	// Too much wrong with these lines.
    	//set @WoE[0],1288|1285|1830|1949|1950|1286|1287|1899|1829;                                    //WoE IDs
    	//for(set @n,0; @n < getarraysize(@WoE); set @n,@n+1){ if(@WoE[@n] == killedrid){ end; } }    //WoE
    	// You probably meant to use "setarray", and you also probably to use commas instead of separators: setarray @woe, 1288, 1285, ..;
    	// Either way, that's inefficient considering this code runs on all killed monsters. Honestly I'd do the whole thing via the source instead since running a script everytime you kill a monster is overkill. Anyhow, use a dictionary seach:
    	if (.badMob[killedrid]) end;
    	.@nTime = (300 + rand(0, 120)) - getmonsterinfo(killedrid, MOB_LV);
    	// The main reason why your script didn't work: "summon" uses miliseconds, not seconds.
    	.@nTime *= 1000; // s to ms
    	summon "Ajudante " + getmonsterinfo(killedrid, MOB_NAME), killedrid, .@nTime;
    	mkTimed = gettimetick(2) + .@nTime + rand(0, 60);
    	message strcharinfo(0), "[" + getmonsterinfo(killedrid, MOB_NAME) + "] Hello " + strcharinfo(0) + " I will help you for a few minutes!";
    	end;
    OnInit:
    	// Define bad mobs here
    	.badMob[1288] = 1;
    	.badMob[1285] = 1;
    	.badMob[1830] = 1;
    	.badMob[1949] = 1;
    	.badMob[1950] = 1;
    	.badMob[1286] = 1;
    	.badMob[1287] = 1;
    	.badMob[1899] = 1;
    	.badMob[1829] = 1;
    	end;
    }

     

    Thank you very much friend!!

  8. Quote

    // . Description: .
    // . Change from dead monster reborn to help for some . .
    // . minutes. . .
    // . A percentage is 5% and can be changed.
    // . a permanent variable is generated with the time of .
    // . 'validity' of the monster, so only the char already has .
    // . a monstrous helper, he won't get another one and that one.
    // . 'expiration' time is 5 minutes + rand(120) being .
    // . so a time between 5 and 7 minutes - monster level, .
    // . that is, the higher the level of the monstrous, the less.
    // . 'expiration' time it will have.
    // . Not valid for MvP/Boss, monsters that don't attack. .
    // . and they don't move and they are WoE monsters               .
    // .----------------------------------------------------------.
    -    script    Mob Helper    -1,{

        OnNPCKillEvent:
            if(rand(0,10000) > 500) end;                                                                //5% para conseguir
            if(mkTimed && gettimetick(2) <= mkTimed) end;                                                //Checa tempo
            set @MobMode, getmonsterinfo(killedrid,MOB_MODE);
            if(!(@MobMode & 1)) end;                                                                    //Mob não se move
            if(!(@MobMode & 128)) end;                                                                    //Mob não ataca
            if(@MobMode & 32) end;                                                                        //Mob MvP/Boss
            set @WoE[0],1288|1285|1830|1949|1950|1286|1287|1899|1829;                                    //WoE IDs
            for(set @n,0; @n < getarraysize(@WoE); set @n,@n+1){ if(@WoE[@n] == killedrid){ end; } }    //WoE
            
            set @nTime, (300+rand(0,120))-getmonsterinfo(killedrid,1);
            summon "Ajudante "+getmonsterinfo(killedrid,0), killedrid, @nTime;
            set mkTimed, gettimetick(2)+@nTime+rand(0,60);
            message strcharinfo(0),"["+getmonsterinfo(killedrid,0)+"] Hello "+strcharinfo(0)+" I will help you for a few minutes!";
        end;

    }

    What's up guys!!
    Guys, could anyone help me with this script?
    it simply does not present any errors in the emulator.
    It shows the message that mob will appear to help and but it doesn't appear, could anyone tell me how I can fix this?

     

     

    Dimension-RO 19_03_2024 12_00_32.png

  9. On 17/03/2024 at 21:55, dukenukexd said:

    tive alguns problemas quando meus chars atingiram o nível 99, não consigo ir mais longe, todos os mobs dão experiência muito baixa, como posso resolver isso? 
    ajustando a exp base que os mobs dão? ou ajustar a tabela de exp?

    ajuda por favor

    Firstly, you need to know if your server is configured for which level.

     

    After changing it however you see fit.

    conf\battle\exp

     

    // Rate at which exp. is given. (Note 2)
    base_exp_rate: 1000000

    // Rate at which job exp. is given. (Note 2)
    job_exp_rate: 1000000

  10.  

    Pessoal, como vocês estão?
    Sei que é um anti bot bem antigo... mas acho muito interessante, estou fazendo alguns testes aqui no meu servidor e estão aparecendo esses erros... alguém poderia me dizer como consertar?

     

    este é o  Antibot - Matador de Bots 6

     

     

    imagem.thumb.png.c4124621dd5fa475a3bceda0bfde064c.png

  11. 22 hours ago, pajodex said:

    I believe this is not related to the script.

     

     

    If you follow the original thread, you should've known that this might have to do with npctalk script command. You can always disable the npctalk part if you want to not get the error. Original thread is attached below:

     

    Solved, thank you!

  12. Hello everybody!
    Guys, I'm having a problem with my emulator.
    In fact, the error only appears when the player hits the punching bag.
    the script does not present any type of error in the emulator, only when it is used does it indicate this error.

    Could anyone tell me how to resolve this error?

     

    "These are the two errors that appear in the server's cmd"

    [Error]:Value for setting 'mob_max_skilllvl': 150 is invalid (min:1 max:100)! Defaulting to 100

    [Error]: clif_send: Unrecognized type 81

     

    // Advance Punching Bag with Parameter settings
    // by pajodex
    // Video preview : https://www.youtube.com/watch?v=RoLhYx-Iny8
    
    prontera,224,79,0	script	Set Parameters#0	844,{
    function get_size_name;
    function get_race_name;
    function get_ele_name;
    	ignoretimeout 1;
    	mes "Current punching bag info:";
    	.@dupid = atoi(strnpcinfo(2));
    	getunitdata .gid[.@dupid], .@data;
    	mes "Size : "+ get_size_name(.@data[UMOB_SIZE]);
    	mes "Level : "+ .@data[UMOB_LEVEL];
    	mes "Race : "+ get_race_name(.@data[UMOB_RACE]);
    	mes "Element : "+ get_ele_name(.@data[UMOB_ELETYPE]) +" Lv. "+ .@data[UMOB_ELELEVEL];
    	mes "Stats : ";
    	mes "==============================";
    	mes "Str - "+ .@data[UMOB_STR] +"    Agi - "+ .@data[UMOB_AGI] +"    Vit - "+ .@data[UMOB_VIT];
    	mes "Int - "+ .@data[UMOB_INT] +"    Dex - "+ .@data[UMOB_DEX] +"    Luk - "+ .@data[UMOB_LUK];
    	mes "Def - "+ .@data[UMOB_DEF] +"    Mdef - "+ .@data[UMOB_MDEF];
    	next;
    	if ( select("> Set parameter:Cancel") == 2 ) {
    		mes "Bye";
    		close;
    	}
    	do {
    		mes "Select which parameter to change.";
    		next;
    		switch(select("> Size [ ^ff0000"+(.@UMOB_SIZE ? get_size_name(.@UMOB_SIZE):get_size_name(.UMOB_SIZE))+"^000000 ]:> Level [ ^ff0000"+(.@UMOB_LEVEL ? .@UMOB_LEVEL:.UMOB_LEVEL)+"^000000 ]:> Race [ ^ff0000"+(.@UMOB_RACE ? get_race_name(.@UMOB_RACE):get_race_name(.UMOB_RACE))+"^000000 ]:> Element [ ^ff0000"+(.@UMOB_ELETYPE ? get_ele_name(.@UMOB_ELETYPE):get_ele_name(.UMOB_ELETYPE))+" Lv "+(.@UMOB_ELELEVEL ? .@UMOB_ELELEVEL:.UMOB_ELELEVEL)+"^000000 ]:> Stats:> Enter Mob ID:^0000ffDone^000000")) {
    		case 1:
    			.@UMOB_SIZE = select("- Small:- Medium:- Large")-1;
    			break;
    		case 2:
    			mes "Input level (1-"+.maxlv+"):";
    			next;
    			input .@UMOB_LEVEL, 1, .maxlv;
    			break;
    		case 3:
    			.@UMOB_RACE = select("- Formless:- Undead:- Brute:- Plant:- Insect:- Fish:- Demon:- Demihuman:- Angel:- Dragon:- Player") - 1;
    			break;
    		case 4:
    			mes "Select Element:";
    			next;
    			.@UMOB_ELETYPE = select("- Neutral:- Water:- Earth:- Fire:- Wind:- Poison:- Holy:- Shadow:- Ghost:- Undead") - 1;
    			mes "Select Level:";
    			next;
    			.@UMOB_ELELEVEL = select("Lv 1:Lv 2:Lv 3:Lv 4");
    			break;
    		case 5:
    			mes "Select:";
    			next;
    			switch(select("> STR [ ^ff0000"+(.@UMOB_STR ? .@UMOB_STR:.UMOB_STR)+"^000000 ]:> AGI [ ^ff0000"+(.@UMOB_AGI ? .@UMOB_AGI:.UMOB_AGI)+"^000000 ]:> VIT [ ^ff0000"+(.@UMOB_VIT ? .@UMOB_VIT:.UMOB_VIT)+"^000000 ]:> INT [ ^ff0000"+(.@UMOB_INT ? .@UMOB_INT:.UMOB_INT)+"^000000 ]:> DEX [ ^ff0000"+(.@UMOB_DEX ? .@UMOB_DEX:.UMOB_DEX)+"^000000 ]:> LUK [ ^ff0000"+(.@UMOB_LUK ? .@UMOB_LUK:.UMOB_LUK)+"^000000 ]:> DEF [ ^ff0000"+(.@UMOB_DEF ? .@UMOB_DEF:.UMOB_DEF)+"^000000 ]:> MDEF [ ^ff0000"+(.@UMOB_MDEF ? .@UMOB_MDEF:.UMOB_MDEF)+"^000000 ]")) {
    				case 1: .@data$ = "STR"; break;
    				case 2: .@data$ = "AGI"; break;
    				case 3: .@data$ = "VIT"; break;
    				case 4: .@data$ = "INT"; break;
    				case 5: .@data$ = "DEX"; break;
    				case 6: .@data$ = "LUK"; break;
    				case 7: .@data$ = "DEF"; break;
    				case 8: .@data$ = "MDEF"; break;
    			}
    			mes "Value (1-"+.max_stat+":";
    			next;
    			input .@val, 1, .max_stat;
    			setd ".@UMOB_"+.@data$, .@val;
    			break;
    		case 6:
    			mes "Enter Monster ID to simulate:";
    			next;
    			input .@val;
    			if ( (.@name_english$ = getmonsterinfo(.@val, MOB_NAME)) == "null" ) {
    				mes "Cannot find Monster ID "+.@val+" on the database!";
    				next;
    				break;
    			}
    			query_sql("SELECT `element_level` FROM `"+(checkre(0) ? "mob_db_re":"mob_db")+"` WHERE `id` = '"+.@val+"'", .@UMOB_ELELEVEL);
    			.@UMOB_LEVEL = getmonsterinfo(.@val, MOB_LV);
    			.@UMOB_SIZE = getmonsterinfo(.@val, MOB_SIZE);
    			.@UMOB_RACE = getmonsterinfo(.@val, MOB_RACE);
    			.@UMOB_ELETYPE = getmonsterinfo(.@val, MOB_ELEMENT);
    			.@UMOB_DEF = getmonsterinfo(.@val, MOB_DEF);
    			.@UMOB_MDEF = getmonsterinfo(.@val, MOB_MDEF);
    			.@UMOB_STR = getmonsterinfo(.@val, MOB_STR);
    			.@UMOB_AGI = getmonsterinfo(.@val, MOB_AGI);
    			.@UMOB_VIT = getmonsterinfo(.@val, MOB_VIT);
    			.@UMOB_INT = getmonsterinfo(.@val, MOB_INT);
    			.@UMOB_DEX = getmonsterinfo(.@val, MOB_DEX);
    			.@UMOB_LUK = getmonsterinfo(.@val, MOB_LUK);
    			mes "Fetching and applying data of monster '"+.@name_english$+"("+.@val+")' on punching bag...";
    			next;
    			break;
    	
    		default: // Finalize
    			.@done = true;
    			break;
    		}
    	} while ( !.@done );
    	mes "Please review before I spawn:";
    	mes "Size : "+ get_size_name((.@UMOB_SIZE ? .@UMOB_SIZE:.UMOB_SIZE));
    	mes "Level : "+ (.@UMOB_LEVEL ? .@UMOB_LEVEL:.UMOB_LEVEL);
    	mes "Race : "+ get_race_name((.@UMOB_RACE ? .@UMOB_RACE:.UMOB_RACE));
    	mes "Element : "+ get_ele_name((.@UMOB_ELETYPE ? .@UMOB_ELETYPE:.UMOB_ELETYPE)) +" Lv. "+ (.@UMOB_ELELEVEL ? .@UMOB_ELELEVEL:.UMOB_ELELEVEL);
    	mes "Stats : ";
    	mes "==============================";
    	mes "Str - "+ (.@UMOB_STR ? .@UMOB_STR:.UMOB_STR) +"    Agi - "+ (.@UMOB_AGI ? .@UMOB_AGI:.UMOB_AGI) +"    Vit - "+ (.@UMOB_VIT ? .@UMOB_VIT:.UMOB_VIT);
    	mes "Int - "+ (.@UMOB_INT ? .@UMOB_INT:.UMOB_INT) +"    Dex - "+ (.@UMOB_DEX ? .@UMOB_DEX:.UMOB_DEX) +"    Luk - "+ (.@UMOB_LUK ? .@UMOB_LUK:.UMOB_LUK);
    	mes "Def - "+ (.@UMOB_DEF ? .@UMOB_DEF:.UMOB_DEF) +"    Mdef - "+ (.@UMOB_MDEF ? .@UMOB_MDEF:.UMOB_MDEF);
    	next;
    	if (select("> Finalize!:> Cancel")==2) close;
    	mes "Done!";
    	close2;
    	.UMOB_SIZE = (.@UMOB_SIZE) ? .@UMOB_SIZE:.UMOB_SIZE;
    	.UMOB_LEVEL = (.@UMOB_LEVEL) ? .@UMOB_LEVEL:.UMOB_LEVEL;
    	.UMOB_RACE = (.@UMOB_RACE) ? .@UMOB_RACE:.UMOB_RACE;
    	.UMOB_ELETYPE = (.@UMOB_ELETYPE) ? .@UMOB_ELETYPE:.UMOB_ELETYPE;
    	.UMOB_ELELEVEL = (.@UMOB_ELELEVEL) ? .@UMOB_ELELEVEL:.UMOB_ELELEVEL;
    	.UMOB_STR = (.@UMOB_STR) ? .@UMOB_STR:.UMOB_STR;
    	.UMOB_AGI = (.@UMOB_AGI) ? .@UMOB_AGI:.UMOB_AGI;
    	.UMOB_VIT = (.@UMOB_VIT) ? .@UMOB_VIT:.UMOB_VIT;
    	.UMOB_INT = (.@UMOB_INT) ? .@UMOB_INT:.UMOB_INT;
    	.UMOB_DEX = (.@UMOB_DEX) ? .@UMOB_DEX:.UMOB_DEX;
    	.UMOB_LUK = (.@UMOB_LUK) ? .@UMOB_LUK:.UMOB_LUK;
    	.UMOB_DEF = (.@UMOB_DEF) ? .@UMOB_DEF:.UMOB_DEF;
    	.UMOB_MDEF = (.@UMOB_MDEF) ? .@UMOB_MDEF:.UMOB_MDEF;
    	killmonster strnpcinfo(4),strnpcinfo(0)+"::OnMyMobDead";
    	donpcevent strnpcinfo(0)+"::OnMyMobDead";
    	end;
    	
    OnInit:
    	// Max level players can input
    	.maxlv = 99; 
    
    	// Max stats players can input 
    	.max_stat = 999;
    	
    	// Max hp - don't change if you dont know what you are doing
    	.UMOB_MAXHP = 2000000000;
    
    	// Default values on initial spawn
    	.UMOB_SIZE = 1;
    	.UMOB_LEVEL = 10;
    	.UMOB_RACE = 3;
    	.UMOB_ELETYPE = 1;
    	.UMOB_ELELEVEL = 1;
    	.UMOB_STR = 5;
    	.UMOB_AGI = 5;
    	.UMOB_VIT = 5;
    	.UMOB_INT = 5;
    	.UMOB_DEX = 5;
    	.UMOB_LUK = 5;
    	.UMOB_DEF = 10;
    	.UMOB_MDEF = 10;
    
    OnMyMobDead:
    	getunitdata(getnpcid(0), .@d);
    	monster strnpcinfo(4),.@d[UNPC_X],.@d[UNPC_Y],"Punching Bag",(!checkre(0))?1905:2411,1,strnpcinfo(0)+"::OnMyMobDead";
    	.@dupid = atoi(strnpcinfo(2));
    	.gid[.@dupid] = $@mobid[0];
    	.mhp[.@dupid] = .UMOB_MAXHP;
    	setunitdata .gid[.@dupid],UMOB_MODE,.@d[UMOB_MODE]|0x4000000|0x0200000; // Set MD_STATUS_IMMUNE (0x4000000) because EDP/burn/%MHP based status can skew the DPS counter so much.
    	setunitdata .gid[.@dupid],UMOB_MAXHP,.UMOB_MAXHP;
    	setunitdata .gid[.@dupid],UMOB_SIZE,.UMOB_SIZE;
    	setunitdata .gid[.@dupid],UMOB_LEVEL,.UMOB_LEVEL;
    	setunitdata .gid[.@dupid],UMOB_RACE,.UMOB_RACE;
    	setunitdata .gid[.@dupid],UMOB_ELETYPE,.UMOB_ELETYPE;
    	setunitdata .gid[.@dupid],UMOB_ELELEVEL,.UMOB_ELELEVEL;
    	setunitdata .gid[.@dupid],UMOB_STR,.UMOB_STR;
    	setunitdata .gid[.@dupid],UMOB_AGI,.UMOB_AGI;
    	setunitdata .gid[.@dupid],UMOB_VIT,.UMOB_VIT;
    	setunitdata .gid[.@dupid],UMOB_INT,.UMOB_INT;
    	setunitdata .gid[.@dupid],UMOB_DEX,.UMOB_DEX;
    	setunitdata .gid[.@dupid],UMOB_LUK,.UMOB_LUK;
    	setunitdata .gid[.@dupid],UMOB_DEF,.UMOB_DEF;
    	setunitdata .gid[.@dupid],UMOB_MDEF,.UMOB_MDEF;
    	initnpctimer;
    	end;
    	
    OnTimer5000:
    	.@dupid = atoi(strnpcinfo(2));
    	if(unitexists(.gid[.@dupid])){
    		getunitdata(.gid[.@dupid],.@d);
    		.@diff = (.mhp[.@dupid] - .@d[UMOB_HP]);
    		if(.@diff > 0){
    			npctalk "Punching Bag : I've taken " + F_InsertComma(.@diff/5) + " DPS in last 5 seconds.";
    			setunitdata .gid[.@dupid],UMOB_HP,.mhp[.@dupid];
    			specialeffect EF_HEAL, .gid[.@dupid];
    		}
    	}
    	initnpctimer;
    
    	function	get_size_name	{
    		switch ( getarg(0) ) {
    			case 0 : .@val$ = "Small"; break;
    			case 1 : .@val$ = "Medium"; break;
    			case 2 : .@val$ = "Large"; break;
    		}
    		return .@val$;
    	}
    	
    	function	get_race_name	{
    		switch ( getarg(0) ) {
    			case 0: .@val$ = "Formless"; break;
    			case 1: .@val$ = "Undead"; break;
    			case 2: .@val$ = "Brute"; break;
    			case 3: .@val$ = "Plant"; break;
    			case 4: .@val$ = "Insect"; break;
    			case 5: .@val$ = "Fish"; break;
    			case 6: .@val$ = "Demon"; break;
    			case 7: .@val$ = "Demihuman"; break;
    			case 8: .@val$ = "Angel"; break;
    			case 9: .@val$ = "Dragon"; break;
    			case 10: .@val$ = "Player"; break;
    		}
    		return .@val$;
    	}
    	
    	function	get_ele_name	{
    		switch ( getarg(0) ) {
    			case 0: .@val$ = "Neutral"; break;
    			case 1: .@val$ = "Water"; break;
    			case 2: .@val$ = "Earth"; break;
    			case 3: .@val$ = "Fire"; break;
    			case 4: .@val$ = "Wind"; break;
    			case 5: .@val$ = "Poison"; break;
    			case 6: .@val$ = "Holy"; break;
    			case 7: .@val$ = "Shadow"; break;
    			case 8: .@val$ = "Ghost"; break;
    			case 9: .@val$ = "Undead"; break;
    		}
    		return .@val$;
    	}
    }
    
    prontera,216,79,0	duplicate(Set Parameters#0)	Set Parameters#1	844
    prontera,224,70,0	duplicate(Set Parameters#0)	Set Parameters#2	844
    prontera,216,58,0	duplicate(Set Parameters#0)	Set Parameters#3	844
    prontera,224,58,0	duplicate(Set Parameters#0)	Set Parameters#4	844

    image.thumb.png.1e1fc2bc992367dc23240e36ed45ca6e.png

  13. 5 hours ago, Winterfox said:
    //===== rAthena Script ============================================
    //= Party vs Party
    //===== By: =======================================================
    //= AnnieRuru
    //===== Current Version: ==========================================
    //= 0.2
    //===== Compatible With: ==========================================
    //= rathena 2020-09-23
    //===== Description: ==============================================
    //= GM has to manually pick which 2 party to fight
    //===== Topic =====================================================
    //= https://rathena.org/board/topic/125939-looking-for-a-tournament-npc-sytem-pt-vs-pt/
    //===== Additional Comments: ======================================
    //= came over to rathena forum for a while, glad to see potential members on the other side
    //=================================================================
    
    prontera,155,177,5	script	PartyVsParty	100,{
    	goto OnWarStart;
    	end;
    
    	OnInit:
    		.eventlasting = 60; // 60 seconds
    		.partysize = 1;
    
    		bindatcmd "startmatch", strnpcinfo(3)+"::OnWarStart", 99,99;
    		setarray .available_type$, " ^00FF00Available^000000", " ^FF0000Unavailable^000000", " ^FF0000Offline^000000";
    		setmapflag "guild_vs3", mf_battleground, 2;
    		setmapflag "guild_vs3", mf_nosave;
    		setmapflag "guild_vs3", mf_nomemo;
    		setmapflag "guild_vs3", mf_nowarp;
    		setmapflag "guild_vs3", mf_nowarpto;
    		setmapflag "guild_vs3", mf_noteleport;
    		setmapflag "guild_vs3", mf_nopenalty;
    		end;
    	OnWarStart:
    		if (.start) {
    			mes "The match is in progress ...";
    			mes "The current score is "+ .partyAscore +":"+ .partyBscore;
    			mes "Terminate ?";
    			next;
    			if (select("No", "Yes") == 1) close;
    			if (select("Yes", "No") == 2) close;
    			.skip = true;
    			awake strnpcinfo(0);
    			close;
    		}
    		mes "Welcome, what do you want to do?";
    		callsub L_display_party_members, .partyA, "A";
    		callsub L_display_party_members, .partyB, "B";
    		next;
    		switch(select("Set Party Size", "Select Party A", "Select Party B", "Start Match")) {
    		case 1:
    			mes "input exact party size";
    			mes "if 3vs3, input 3";
    			next;
    			input .partysize, 1, 12;
    			goto OnWarStart;
    		case 2:
    			.partyA = callsub(L_select_party, "A", .partyA, .partyB);
    			goto OnWarStart;
    		case 3:
    			.partyB = callsub(L_select_party, "B", .partyB, .partyA);
    			goto OnWarStart;
    		case 4:
    			.@conditions = 0;
    			.@conditions += callsub(L_check_party_conditions, .partyA, "A");
    			.@conditions += callsub(L_check_party_conditions, .partyB, "B");
    			if (.@conditions < 2 || .start)
    				goto OnWarStart;
    			else
    				goto L_start;
    		}
    		close;
    	L_display_party_members:
    		if (!getarg(0))
    			mes "Party "+ getarg(1) +" = ^FF0000None^000000";
    		else {
    			getpartymember getarg(0), 0;
    			getpartymember getarg(0), 1;
    			getpartymember getarg(0), 2;
    			.@origin = getcharid(3);
    			.@online = .@unavailable = 0;
    			for (.@i = 0; .@i < $@partymembercount; ++.@i) {
    				if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    					attachrid $@partymemberaid[.@i];
    					if (getmapflag(strcharinfo(3), mf_nowarp)) {
    						.@type[.@i] = 1;
    						++.@online;
    						++.@unavailable;
    					}
    					else {
    						.@type[.@i] = 0;
    						++.@online;
    					}
    				}
    				else
    					.@type[.@i] = 2;
    			}
    			attachrid .@origin;
    			mes "Party "+ getarg(1) +" = ["+ getpartyname(.partyA) +"] "+( ($@partymembercount == .partysize && .@online == .partysize && !.@unavailable)? "^00FF00Ready": "^FF0000Not Qualify" )+"^000000";
    			mes "Online = "+ .@online +((.@unavailable)? ", Unavailable = "+ .@unavailable : "");
    			for (.@i = 0; .@i < $@partymembercount; ++.@i)
    				mes "- "+ $@partymembername$[.@i] + .available_type$[.@type[.@i]];
    		}
    		return;
    	L_select_party:
    		mes "input a player name";
    		input .@tmp$;
    		if (getcharid(3, .@tmp$) == 0) {
    			mes "player not available";
    			next;
    			return getarg(1);
    		}
    		.@partyid = getcharid(1, .@tmp$);
    		if (!.@partyid) {
    			mes "that player doesn't have a party";
    			next;
    			return getarg(1);
    		}
    		if (.@partyid == getarg(2)) {
    			mes "that player is a member on the other party";
    			next;
    			return getarg(1);
    		}
    		mes "are you sure you want the party";
    		mes getpartyname(.@partyid) +" as Party "+ getarg(0) +"?";
    		next;
    		if (select("Yes","No") == 2)
    			return getarg(1);
    		return .@partyid;
    	L_check_party_conditions:
    		if (!getarg(0)) {
    			mes "Party"+ getarg(1) +" hasn't been configure";
    			next;
    			return false;
    		}
    		getpartymember getarg(0), 0;
    		getpartymember getarg(0), 1;
    		getpartymember getarg(0), 2;
    		.@origin = getcharid(3);
    		for (.@i = 0; .@i < $@partymembercount; ++.@i) {
    			if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    				attachrid $@partymemberaid[.@i];
    				++.@online;
    				if (getmapflag(strcharinfo(3), mf_nowarp))
    					.@index[.@c++] = .@i;
    			}
    		}
    		attachrid .@origin;
    		if ($@partymembercount != .partysize) {
    			mes "Party"+ getarg(1) +" has changed its party size";
    			next;
    			return false;
    		}
    		if (!.@online) {
    			mes "Party"+ getarg(1) +" don't have any players online at the moment";
    			next;
    			return false;
    		}
    		if (.@online != .partysize) {
    			mes "Party"+ getarg(1) +" has a few members gone offline";
    			next;
    			return false;
    		}
    		if (.@c > 0) {
    			mes "Party"+ getarg(1) +" has "+ .@c +" party members not ready, still attending on other event maps";
    			for (.@i = 0; .@i < .@c; ++.@i)
    				mes "- "+ $@partymembername$[.@index[.@i]];
    			next;
    			return false;
    		}
    		return true;
    	L_register_bg_party:
    		getpartymember getarg(0), 1;
    		getpartymember getarg(0), 2;
    		for (.@i = 0; .@i < $@partymembercount; ++.@i) {
    			if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    				bg_join getarg(4), "guild_vs3", getarg(2), getarg(3), $@partymembercid[.@i];
    				set getarg(1), getarg(1) +1;
    			}
    		}
    		return;
    	L_start:
    		.start = true;
    		announce "Party Vs Party : ["+ getpartyname(.partyA) +"] VS ["+ getpartyname(.partyB) +"]", bc_all;
    		.partyAid = bg_create( "guild_vs3", 13,50, strnpcinfo(0)+"::OnpartyAQuit", strnpcinfo(0)+"::OnpartyADead" );
    		.partyBid = bg_create( "guild_vs3", 86,50, strnpcinfo(0)+"::OnpartyBQuit", strnpcinfo(0)+"::OnpartyBDead" );
    		callsub L_register_bg_party, .partyA, .partyAscore, 13,50, .partyAid;
    		callsub L_register_bg_party, .partyB, .partyBscore, 86,50, .partyBid;
    		bg_updatescore "guild_vs3", .partyAscore, .partyBscore;
    		setwall "guild_vs3", 19,55, 12, DIR_SOUTH, false, "partyvspartyA";
    		setwall "guild_vs3", 80,55, 12, DIR_SOUTH, false, "partyvspartyB";
    		sleep 3000;
    		for (.@i = 5; .@i > 0; --.@i) {
    			mapannounce "guild_vs3", "["+ .@i +"]", bc_map;
    			if (!.skip) sleep 1000;
    		}
    		mapannounce "guild_vs3", "Start!", bc_map;
    		delwall "partyvspartyA";
    		delwall "partyvspartyB";
    		if (!.skip) sleep .eventlasting * 1000;
    		if ( .partyAscore > .partyBscore ) {
    			mapannounce "guild_vs3", "Party ["+ getpartyname(.partyA) +"] is victorious!", bc_map;
    			callsub L_Reward, .partyAid;
    		}
    		else if ( .partyBscore > .partyAscore ) {
    			mapannounce "guild_vs3", "Party ["+ getpartyname(.partyB) +"] is victorious!", bc_map;
    			callsub L_Reward, .partyBid;
    		}
    		else
    			mapannounce "guild_vs3", "- The match has ended in a draw! -", bc_map;
    		bg_warp .partyAid, "prontera",152,178;
    		bg_warp .partyBid, "prontera",154,178;
    		bg_destroy .partyAid;
    		bg_destroy .partyBid;
    		.start = .skip =  false;
    		.partyAscore = .partyBscore = 0;
    		end;
    	L_Reward:
    		bg_get_data getarg(0), 1;
    		for ( .@i = 0; .@i < $@arenamemberscount; ++.@i )
    			getitem 512, 1, $@arenamembers[.@i];
    		return;
    	OnpartyADead:  callsub L_Dead, .partyAscore;
    	OnpartyBDead: callsub L_Dead, .partyBscore;
    	L_Dead:
    		set getarg(0), getarg(0) -1;
    		bg_updatescore "guild_vs3", .partyAscore, .partyBscore;
    		bg_leave;
    		if (!getarg(0)) {
    			.skip = true;
    			awake strnpcinfo(0);
    		}
    		end;
    	OnpartyAQuit:  callsub L_Quit, .partyAscore;
    	OnpartyBQuit: callsub L_Quit, .partyBscore;
    	L_Quit:
    		set getarg(0), getarg(0) -1;
    		bg_updatescore "guild_vs3", .partyAscore, .partyBscore;
    		percentheal 100, 100;
    		if (!getarg(0)) {
    			.skip = true;
    			awake strnpcinfo(0);
    		}
    		end;
    }

     

    Thank you very much friend. worked perfectly...
    Grateful!!!

  14. Good morning guys!

    Guys, how do I put a physical NPC in this script?

    I even got it but it doesn't work.

     

    I'm sorry, I'm really bad at scripting.

    I even tried haha

    //===== rAthena Script ============================================
    //= Party vs Party
    //===== By: =======================================================
    //= AnnieRuru
    //===== Current Version: ==========================================
    //= 0.2
    //===== Compatible With: ==========================================
    //= rathena 2020-09-23
    //===== Description: ==============================================
    //= GM has to manually pick which 2 party to fight
    //===== Topic =====================================================
    //= https://rathena.org/board/topic/125939-looking-for-a-tournament-npc-sytem-pt-vs-pt/
    //===== Additional Comments: ======================================
    //= came over to rathena forum for a while, glad to see potential members on the other side
    //=================================================================
    
    -	script	PartyVsParty	FAKE_NPC,{
    OnInit:
    	.eventlasting = 60; // 60 seconds
    	.partysize = 1;
    
    	bindatcmd "startmatch", strnpcinfo(3)+"::OnWarStart", 99,99;
    	setarray .available_type$, " ^00FF00Available^000000", " ^FF0000Unavailable^000000", " ^FF0000Offline^000000";
    	setmapflag "guild_vs3", mf_battleground, 2;
    	setmapflag "guild_vs3", mf_nosave;
    	setmapflag "guild_vs3", mf_nomemo;
    	setmapflag "guild_vs3", mf_nowarp;
    	setmapflag "guild_vs3", mf_nowarpto;
    	setmapflag "guild_vs3", mf_noteleport;
    	setmapflag "guild_vs3", mf_nopenalty;
    	end;
    OnWarStart:
    	if (.start) {
    		mes "The match is in progress ...";
    		mes "The current score is "+ .partyAscore +":"+ .partyBscore;
    		mes "Terminate ?";
    		next;
    		if (select("No", "Yes") == 1) close;
    		if (select("Yes", "No") == 2) close;
    		.skip = true;
    		awake strnpcinfo(0);
    		close;
    	}
    	mes "Welcome, what do you want to do?";
    	callsub L_display_party_members, .partyA, "A";
    	callsub L_display_party_members, .partyB, "B";
    	next;
    	switch(select("Set Party Size", "Select Party A", "Select Party B", "Start Match")) {
    	case 1:
    		mes "input exact party size";
    		mes "if 3vs3, input 3";
    		next;
    		input .partysize, 1, 12;
    		goto OnWarStart;
    	case 2:
    		.partyA = callsub(L_select_party, "A", .partyA, .partyB);
    		goto OnWarStart;
    	case 3:
    		.partyB = callsub(L_select_party, "B", .partyB, .partyA);
    		goto OnWarStart;
    	case 4:
    		.@conditions = 0;
    		.@conditions += callsub(L_check_party_conditions, .partyA, "A");
    		.@conditions += callsub(L_check_party_conditions, .partyB, "B");
    		if (.@conditions < 2 || .start)
    			goto OnWarStart;
    		else
    			goto L_start;
    	}
    	close;
    L_display_party_members:
    	if (!getarg(0))
    		mes "Party "+ getarg(1) +" = ^FF0000None^000000";
    	else {
    		getpartymember getarg(0), 0;
    		getpartymember getarg(0), 1;
    		getpartymember getarg(0), 2;
    		.@origin = getcharid(3);
    		.@online = .@unavailable = 0;
    		for (.@i = 0; .@i < $@partymembercount; ++.@i) {
    			if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    				attachrid $@partymemberaid[.@i];
    				if (getmapflag(strcharinfo(3), mf_nowarp)) {
    					.@type[.@i] = 1;
    					++.@online;
    					++.@unavailable;
    				}
    				else {
    					.@type[.@i] = 0;
    					++.@online;
    				}
    			}
    			else
    				.@type[.@i] = 2;
    		}
    		attachrid .@origin;
    		mes "Party "+ getarg(1) +" = ["+ getpartyname(.partyA) +"] "+( ($@partymembercount == .partysize && .@online == .partysize && !.@unavailable)? "^00FF00Ready": "^FF0000Not Qualify" )+"^000000";
    		mes "Online = "+ .@online +((.@unavailable)? ", Unavailable = "+ .@unavailable : "");
    		for (.@i = 0; .@i < $@partymembercount; ++.@i)
    			mes "- "+ $@partymembername$[.@i] + .available_type$[.@type[.@i]];
    	}
    	return;
    L_select_party:
    	mes "input a player name";
    	input .@tmp$;
    	if (getcharid(3, .@tmp$) == 0) {
    		mes "player not available";
    		next;
    		return getarg(1);
    	}
    	.@partyid = getcharid(1, .@tmp$);
    	if (!.@partyid) {
    		mes "that player doesn't have a party";
    		next;
    		return getarg(1);
    	}
    	if (.@partyid == getarg(2)) {
    		mes "that player is a member on the other party";
    		next;
    		return getarg(1);
    	}
    	mes "are you sure you want the party";
    	mes getpartyname(.@partyid) +" as Party "+ getarg(0) +"?";
    	next;
    	if (select("Yes","No") == 2)
    		return getarg(1);
    	return .@partyid;
    L_check_party_conditions:
    	if (!getarg(0)) {
    		mes "Party"+ getarg(1) +" hasn't been configure";
    		next;
    		return false;
    	}
    	getpartymember getarg(0), 0;
    	getpartymember getarg(0), 1;
    	getpartymember getarg(0), 2;
    	.@origin = getcharid(3);
    	for (.@i = 0; .@i < $@partymembercount; ++.@i) {
    		if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    			attachrid $@partymemberaid[.@i];
    			++.@online;
    			if (getmapflag(strcharinfo(3), mf_nowarp))
    				.@index[.@c++] = .@i;
    		}
    	}
    	attachrid .@origin;
    	if ($@partymembercount != .partysize) {
    		mes "Party"+ getarg(1) +" has changed its party size";
    		next;
    		return false;
    	}
    	if (!.@online) {
    		mes "Party"+ getarg(1) +" don't have any players online at the moment";
    		next;
    		return false;
    	}
    	if (.@online != .partysize) {
    		mes "Party"+ getarg(1) +" has a few members gone offline";
    		next;
    		return false;
    	}
    	if (.@c > 0) {
    		mes "Party"+ getarg(1) +" has "+ .@c +" party members not ready, still attending on other event maps";
    		for (.@i = 0; .@i < .@c; ++.@i)
    			mes "- "+ $@partymembername$[.@index[.@i]];
    		next;
    		return false;
    	}
    	return true;
    L_register_bg_party:
    	getpartymember getarg(0), 1;
    	getpartymember getarg(0), 2;
    	for (.@i = 0; .@i < $@partymembercount; ++.@i) {
    		if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    			bg_join getarg(4), "guild_vs3", getarg(2), getarg(3), $@partymembercid[.@i];
    			set getarg(1), getarg(1) +1;
    		}
    	}
    	return;
    L_start:
    	.start = true;
    	announce "Party Vs Party : ["+ getpartyname(.partyA) +"] VS ["+ getpartyname(.partyB) +"]", bc_all;
    	.partyAid = bg_create( "guild_vs3", 13,50, strnpcinfo(0)+"::OnpartyAQuit", strnpcinfo(0)+"::OnpartyADead" );
    	.partyBid = bg_create( "guild_vs3", 86,50, strnpcinfo(0)+"::OnpartyBQuit", strnpcinfo(0)+"::OnpartyBDead" );
    	callsub L_register_bg_party, .partyA, .partyAscore, 13,50, .partyAid;
    	callsub L_register_bg_party, .partyB, .partyBscore, 86,50, .partyBid;
    	bg_updatescore "guild_vs3", .partyAscore, .partyBscore;
    	setwall "guild_vs3", 19,55, 12, DIR_SOUTH, false, "partyvspartyA";
    	setwall "guild_vs3", 80,55, 12, DIR_SOUTH, false, "partyvspartyB";
    	sleep 3000;
    	for (.@i = 5; .@i > 0; --.@i) {
    		mapannounce "guild_vs3", "["+ .@i +"]", bc_map;
    		if (!.skip) sleep 1000;
    	}
    	mapannounce "guild_vs3", "Start!", bc_map;
    	delwall "partyvspartyA";
    	delwall "partyvspartyB";
    	if (!.skip) sleep .eventlasting * 1000;
    	if ( .partyAscore > .partyBscore ) {
    		mapannounce "guild_vs3", "Party ["+ getpartyname(.partyA) +"] is victorious!", bc_map;
    		callsub L_Reward, .partyAid;
    	}
    	else if ( .partyBscore > .partyAscore ) {
    		mapannounce "guild_vs3", "Party ["+ getpartyname(.partyB) +"] is victorious!", bc_map;
    		callsub L_Reward, .partyBid;
    	}
    	else
    		mapannounce "guild_vs3", "- The match has ended in a draw! -", bc_map;
    	bg_warp .partyAid, "prontera",152,178;
    	bg_warp .partyBid, "prontera",154,178;
    	bg_destroy .partyAid;
    	bg_destroy .partyBid;
    	.start = .skip =  false;
    	.partyAscore = .partyBscore = 0;
    	end;
    L_Reward:
    	bg_get_data getarg(0), 1;
    	for ( .@i = 0; .@i < $@arenamemberscount; ++.@i )
    		getitem 512, 1, $@arenamembers[.@i];
    	return;
    OnpartyADead:  callsub L_Dead, .partyAscore;
    OnpartyBDead: callsub L_Dead, .partyBscore;
    L_Dead:
    	set getarg(0), getarg(0) -1;
    	bg_updatescore "guild_vs3", .partyAscore, .partyBscore;
    	bg_leave;
    	if (!getarg(0)) {
    		.skip = true;
    		awake strnpcinfo(0);
    	}
    	end;
    OnpartyAQuit:  callsub L_Quit, .partyAscore;
    OnpartyBQuit: callsub L_Quit, .partyBscore;
    L_Quit:
    	set getarg(0), getarg(0) -1;
    	bg_updatescore "guild_vs3", .partyAscore, .partyBscore;
    	percentheal 100, 100;
    	if (!getarg(0)) {
    		.skip = true;
    		awake strnpcinfo(0);
    	}
    	end;
    }

     

×
×
  • Create New...