Jump to content

Notorius

Members
  • Posts

    106
  • Joined

  • Last visited

Posts posted by Notorius

  1. On 7/7/2023 at 3:45 PM, Notorius said:

    Hello Rathena, I have a problem and I hope you can help me. Now I have a problem trying to edit the function of the skill dispell when it is used on a player in a berserk state. The problem I want to solve is that when a player in a berserk state is Hit by the dispell ability, it remains at 0 hp and sp. What I want is when a dispell is fired at a player with dispell, it remains at 100% hp and 0 sp, any way to do it? I'm trying to edit here but can't get skill.c to work

     

     

    				if (i == SC_BERSERK || i == SC_SATURDAYNIGHTFEVER)
    					tsc->getSCE(status)->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0.
    				status_change_end(bl, status);

     

    solution: 

    	case SA_DISPELL:
    		if (flag&1 || (i = skill_get_splash(skill_id, skill_lv)) < 1) {
    			if (sd && dstsd && !map_flag_vs(sd->bl.m) && (!sd->duel_group || sd->duel_group != dstsd->duel_group) && (!sd->status.party_id || sd->status.party_id != dstsd->status.party_id))
    				break; // Outside PvP it should only affect party members and no skill fail message
    			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
    			if((dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER)
    				|| (tsc && tsc->getSCE(SC_SPIRIT) && tsc->getSCE(SC_SPIRIT)->val2 == SL_ROGUE) //Rogue's spirit defends againt dispel.
    				|| rnd()%100 >= 50+10*skill_lv)
    			{
    				if (sd)
    					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
    				break;
    			}
    			if(status_isimmune(bl))
    				break;
    
    			//Remove bonus berserk by Dispell
    			if (dstsd)
    				pc_bonus_script_clear(dstsd,BSF_REM_ON_DISPELL);
    
    			if(!tsc || !tsc->count)
    				break;
    			for (const auto &it : status_db) {
    				sc_type status = static_cast<sc_type>(it.first);
    
    				if (!tsc->getSCE(SC_BERSERK))
    					continue;
    
    				if (it.second->flag[SCF_NODISPELL])
    					continue;
    			if (i == SC_BERSERK)
    				tsc->getSCE(status)->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0.
    				status_change_end(bl, status);
    				status_percent_heal(bl, 100, 0);
    			}
    			//Statuses that can't be Dispelled
    			for (const auto &it : status_db) {
    				sc_type status = static_cast<sc_type>(it.first);
    
    				if (!tsc->getSCE(status))
    					continue;
    
    				if (it.second->flag[SCF_NODISPELL])
    					continue;
    				switch (status) {
    					// bugreport:4888 these songs may only be dispelled if you're not in their song area anymore
    					case SC_WHISTLE:		case SC_ASSNCROS:		case SC_POEMBRAGI:
    					case SC_APPLEIDUN:		case SC_HUMMING:		case SC_DONTFORGETME:
    					case SC_FORTUNE:		case SC_SERVICE4U:
    						if (!battle_config.dispel_song || tsc->getSCE(status)->val4 == 0)
    							continue; //If in song area don't end it, even if config enabled
    						break;
    					case SC_ASSUMPTIO:
    						if( bl->type == BL_MOB )
    							continue;
    						break;
    				}
    				if (i == SC_SATURDAYNIGHTFEVER)
    				tsc->getSCE(status)->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0.
    				status_change_end(bl, status);
    			}
    			break;
    		}

     

  2. 17 hours ago, laonglaing said:

    I'm trying to learn how Sharpshoot/FAS Skill works. as i want to do some damage modification when the skill bounce on other player/mobs.
    tried to check skill.cpp using skill id SN_SHARPSHOOTING but cant find relevant information. can someone enlighten me about this/

    check in battle.c it could be this

     

     

    		case SN_SHARPSHOOTING:
    			if (src->type == BL_MOB) { // TODO: Did these formulas change in the renewal balancing?
    				if (wd->miscflag & 2) // Splash damage bonus
    					skillratio += -100 + 140 * skill_lv;
    				else
    					skillratio += 100 + 50 * skill_lv;
    				break;
    			}

     

  3. Hello Rathena, I have a problem and I hope you can help me. Now I have a problem trying to edit the function of the skill dispell when it is used on a player in a berserk state. The problem I want to solve is that when a player in a berserk state is Hit by the dispell ability, it remains at 0 hp and sp. What I want is when a dispell is fired at a player with dispell, it remains at 100% hp and 0 sp, any way to do it? I'm trying to edit here but can't get skill.c to work

     

     

    				if (i == SC_BERSERK || i == SC_SATURDAYNIGHTFEVER)
    					tsc->getSCE(status)->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0.
    				status_change_end(bl, status);

     

  4. 7 hours ago, nekoyarou said:

    I am also thinking like that, but i dont think it's gonna be that easy, so i was thinking if its possible to make it sort of a custom job for 3rd jobs?.

    if so, can you teach me how to do it or maybe point me to a guide that could teach me how to do it?

    Thanks.

    Well, I don't have much experience. I've never created a new job, but I think the easiest would be to use renewal and adapt your emludor to your needs.

  5. 2 hours ago, nekoyarou said:

    Hi everyone,

    i just created an online server successfully and wanted to implement 3rd job for character and i'm guessing it's absolutely possible but i dont know how.

    can anyone guide teach me how to script so i can have 3rd jobs in pre renewal server?.

    thanks in advance

     

     

    I imagine that it would be enough to add the jobs to the job_ tables and the skill tables and enable the third jobs in their job master

  6. hello rathena how to add this drop through this script to an mvp custom in mvp ladder?

    -    script    ifrit    -1,{
    OnNPCKillEvent:
    if ( killedrid != 31000 ) end;
    if ( getcharid(1) ) {
        getpartymember getcharid(1), 1;
        getpartymember getcharid(1), 2;
        for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
            if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
                .@partymemberaid[.@c] = $@partymemberaid[.@i];
                .@c++;
            }
        }
        //Party has 10% chance to get the item 45018
        if (rand(100) < 50)
            getitem F_Rand(45006,45007,45008,45009,45010,45011), 1, .@partymemberaid[ rand( .@c ) ];
        announce "Party ["+ strcharinfo(1) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
    }
    else {
        //Players without party has 15% chance to get the item 45018
        if (rand(100) < 50)
            getitem F_Rand(45006,45007,45008,45009,45010,45011), 1;
        announce "El jugador ["+ strcharinfo(0) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
    }
    end;
    } 

     

    mvp ladder

    prontera,164,170,3	script	MvP Ladder Warper	56,{
    	mes "[MvP Ladder Warper]";
    	mes "¿quieres entrar a MvP Ladder?";
    	next;
    	switch(select("¡Sí, vamos!:Información.:Muéstrame el mejor record.:No.")) {
    	case 1:
    		break;
    	case 2:
    		mes "[MvP Ladder Warper]";
    		mes "En este juego, tu grupo tiene que matar a todos los MvP en orden ascendente, del más débil al más fuerte..";
    		if ( .finish_item_amount )
    			mes "Si su grupo puede terminar MVP Ladder, cada miembro ganará "+ callfunc("F_InsertPlural", .finish_item_amount, getitemname( .finish_item_id )) +".";
    		if ( .register_cost )
    			mes "But the entrance fee is "+ callfunc( "F_InsertComma", .register_cost ) +" zeny.";
    		next;
    		mes "[MvP Ladder Warper]";
    		mes "Pierdes el juego si no puedes terminar en "+ .timeout +" minutes, o si todo tu grupo es asesinado.";
    		mes "Suerte!";
    		close;
    	case 3:
    		mes "[MvP Ladder Warper]";
    		if ( !$mvpladdderparty_time ) {
    			mes "Nadie ha terminado este juego todavía..";
    			close;
    		}
    		mes "The best record is";
    		mes "[ "+( $mvpladdderparty_time / 60 )+" min "+( $mvpladdderparty_time % 60 )+" sec ]";
    		mes "By the party ^FF0000"+ $mvpladdderparty_name$ +"^000000.";
    		.@size = getarraysize( $mvpladderparty_member$ );
    		for ( .@i = 0; .@i < .@size; .@i++ )
    			mes "^000000"+ ( .@i +1 ) +". ^0000FF"+ $mvpladderparty_member$[.@i];
    		if ( getgmlevel() < .gmlvlreset ) close;
    		next;
    		if ( select( "Close.", "Reset the record." ) == 1 ) close;
    		if ( select( "Never mind.", "Realmente quiero restablecerlo." ) == 1 ) close;
    		$mvpladdderparty_time = 0;
    		$mvpladdderparty_name$ = "";
    		deletearray $mvpladderparty_member$[.@i];
    		mes "[MvP Ladder Warper]";
    		mes "Record reset successfully.";
    		close;
    	case 4:
    		mes "[MvP Ladder Warper]";
    		mes "Regresa cuando seas mas fuerte..";
    		close;
    	}
    	if ( !getcharid(1) ) {
    		mes "[MvP Ladder Warper]";
    		mes "Tienes que formar una party para jugar..";
    		close;
    	}
    	if ( is_party_leader() == false ) {
    		mes "[MvP Ladder Warper]";
    		mes "Solo el líder de la party puede registrarse..";
    		close;
    	}
    	.@origin = getcharid(3);
    	getpartymember getcharid(1), 1;
    	getpartymember getcharid(1), 2;
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == strnpcinfo(4) )
    				.@online++;
    		}
    	}
    	attachrid .@origin;
    	if ( $@partymembercount != .register_min ) {
    		mes "[MvP Ladder Warper]";
    		mes "Tienes que formar una party con exactamente "+ .register_min +" miembros para jugar.";
    		close;
    	}
    	else if ( .@online != .register_min )  {
    		mes "[MvP Ladder Warper]";
    		mes "Tu party debe tener "+ .register_min +" miembros en línea en el mapa '"+ strnpcinfo(4) +"'.";
    		close;
    	}
    	else if ( .register_cost && Zeny < .register_cost ) {
    		mes "[MvP Ladder Warper]";
    		mes "No tienes suficiente zeny. Por favor, vuelve cuando lo tengas.";
    		close;
    	}
    	else if ( .party_id ) {
    		mes "[MvP Ladder Warper]";
    		mes "Lo siento, pero un grupo está jugando actualmente. Por favor espera hasta que terminen.";
    		mes "Gracias.";
    		close;
    	}
            else if( #mvp_ladder_delay >= gettimetick(2) ){
                   mes "regresa en 1 hora.";
                   mes "Time left: "+( #mvp_ladder_delay - gettimetick(2) )+" second.";
                   close;
            }
            #mvp_ladder_delay = gettimetick(2) + 3600;
    	Zeny -= .register_cost;
    	announce "The party ["+ strcharinfo(1) +"] a entrado a MvP ladder.", bc_all;
    	set .party_id, getcharid(1);
    	set .@time_enter, gettimetick(2);
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == strnpcinfo(4) ) {
    				announce "Tienes "+ .timeout +" minutos para completar "+ .totalround +" rounds.", bc_self;
    				.@name$[.@c] = strcharinfo(0);
    				.@c++;
    			}
    		}
    	}
    	cleanmap .eventmap$;
    	warpparty .eventmap$, 0,0, .party_id, strnpcinfo(4);
    	donpcevent strnpcinfo(0)+"::OnMvpDead";
    	sleep .timeout * 60000;
    	if ( .round == .totalround +1 ) {
    		getpartymember .party_id, 1;
    		getpartymember .party_id, 2;
    		mapannounce .eventmap$, "Felicidades ... Pudiste derrotar a todos los MVPs!", bc_map;
    		for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    			if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    				attachrid $@partymemberaid[.@i];
    				if ( strcharinfo(3) == .eventmap$ )
    					getitem .finish_item_id, .finish_item_amount;
    			}
    		}
    		set .@timeused, gettimetick(2) - .@time_enter;
    		if ( .bonus_item_amount && .@timeused < .bonus_time * 60 ) {
    			mapannounce .eventmap$, "Se le recompensa con un artículo de bonificación por completar la escalera dentro de "+ .bonus_time +" minutes.", bc_map;
    			for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    				if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    					attachrid $@partymemberaid[.@i];
    					if ( strcharinfo(3) == .eventmap$ )
    						getitem .bonus_item_id, .bonus_item_amount;
    				}
    			}
    		}
    
    		if ( !$mvpladdderparty_time || .@timeused < $mvpladdderparty_time ) {
    			mapannounce .eventmap$, "And you broke the record! [ "+( .@timeused / 60 )+" min "+( .@timeused % 60 )+" sec ]", bc_map;
    			set $mvpladdderparty_time, .@timeused;
    			set $mvpladdderparty_name$, getpartyname( .party_id );
    			copyarray $mvpladderparty_member$, .@name$, .register_min;
    		}
    		else
    			mapannounce .eventmap$, "Time used [ "+( .@timeused / 60 )+" min "+( .@timeused % 60 )+" sec ]", bc_map;
    		sleep 10000;
    		announce "The party ["+ getpartyname( .party_id ) +"] ha terminado el MvP ladder!", bc_all;
    	}
    	else
    		announce "The party ["+ getpartyname( .party_id ) +"] ha fallado el MvP ladder.", bc_all;
    	mapwarp .eventmap$, .map$, .x, .y;
    	killmonsterall .eventmap$;
    	.party_id = .round = 0;
    	end;
    
    OnMvpDead:
            if (mobcount(.eventMap$,strnpcinfo(0)+"::OnMvpDead") > 0) { end; }
    	getpartymember .party_id, 1;
    	getpartymember .party_id, 2;
    	.round++;
    	if ( .round >= 2 && .round != .totalround +1 && .round_item_amount ) {
    		for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    			if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    				attachrid $@partymemberaid[.@i];
    				if ( strcharinfo(3) == .eventmap$ )
    					getitem .round_item_id, .round_item_amount;
    			}
    		}
    	}
    	if ( .round == .totalround +1 ) {
    		awake strnpcinfo(0);
    		end;
    	}
    	else if ( .round == .totalround )
    		mapannounce .eventmap$, "La ronda final comenzará en "+ .delay +" seconds...", bc_map;
    	else
    		mapannounce .eventmap$, "Ronda inicial "+ .round +" in "+ .delay +" seconds...", bc_map;
    	sleep .delay * 1000;
    	if ( .mvpid[.round] == 1646 )  // pick random Bio3 MVP
    		.mvpid[.round] = rand(1646,1651);
    	monster .eventmap$,0,0, "--ja--", .mvpid[.round], 5, strnpcinfo(0)+"::OnMvpDead";
    	mapannounce .eventmap$, getmonsterinfo( .mvpid[.round], MOB_NAME ) +" has spawned!", bc_map|bc_blue;
    	end;
    
    OnPCLogoutEvent:
    	if ( hp > 0 )
    		.@less_one = 1;
    	else
    		end;
    OnPCDieEvent:
    	if ( strcharinfo(3) != .eventmap$ || !getcharid(1) ) end;
    	if ( getcharid(1) != .party_id ) end;
    	getpartymember .party_id, 1;
    	getpartymember .party_id, 2;
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == .eventmap$ && hp > 0 )
    				.@alive++;
    		}
    	}
    	if ( .@less_one )
    		.@alive--;
    	if ( !.@alive ) {
    		mapannounce .eventmap$, "Party wiped!", bc_map;
    		sleep 10000;
    		awake strnpcinfo(0);
    	}
    	end;
    
    OnInit:
    //	Configurations -----------------------------------------------------
    
    	// Time limit (in minutes)
    	// When time runs out, all players inside the room will be kicked out.
    	// Do NOT set this to zero!
    	set .timeout, 60;
    
    	// entrance fee (in Zeny)
    	set .register_cost, 20000000;
    
    	// exact amount of party members needed to start the game
    	set .register_min, 2;
    
    	// id of each mvp. you can add more
    	setarray .mvpid[1],
    		1086,//	Golden Thief Bug	64
    		1115,//	Eddga				65
    		1150,//	Moonlight Flower	67
    		1159,//	Phreeoni			69
    		1112,//	Drake				70
    		1583,//	Tao Gunka			70
    		1492,//	Incantation Samurai	71
    		1046,//	Doppelgangger		72
    		1252,//	Garm				73
    		1418,//	Evil Snake Lord		73
    		1059,//	Mistress			74
    		1190,//	Orc Lord			74
    		1087,//	Orc Hero			77
    		1251,//	Knight of Windstorm	77
    		1038,//	Osiris				78
    		1658,//	Ygnizem				79
    		1272,//	Dark Lord			80
    		1871,//	Fallen Bishop		80
    		1039,//	Baphomet			81
    		1147,//	Maya				81
    		1785,//	Atroce				82
    		1389,//	Dracula				85
    		1630,//	Bacsojin			85
    		1885,//	Gorynych			85
    		1623,//	RSX 0806			86
    		1511,//	Amon Ra				88
    		1688,//	Lady Tanee			89
    		1768,//	Gloom Under Night	89
    		1719,//	Datale				90
    		1734,//	Kiel D-01			90
    		1157,//	Pharaoh				93
    		1373,//	Lord of Death		94
    		1312,//	Turtle General		97
    		1779,//	Ktullanux			98
    		1874,//	Beelzebub			98
    		1646,// Bio3 placeholder    99
    		1708,//	Thanatos			99
    		1751,//	Valkyrie Randgris	99
    		rand(2235,2241);//	Ifrit				99
    
    	// number of rounds (default: 39)
    	set .totalround, getarraysize(.mvpid) -1;
    
    	// item reward for completing each round
    	set .round_item_id, 675;
    	set .round_item_amount, 5;
    
    	// item reward for completing the entire ladder
    	set .finish_item_id, 12130;
    	set .finish_item_amount, 1;
    
    	// bonus reward if ladder completed within a certain time (in minutes)
    	set .bonus_time, 25; // if completed within 45 minutes, this reward is given
    	set .bonus_item_id, 12130;
    	set .bonus_item_amount, 1;
    
    	// time delay between rounds, in seconds (default: 3)
    	set .delay, 5;
    
    	// minimum GM level to reset the best record
    	set .gmlvlreset, 99;
    
    	// event map
    	set .eventmap$, "guild_vs2-2";
    
    	// mapflag configuration
    	setarray .@mapflag,
    		mf_nowarp,
    		mf_nowarpto,
    		mf_nosave,
    		mf_nomemo,
    		mf_noteleport,
    //		mf_nopenalty, // disable exp loss
    		mf_noreturn,
    //		mf_nobranch,
    //		mf_nomobloot, // disable monster drop loots,
    //		mf_nomvploot, // 2 of these
    		mf_partylock;
    
    //	Config Ends --------------------------------------------------------------
    
    	mapannounce .eventmap$, "An administrator has refreshed the server. Please re-register. We apologize for the inconvenience.", bc_map;
    	getmapxy .map$, .x, .y, BL_NPC;
    	mapwarp .eventmap$, .map$, .x, .y;
    	killmonsterall .eventmap$;
    	.@size = getarraysize( .@mapflag );
    	for ( .@i = 0; .@i < .@size; .@i++ )
    		setmapflag .eventmap$, .@mapflag[.@i];
    	end;
    }

     

  7. 2 hours ago, bambang777 said:

    esto sucedió hace 3 días cuando estaba a punto de compilar, traté de apagar el servidor y luego usé el comando "./configure" luego "make clean" y "make sql" pero luego ocurrió un error (no tengo la foto), después de eso hoy lo intenté de nuevo, resultó que el archivo "athena-start" es un error y hay un archivo corrupto,  traté de obtener el archivo en github y al final sucedió que el permiso de athena-start fue denegado . novato, por favor ayuda imagen.png.3fb6994ae8dd67f13b81dd671c742a4e.png
     

    I'm not sure but maybe I need to give permissions like this

    https://prnt.sc/Ki08XPBqdDgF

     

  8. On 5/30/2023 at 2:01 AM, Notorius said:

    Hello, I have a problem. I am using two equal events, each one with its map, the mvp ladder, both have an interval time in which something like a delay can be used again, but I have a problem, the two events work independently, but they don't. I can make the delay different for both I'll call these mvp ladder1 and mvp ladder2 so I can be more clear with the error I'm getting mvp ladder1 has an interval time each time I can go back to 1 hour and mvp ladder2 It has a time of 12 hours and normally if I use mvp ladder1 I can re-enter the event after 1 hour has elapsed but that time is also counted in mvpl adder2 and if I do mvp ladder2 and finish it after this it tells me I have to wait 12 hours as it should be but now if I want to go back to mvp ladder 1 it tells me that I also have to wait 12 hours I upload photos and the scripts to try to be more clear

     

     

     

     

    MvP ladder1

    https://prnt.sc/Rpf1jcUBRuPk

        else if( #mvp_ladder_delay >= gettimetick(2) ){
            mes "regresa en 1 hora.";
            mes "Tiempo restante :^00FF00 "+( #mvp_ladder_delay - gettimetick(2) )+"^000000 segundos.";
            close;
        }
        #mvp_ladder_delay = gettimetick(2) + 3600;
    	Zeny -= .register_cost;
    	announce "The party ["+ strcharinfo(1) +"] a entrado a MvP ladder.", bc_all;
    	set .party_id, getcharid(1);
    	set .@time_enter, gettimetick(2);
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == strnpcinfo(4) ) {
    				announce "Tienes "+ .timeout +" minutos para completar "+ .totalround +" rounds.", bc_self;
    				.@name$[.@c] = strcharinfo(0);
    				.@c++;
    			}
    		}
    	}

     

    mvp ladder2

    https://prnt.sc/B7IL4B6BWPak

            else if( #mvp_ladder_delay >= gettimetick(2) ){
                   mes "regresa en 12 horas.";
                   mes "Time left: "+( #mvp_ladder_delay - gettimetick(2) )+" second.";
                   close;
            }
            #mvp_ladder_delay = gettimetick(2) + 43200;
    	delitem 675,200;
    	announce "The party ["+ strcharinfo(1) +"] a entrado a MvP ladder.", bc_all;
    	set .party_id, getcharid(1);
    	set .@time_enter, gettimetick(2);
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == strnpcinfo(4) ) {
    				announce "Tienes "+ .timeout +" minutos para completar "+ .totalround +" rounds.", bc_self;
    				.@name$[.@c] = strcharinfo(0);
    				.@c++;
    			}
    		}
    	}

     

    solution:

     

            else if( #mvp_ladder_delay2 >= gettimetick(2) ){
                   mes "regresa en 12 horas.";
                   mes "Time left: "+( #mvp_ladder_delay2 - gettimetick(2) )+" second.";
                   close;
            }
            #mvp_ladder_delay2 = gettimetick(2) + 43200;
    	delitem 675,200;
    	announce "The party ["+ strcharinfo(1) +"] a entrado a MvP ladder.", bc_all;
    	set .party_id, getcharid(1);
    	set .@time_enter, gettimetick(2);
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == strnpcinfo(4) ) {
    				announce "Tienes "+ .timeout +" minutos para completar "+ .totalround +" rounds.", bc_self;
    				.@name$[.@c] = strcharinfo(0);
    				.@c++;
    			}
    		}
    	}

     

  9. Hello, I have a problem. I am using two equal events, each one with its map, the mvp ladder, both have an interval time in which something like a delay can be used again, but I have a problem, the two events work independently, but they don't. I can make the delay different for both I'll call these mvp ladder1 and mvp ladder2 so I can be more clear with the error I'm getting mvp ladder1 has an interval time each time I can go back to 1 hour and mvp ladder2 It has a time of 12 hours and normally if I use mvp ladder1 I can re-enter the event after 1 hour has elapsed but that time is also counted in mvpl adder2 and if I do mvp ladder2 and finish it after this it tells me I have to wait 12 hours as it should be but now if I want to go back to mvp ladder 1 it tells me that I also have to wait 12 hours I upload photos and the scripts to try to be more clear

     

     

     

     

    MvP ladder1

    https://prnt.sc/Rpf1jcUBRuPk

        else if( #mvp_ladder_delay >= gettimetick(2) ){
            mes "regresa en 1 hora.";
            mes "Tiempo restante :^00FF00 "+( #mvp_ladder_delay - gettimetick(2) )+"^000000 segundos.";
            close;
        }
        #mvp_ladder_delay = gettimetick(2) + 3600;
    	Zeny -= .register_cost;
    	announce "The party ["+ strcharinfo(1) +"] a entrado a MvP ladder.", bc_all;
    	set .party_id, getcharid(1);
    	set .@time_enter, gettimetick(2);
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == strnpcinfo(4) ) {
    				announce "Tienes "+ .timeout +" minutos para completar "+ .totalround +" rounds.", bc_self;
    				.@name$[.@c] = strcharinfo(0);
    				.@c++;
    			}
    		}
    	}

     

    mvp ladder2

    https://prnt.sc/B7IL4B6BWPak

            else if( #mvp_ladder_delay >= gettimetick(2) ){
                   mes "regresa en 12 horas.";
                   mes "Time left: "+( #mvp_ladder_delay - gettimetick(2) )+" second.";
                   close;
            }
            #mvp_ladder_delay = gettimetick(2) + 43200;
    	delitem 675,200;
    	announce "The party ["+ strcharinfo(1) +"] a entrado a MvP ladder.", bc_all;
    	set .party_id, getcharid(1);
    	set .@time_enter, gettimetick(2);
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
    			attachrid $@partymemberaid[.@i];
    			if ( strcharinfo(3) == strnpcinfo(4) ) {
    				announce "Tienes "+ .timeout +" minutos para completar "+ .totalround +" rounds.", bc_self;
    				.@name$[.@c] = strcharinfo(0);
    				.@c++;
    			}
    		}
    	}

     

  10. On 4/8/2023 at 10:18 PM, ryzenthird said:

    Try using this 

     

     

    so it should go like this

    if(gettime(DT_DAYOFMONTH) == 30 || gettime(DT_DAYOFMONTH) == 31){
     //SCRIPT FOR REWARD THE TOP LADDER AND RESET THE LADDER

    }

    how should i add it? Could you give me an example of how it should look inside the script?

  11. 17 minutes ago, pajodex said:

    It seems like you are using a custom Endless tower. Just as example, I will use the official endless tower script.

    1@tower,29,365,1	script	#1F Controller	844,{
    	end;
    
    OnInstanceInit:
    	callfunc "F_Tower_Monster",
    		1,
    		instance_mapname("1@tower"),
    		instance_npcname("#1F Controller")+"::OnMyMobDead"; // This is the function calling the death event of the monster..
    	end;
    
    OnMyMobDead: // This one should trigger.
    	set .@map$, instance_mapname("1@tower");
    	set .@mob_dead_num,mobcount(.@map$,instance_npcname("#1F Controller")+"::OnMyMobDead");
    
    	/* ***************************************************
    		This is where you can add your script posted above
    		I modified it abit so it wont stop the script
    		from functioning.
    	   *************************************************** */
    	if ( killedrid == 31000 ) {
            if ( getcharid(1) ) {
                getpartymember getcharid(1), 1;
                getpartymember getcharid(1), 2;
                for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
                    if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
                        .@partymemberaid[.@c] = $@partymemberaid[.@i];
                        .@c++;
                    }
                }
                if (rand(100) < 10)
                    getitem F_Rand(45006,45007,45008,45009,45010,45011), 1, .@partymemberaid[ rand( .@c ) ];
                announce "Party ["+ strcharinfo(1) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
            } else {
                if (rand(100) < 10)
                    getitem F_Rand(45006,45007,45008,45009,45010,45011), 1;
                announce "El jugador ["+ strcharinfo(0) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
            }
        }
    
    	if (.@mob_dead_num < 1) {
    		initnpctimer;
    		//SetItemPartyInMap in_102floor 1
    	} else
    		mapannounce .@map$, "Remaining Monsters on the 1st Level - "+.@mob_dead_num,bc_map,"0x00ff99";
    	end;
    
    OnTimer5000:
    	mapannounce instance_mapname("1@tower"), "All Monsters on the 1st Level have been defeated.",bc_map,"0xffff00";
    	donpcevent instance_npcname("1FGate102tower")+"::OnEnable";
    	stopnpctimer;
    	end;
    }

     

    108 / 5,000

    Resultados de traducción

    Traducción

    star_border

    I must add it there or at the level that I need it an example as I tried to do it before and it didn't work either

    4@tower,29,365,2	script	Immortal Furnace#3	844,{
    	end;
    
    OnInstanceInit:
    	callfunc "F_Tower_Monster",
    		76,
    		instance_mapname("4@tower"),
    		instance_npcname("Immortal Furnace#3")+"::OnMyMobDead";
    	end;
    
    OnMyMobDead:
    	set .@map$, instance_mapname("4@tower");
    	set .@mob_dead_num,mobcount(.@map$,instance_npcname("Immortal Furnace#3")+"::OnMyMobDead");
    		if ( killedrid == 31000 ) {
            if ( getcharid(1) ) {
                getpartymember getcharid(1), 1;
                getpartymember getcharid(1), 2;
                for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
                    if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
                        .@partymemberaid[.@c] = $@partymemberaid[.@i];
                        .@c++;
                    }
                }
                if (rand(100) < 10)
                    getitem F_Rand(45006,45007,45008,45009,45010,45011), 1, .@partymemberaid[ rand( .@c ) ];
                announce "Party ["+ strcharinfo(1) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
            } else {
                if (rand(100) < 10)
                    getitem F_Rand(45006,45007,45008,45009,45010,45011), 1;
                announce "El jugador ["+ strcharinfo(0) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
            }
        }
    	if (.@mob_dead_num < 1) {
    		initnpctimer;
    		//SetItemPartyInMap in_102floor 76
    	}
    	else
    		mapannounce .@map$,"Monstruos restantes en el nivel 76 - " + .@mob_dead_num,bc_map,"0x00ff99";
    	end;
    
    OnTimer5000:
    	mapannounce instance_mapname("4@tower"),"Todos los monstruos del nivel 76 han sido derrotados.",bc_map,"0xffff00";
    	donpcevent instance_npcname("76FGate102tower")+"::OnEnable";
    	stopnpctimer;
    	end;
    } 

     

  12. Hi, Rathena, I have a question. I want to make an mvp of an item drop randomly when you kill it in endless tower on the 80th floor. I'm trying to add a script but I don't know how to make it work. This is the script I want to add.

     

    endless:

        case 80:
            areamonster .@map$,352,351,362,387,"Blue Ifrit Shadow",31000,1,.@label$;
            break;

    my script:

    -	script	ifrit	-1,{
    OnNPCKillEvent:
    if ( killedrid != 31000 ) end;
    if ( getcharid(1) ) {
    	getpartymember getcharid(1), 1;
    	getpartymember getcharid(1), 2;
    	for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    		if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) { // what happens if someone in the party member is offline =/
    			.@partymemberaid[.@c] = $@partymemberaid[.@i];
    			.@c++;
    		}
    	}
    	if (rand(100) < 10)
    		getitem F_Rand(45006,45007,45008,45009,45010,45011), 1, .@partymemberaid[ rand( .@c ) ];
    	announce "Party ["+ strcharinfo(1) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
    }
    else {
    	if (rand(100) < 10)
    		getitem F_Rand(45006,45007,45008,45009,45010,45011), 1;
    	announce "El jugador ["+ strcharinfo(0) +"] ha matado "+ getmonsterinfo( killedrid, MOB_NAME ) +" en "+ strcharinfo(3), 0;
    }
    end;
    } 

     

  13. Hi, Rathena, I need your help. I'm trying to limit a card that is only 2 can be equipped, and when more than 2 are equipped, the card bonus is nullified if you equip more than 2.

        Script: |
         if(isequippedcnt(4457) == 2)
          bonus2 bAddRace,RC_DemiHuman,30;
          bonus2 bAddRace,RC_Player_Human,30;
         if(isequippedcnt(4457) > 2) message strcharinfo(0),"Solo puedes equipar 2x "+getitemname(4457)+"! Tarjeta (s) adicional (es) ha sido deshabilitada.";

  14. On 5/1/2023 at 3:57 PM, joecalis said:

    The one I quoted, replace all of that with this:
     

    	case RG_BACKSTAP:
    		{
    			uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl);
    
    			if (!check_distance_bl(src, bl, 0) || bl->type == BL_SKILL) {
    				status_change_end(src, SC_HIDING, INVALID_TIMER);
    				dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
    				unit_setdir(bl,dir);
    				skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
    			}
    			else if (sd)
    				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
    		}
    		break;

     

    still not working  ?

  15. 5 minutes ago, joecalis said:

    en tu skill.cpp busca todo el " case RG_BACKSTAP : " copia todo hasta el " break ; " y pega todos los códigos aquí, tal vez esté revisando la dirección en otro lugar.

    	case RG_BACKSTAP:
    		{
    			if (!check_distance_bl(src, bl, 0)) {
    #ifdef RENEWAL
    				uint8 dir = map_calc_dir(src, bl->x, bl->y);
    				short x, y;
    
    				if (dir > 0 && dir < 4)
    					x = -1;
    				else if (dir > 4)
    					x = 1;
    				else
    					x = 0;
    
    				if (dir > 2 && dir < 6)
    					y = -1;
    				else if (dir == 7 || dir < 2)
    					y = 1;
    				else
    					y = 0;
    
    				if (battle_check_target(src, bl, BCT_ENEMY) > 0 && unit_movepos(src, bl->x + x, bl->y + y, 2, true)) { // Display movement + animation.
    #else
    				uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl);
    
    				if (bl->type == BL_SKILL) { // Changed Here (Removed Direction Check)
    #endif
    					status_change_end(src, SC_HIDING, INVALID_TIMER);
    					dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
    					unit_setdir(bl,dir);
    #ifdef RENEWAL
    					clif_blown(src);
    #endif
    					skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
    				}
    				else if (sd)
    					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
    			}
    		}
    		break;

     

    This is the one that changed but the skill stopped working so I returned it to how it is, that is, like this

    	case RG_BACKSTAP:
    		{
    			if (!check_distance_bl(src, bl, 0)) {
    #ifdef RENEWAL
    				uint8 dir = map_calc_dir(src, bl->x, bl->y);
    				short x, y;
    
    				if (dir > 0 && dir < 4)
    					x = -1;
    				else if (dir > 4)
    					x = 1;
    				else
    					x = 0;
    
    				if (dir > 2 && dir < 6)
    					y = -1;
    				else if (dir == 7 || dir < 2)
    					y = 1;
    				else
    					y = 0;
    
    				if (battle_check_target(src, bl, BCT_ENEMY) > 0 && unit_movepos(src, bl->x + x, bl->y + y, 2, true)) { // Display movement + animation.
    #else
    				uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl);
    
    				if (!map_check_dir(dir, t_dir) || bl->type == BL_SKILL) {
    #endif
    					status_change_end(src, SC_HIDING, INVALID_TIMER);
    					dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
    					unit_setdir(bl,dir);
    #ifdef RENEWAL
    					clif_blown(src);
    #endif
    					skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
    				}
    				else if (sd)
    					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
    			}
    		}
    		break;

    and I have the other one like this but that one did not change anything, it was the first one to change

     

    		case RG_BACKSTAP:
    			{
    				if (check_distance_bl(src, target, 0))
    					return USESKILL_FAIL_MAX;
    			}
    			break;

     

  16. 9 hours ago, joecalis said:

    Try this:

    	case RG_BACKSTAP:
    		{
    			if (!check_distance_bl(src, bl, 0)) {
    #ifdef RENEWAL
    				uint8 dir = map_calc_dir(src, bl->x, bl->y);
    				short x, y;
    
    				if (dir > 0 && dir < 4)
    					x = -1;
    				else if (dir > 4)
    					x = 1;
    				else
    					x = 0;
    
    				if (dir > 2 && dir < 6)
    					y = -1;
    				else if (dir == 7 || dir < 2)
    					y = 1;
    				else
    					y = 0;
    
    				if (battle_check_target(src, bl, BCT_ENEMY) > 0 && unit_movepos(src, bl->x + x, bl->y + y, 2, true)) { // Display movement + animation.
    #else
    				uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl);
    
    				if (bl->type == BL_SKILL) { // Changed Here (Removed Direction Check)
    #endif
    					status_change_end(src, SC_HIDING, INVALID_TIMER);
    					dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
    					unit_setdir(bl,dir);
    #ifdef RENEWAL
    					clif_blown(src);
    #endif
    					skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
    				}
    				else if (sd)
    					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
    			}
    		}
    		break;

     

    it didn't work ?

  17. 6 hours ago, joecalis said:

    Your server setting might be in Renewal, it's like that by default. If you want to change it

    Find:

    				case RG_BACKSTAP:
    						{
    #ifndef RENEWAL
    								uint8 dir = map_calc_dir(src,target->x,target->y), t_dir = unit_getdir(target);
    
    								if (map_check_dir(dir, t_dir))
    									return USESKILL_FAIL_MAX;
    #endif
    
    								if (check_distance_bl(src, target, 0))
    									return USESKILL_FAIL_MAX;
    						}
    						break;

    Change to:

    				case RG_BACKSTAP:
    						{
    								if (check_distance_bl(src, target, 0))
    									return USESKILL_FAIL_MAX;
    						}
    						break;

     

    Hello, my server is pre-renewal and this is the only line that I can find the change for the second one that you sent me?

     

     

     

    	case RG_BACKSTAP:
    		{
    			if (!check_distance_bl(src, bl, 0)) {
    #ifdef RENEWAL
    				uint8 dir = map_calc_dir(src, bl->x, bl->y);
    				short x, y;
    
    				if (dir > 0 && dir < 4)
    					x = -1;
    				else if (dir > 4)
    					x = 1;
    				else
    					x = 0;
    
    				if (dir > 2 && dir < 6)
    					y = -1;
    				else if (dir == 7 || dir < 2)
    					y = 1;
    				else
    					y = 0;
    
    				if (battle_check_target(src, bl, BCT_ENEMY) > 0 && unit_movepos(src, bl->x + x, bl->y + y, 2, true)) { // Display movement + animation.
    #else
    				uint8 dir = map_calc_dir(src, bl->x, bl->y), t_dir = unit_getdir(bl);
    
    				if (!map_check_dir(dir, t_dir) || bl->type == BL_SKILL) {
    #endif
    					status_change_end(src, SC_HIDING, INVALID_TIMER);
    					dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
    					unit_setdir(bl,dir);
    #ifdef RENEWAL
    					clif_blown(src);
    #endif
    					skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
    				}
    				else if (sd)
    					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
    			}
    		}
    		break;

     

  18. On 9/29/2018 at 3:03 PM, eirwanda said:

    Hi, i have sometrouble on my highrate server its level 500 server

    when i reached max level, it give 522 Hit and 522+0 Flee 

    i want it only a quarter 

    is that possible??

     

    change:

    	// Flee
    	stat = status->flee;
    	stat += level + status->agi;
    	status->flee = cap_value(stat, 1, SHRT_MAX);

    to:

    	// Flee
    	stat = status->flee;
    	stat += level/2 + status->agi;
    	status->flee = cap_value(stat, 1, SHRT_MAX);

    Hit

    change:

    	// Hit
    	stat = status->hit;
    	stat += level + status->dex;
    	status->hit = cap_value(stat, 1, SHRT_MAX);

    To:

    	// Hit
    	stat = status->hit;
    	stat += level/2 + status->dex;
    	status->hit = cap_value(stat, 1, SHRT_MAX);

     

  19. 21 hours ago, Notorius said:

    Hello, thank you very much, it worked perfectly. I have one more question, how do I reduce the bonus of the flee and the hit that is added from the base level? Let me explain my server is a max blvl 500 server and just for that reason it already gives me 500 hit and 500 flee how do I change this in half?

    https://prnt.sc/jNOo350bVXFD

    resolved as follows lower it by 50%. sorry I'm still learning

     

     

    	// Flee
    	stat = status->flee;
    	stat += level/2 + status->agi/2;
    	status->flee = cap_value(stat, 1, SHRT_MAX);

     

  20. 13 hours ago, Playtester said:

    I would assume in status.cpp:

    void status_calc_misc(struct block_list *bl, struct status_data *status, int level)

    	// Flee
    	stat = status->flee;
    	stat += level + status->agi;
    	status->flee = cap_value(stat, 1, SHRT_MAX);

    Change formula to whatever you want. 50% AGI would be:

    	// Flee
    	stat = status->flee;
    	stat += level + status->agi/2;
    	status->flee = cap_value(stat, 1, SHRT_MAX);

    Luk does not increase flee in pre-renewal anyway. Perfect flee you find as Flee2.

    Hello, thank you very much, it worked perfectly. I have one more question, how do I reduce the bonus of the flee and the hit that is added from the base level? Let me explain my server is a max blvl 500 server and just for that reason it already gives me 500 hit and 500 flee how do I change this in half?

    https://prnt.sc/jNOo350bVXFD

×
×
  • Create New...