Notorius
-
Posts
106 -
Joined
-
Last visited
Content Type
Profiles
Forums
Downloads
Jobs Available
Server Database
Third-Party Services
Top Guides
Store
Crowdfunding
Posts posted by Notorius
-
-
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; }
-
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; }
-
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);
-
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.
-
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
-
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; }
-
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
I'm not sure but maybe I need to give permissions like this
-
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
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
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++; } } }
-
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
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
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++; } } }
-
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?
-
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; }
-
On 5/24/2023 at 9:44 AM, pajodex said:
add the script on the label itself on endless tower script otherwise it wont be called
could you give me an example?
-
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; }
-
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."; -
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
-
On 2/1/2021 at 8:06 PM, qtdan said:
I'm wondering whats wrong when equiping the GTB Card the soul linker can cast the ESTUN but can't follow with ESMA, but it works perfectly when the soul linker doesn't have a GTB. how to fix this problem?
TIA.
https://github.com/rathena/rathena/pull/6562/commits/4e9e59712f216c73c4b5f4c4cdfac85291f5ce2a
-
any solution?
-
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;
-
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
-
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;
-
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);
-
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?
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);
-
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?
-
1 hour ago, LadyNanuia said:
You dont have to be behind to use it..
I think if it should be behind the target or in the case of my emulator if it should be behind I don't know how to edit it so that it works from any direction
Release: Extended Vending 2.0
in Source Releases
Posted
I used this from a user who uploaded it a little higher
Extend Vending 1.7.0.diff