-
Posts
2044 -
Joined
-
Last visited
-
Days Won
51
Content Type
Profiles
Forums
Downloads
Jobs Available
Server Database
Third-Party Services
Top Guides
Store
Crowdfunding
Everything posted by AnnieRuru
-
I know about the Tarot Card of Fate event script but its too similar to Roulette script isn't it ? you just sit there AFK, and just wait for the npc to cast the skill effect on you its a very boring event and when I made the Russian Roulette script, I couldn't exactly make it happen having a last survivor at 3 rounds the npc just randomly shot someone dead in 1/6 chance Tarot Card of Fate have 14 cards, but only 3 of them dealing damage - The Chariot , The Devil, The Tower, not exactly killing them either
-
no more edit ? ok time to reply this topic Emperium is spawn by *monster script command, the event label indicate the execution of the specific label in WOE:FE is OnAgitBreak, so just add donpcevent to the custom label that you have changed from OnClock0001: castle can be conquered when there are no owner, and that's official so for example, if the guild owns a guild castle and disband the guild, other guild can immediately rush into the castle can claim ownership right away custom stuff, monster do not level up officially however there is a custom mod, which already in the repo conf/battle/monster.conf // Monsters level up (monster will level up each time a player is killed and they will grow stronger) // Exp rate is calculated ((monster level-original monster level)*(exp*(mobs_level_up_exp rate/100))) // NOTE: Does not apply to WoE Guardians. mobs_level_up: no mobs_level_up_exp_rate: 1 reading the code, it seems only give extra experience gain for the player ... though if you want to make monster tougher, maybe you can play around with this exactly and you long long post about batk/watk/matk stuff, just forget about it, this renewal and pre-renewal stuff actually break it, a similar question also pop up in hercules, I also dunno how to solve it http://herc.ws/board/topic/16580-how-to-make-matk-1-in-status_calc_pc_/ anyway, change the base stats first, then its custom calculation comes later prontera,155,185,5 script skdfjhsfkj 1_F_MARIA,{ monster "this",-1,-1, "--ja--",1002,1, ""; // change the base stat 1st setunitdata $@mobid, UMOB_STR, 200; setunitdata $@mobid, UMOB_DEX, 200; setunitdata $@mobid, UMOB_INT, 200; setunitdata $@mobid, UMOB_LUK, 200; setunitdata $@mobid, UMOB_AGI, 200; setunitdata $@mobid, UMOB_VIT, 200; // change the calculation later setunitdata $@mobid, UMOB_MAXHP, 10000000; setunitdata $@mobid, UMOB_HP, 10000000; setunitdata $@mobid, UMOB_ATKMIN, 1; setunitdata $@mobid, UMOB_ATKMAX, 1; setunitdata $@mobid, UMOB_HIT, 1000; end; } novice castles https://github.com/rathena/rathena/blob/master/db/castle_db.txt#L35-L38 you can make your own woe castle script btw https://annieruru.blogspot.com/2019/01/how-to-create-your-own-woe-castle-map.html
-
I saw this script before on eathena forum, yeah, that's how old it is prontera.gat,255,77,3 script 初级道场 734,{ if (!sleep2(1000)) end; } that's how you get the same error honestly just ditch this script and use instance system already
-
https://rathena.org/board/profile/8685-annieruru/?status=4450&type=status ROFL ... post on my profile the answer is no, the client doesn't understand what is <tab> means perhaps need to make a diff client to make client understand <tab>
-
access only 3rd class for change dress npc
AnnieRuru replied to domez86's question in Script Requests
you have 3 topics about 3rd class ... prontera,147,174,5 script Change Dress 509,{ mes "[Armando]"; if ( !(eaclass() & EAJL_THIRD) || BaseJob == Job_SuperNovice ) { mes "I'm sorry, but you do not have 3rd class."; close; } mes "Hi "+strcharinfo(0)+" do you want to change your dress?"; next; if ( prompt( "Primary Dress", "Second Dress" ) == 255 ) { mes "[Kasondra]"; // why keep changing name ? mes "Goodbye."; close; } setlook LOOK_BODY2, @menu -1; mes "Done!"; close; } -
Random option is entirely server side prontera,155,185,5 script skjhsdfkj 1_F_MARIA,{ setarray .@OptID[0],RDMOPT_VAR_ATTPOWER; setarray .@OptVal[0],10; setarray .@OptParam[0],0; getitem3 1501, 1,1,0,0, 0,0,0,0, .@OptID,.@OptVal,.@OptParam; setarray .@OptVal[0],100; getitem3 1501, 1,1,0,0, 0,0,0,0, .@OptID,.@OptVal,.@OptParam; setarray .@OptVal[0],1000; getitem3 1501, 1,1,0,0, 0,0,0,0, .@OptID,.@OptVal,.@OptParam; end; } the ATK+100 is manipulable
-
I already lost count how many times I have been using getinventorylist this month ... function script F_MesItemInfo { .@item = getarg(0); .@itemname$ = getitemname(.@item); if (.@itemname$ == "null") .@itemname$ = "Unknown Item"; if (PACKETVER >= 20150729) return sprintf("<ITEM>%s<INFO>%d</INFO></ITEM>", .@itemname$, .@item); else if (PACKETVER >= 20130130) return sprintf("<ITEMLINK>%s<INFO>%d</INFO></ITEMLINK>", .@itemname$, .@item); else return .@itemname$; } prontera,155,185,5 script jdshfjsdfh 1_F_MARIA,{ getinventorylist; for ( .@i = 0; .@i < @inventorylist_count; ++.@i ) { if ( inarray(.itemlist, @inventorylist_id[.@i] ) >= 0 ) { .@itemid[.@c++] = @inventorylist_id[.@i]; .@menu$ += getitemname( @inventorylist_id[.@i] ) +":"; } } if ( !.@c ) { mes "You don't have any ticket on you"; close; } .@s = select( .@menu$ ) -1; mes "You have selected "+ F_MesItemInfo(.@itemid[.@s]); close; OnInit: setarray .itemlist, 909,910,911,912, 34993,34994,34995,34996; end; }
-
src/map/skill.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 1864faeec..92a79e3e9 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -18026,8 +18026,8 @@ struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, int x // Perform oninit actions switch (group->skill_id) { case WZ_ICEWALL: - map_setgatcell(unit->bl.m,unit->bl.x,unit->bl.y,5); - clif_changemapcell(0,unit->bl.m,unit->bl.x,unit->bl.y,5,AREA); + map_setgatcell(unit->bl.m,unit->bl.x,unit->bl.y,1); + clif_changemapcell(0,unit->bl.m,unit->bl.x,unit->bl.y,1,AREA); skill_unitsetmapcell(unit,WZ_ICEWALL,group->skill_lv,CELL_ICEWALL,true); break; case SA_LANDPROTECTOR: answer is change gat type 5 into gat type 1 because the map_get2cell function say so .. in src\map\map.cpp // gat system inline static struct mapcell map_gat2cell(int gat) { struct mapcell cell; memset(&cell,0,sizeof(struct mapcell)); switch( gat ) { case 0: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // walkable ground case 1: cell.walkable = 0; cell.shootable = 0; cell.water = 0; break; // non-walkable ground case 2: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // ??? case 3: cell.walkable = 1; cell.shootable = 1; cell.water = 1; break; // walkable water case 4: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // ??? case 5: cell.walkable = 0; cell.shootable = 1; cell.water = 0; break; // gap (snipable) case 6: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // ??? default: ShowWarning("map_gat2cell: unrecognized gat type '%d'\n", gat); break; } return cell; }
- 1 reply
-
- 1
-
-
100% scripting btw scripting is my absolute strong point https://irowiki.org/wiki/War_of_Emperium#Benefits - script ksdjfs FAKE_NPC,{ OnMinute00: for ( .@i = 0; .@i < 20; ++.@i ) { if ( getcastledata( .castle$[.@i], CD_GUILD_ID ) ) { if ( rand(100) < 50 ) { // 50% chance setcastledata .castle$[.@i], CD_GUILD_ID, 0; donpcevent "Agit#"+ .castle$[.@i] +"::OnStartArena"; } } else { if ( rand(100) < 50 ) // 50% chance setcastledata .castle$[.@i], CD_CURRENT_ECONOMY, getcastledata( .castle$[.@i], CD_CURRENT_ECONOMY ) - 5; } } end; OnInit: setarray .castle$[0], "aldeg_cas01","aldeg_cas02","aldeg_cas03","aldeg_cas04","aldeg_cas05", "gefg_cas01","gefg_cas02","gefg_cas03","gefg_cas04","gefg_cas05", "payg_cas01","payg_cas02","payg_cas03","payg_cas04","payg_cas05", "prtg_cas01","prtg_cas02","prtg_cas03","prtg_cas04","prtg_cas05"; end; } npc/guild/agit_main.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt index c2925487c..964e701fb 100644 --- a/npc/guild/agit_main.txt +++ b/npc/guild/agit_main.txt @@ -1135,8 +1135,8 @@ OnClock0001: set .@GID, GetCastleData(strnpcinfo(2),CD_GUILD_ID); - // If there is no owner, do nothing. - if (!.@GID) end; + // only spawn treasure chest when there is no owner + if (.@GID) end; // Is there Economy in this castle? set .@Treasure,GetCastleData(strnpcinfo(2),CD_CURRENT_ECONOMY)/5+4; npc/guild/agit_main.txt | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt index c2925487c..abe5c3cda 100644 --- a/npc/guild/agit_main.txt +++ b/npc/guild/agit_main.txt @@ -657,22 +657,18 @@ OnRecvCastle: else if ((.@Economy >= 86) && (.@Economy <= 90)) { set .@eco_invest,770000; } else if ((.@Economy >= 91) && (.@Economy <= 95)) { set .@eco_invest,860000; } else if ((.@Economy >= 96) && (.@Economy <= 100)) { set .@eco_invest,955000; } - //Quadruple the cost of investing if you've already invested once. - if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY)) { - set .@eco_invest,.@eco_invest*4; - } mes "["+strnpcinfo(1)+"]"; mes "If you invest in commercial growth, the quantity of goods made by the guild will increase. Therfore, if you consider our future, investments will be a necessity."; mes " "; - mes "Initially, you are able to invest just once but if you pay more money, you will be able to invest twice."; + mes "You are able to invest just once."; if (.@Economy >= 100) { mes " "; mes "^ff0000The commercial growth level of our Castle is at it's highest, 100%. No more investments are needed. Just as I have expected from a great economist like you, Master.^000000"; close; } - if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY) >= 2) { + if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY) >= 1) { mes " "; - mes "^ff0000You have already invested twice today. You cannot invest any more.^000000 I expect riches of the guild to grow at a high rate."; + mes "^ff0000You have already invested today. You cannot invest any more.^000000 I expect riches of the guild to grow at a high rate."; close; } if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY) == 0) { npc/guild/agit_main.txt | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt index c2925487c..fd76a0582 100644 --- a/npc/guild/agit_main.txt +++ b/npc/guild/agit_main.txt @@ -177,17 +177,57 @@ OnRecvCastle: if (compare(strnpcinfo(2),"aldeg")) { // Normal Spawns monster strnpcinfo(2),0,0,"Evil Druid",1117,10; + for ( .@i = 0; .@i < 10; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1117, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1117, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Khalitzburg",1132,4; + for ( .@i = 0; .@i < 4; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1132, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1132, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Abysmal Knight",1219,2; + for ( .@i = 0; .@i < 2; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1219, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1219, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Executioner",1205,1; + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1205, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1205, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; monster strnpcinfo(2),0,0,"Penomena",1216,10; + for ( .@i = 0; .@i < 10; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1216, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1216, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Alarm",1193,18; + for ( .@i = 0; .@i < 18; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1193, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1193, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Clock",1269,9; + for ( .@i = 0; .@i < 9; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1269, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1269, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Raydric Archer",1276,7; + for ( .@i = 0; .@i < 7; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1276, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1276, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Wanderer",1208,3; + for ( .@i = 0; .@i < 3; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1208, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1208, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + } monster strnpcinfo(2),0,0,"Alice",1275,1; + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1275, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1275, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; monster strnpcinfo(2),0,0,"Bloody Knight",1268,1; + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1268, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1268, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; monster strnpcinfo(2),0,0,"Dark Lord",1272,1; + setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1272, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; + setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1272, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; // Set Emperium room spawn coordinates and spawn monsters. if (strnpcinfo(2) == "aldeg_cas01") { setarray .@emproom[0],216,23; } else if (strnpcinfo(2) == "aldeg_cas02") { setarray .@emproom[0],213,23; } lazy to do the rest ... anyway you get the point disable the npc/guild/agit_controller.txt file and use this - script ksdjfs FAKE_NPC,{ OnInit: agitstart; end; } npc/guild/agit_main.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt index c2925487c..d979649fa 100644 --- a/npc/guild/agit_main.txt +++ b/npc/guild/agit_main.txt @@ -769,6 +769,8 @@ OnRecvCastle: } case 4: mes "["+strnpcinfo(1)+"]"; + mes "Summon a Guardian is disabled"; + close; mes "Will you summon a Guardian? It'll be a protector to defend us loyally."; mes "Please select a guardian to defend us."; next; for me, it is easy as 1 2 3 , A B C npc/guild/agit_main.txt | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt index c2925487c..133012e87 100644 --- a/npc/guild/agit_main.txt +++ b/npc/guild/agit_main.txt @@ -177,17 +177,45 @@ OnRecvCastle: if (compare(strnpcinfo(2),"aldeg")) { // Normal Spawns monster strnpcinfo(2),0,0,"Evil Druid",1117,10; + for ( .@i = 0; .@i < 10; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Khalitzburg",1132,4; + for ( .@i = 0; .@i < 4; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Abysmal Knight",1219,2; + for ( .@i = 0; .@i < 2; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Executioner",1205,1; + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; monster strnpcinfo(2),0,0,"Penomena",1216,10; + for ( .@i = 0; .@i < 10; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Alarm",1193,18; + for ( .@i = 0; .@i < 18; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Clock",1269,9; + for ( .@i = 0; .@i < 9; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Raydric Archer",1276,7; + for ( .@i = 0; .@i < 7; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Wanderer",1208,3; + for ( .@i = 0; .@i < 3; ++.@i ) { + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; + } monster strnpcinfo(2),0,0,"Alice",1275,1; + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; monster strnpcinfo(2),0,0,"Bloody Knight",1268,1; + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; monster strnpcinfo(2),0,0,"Dark Lord",1272,1; + setunitdata $@mobid[.@i], UMOB_LEVEL, 99; // Set Emperium room spawn coordinates and spawn monsters. if (strnpcinfo(2) == "aldeg_cas01") { setarray .@emproom[0],216,23; } else if (strnpcinfo(2) == "aldeg_cas02") { setarray .@emproom[0],213,23; } change all monsters to level 99 yes, 1. it happens to be using agitstart2 ... 2. use npc\guild2 folder ... 3. rathena also has woe training edition ... btw you ask too many question at once
-
apparently, just have to apply that line AFTER the guild_payexp and pc_calcexp function ... fixed src/map/pc.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 5aace7ecb..4fb097b61 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -6719,6 +6719,13 @@ void pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned in if (!(exp_flag&2)) pc_calcexp(sd, &base_exp, &job_exp, src); + if ( !(exp_flag & 1) ) { + if ( sd->status.base_level >= 5 ) + base_exp = 0; + if ( sd->status.job_level >= 5 ) + job_exp = 0; + } + nextb = pc_nextbaseexp(sd); nextj = pc_nextjobexp(sd); btw, there are 2 elysium ?
-
setunitdata doesn't change normal mob to boss?
AnnieRuru replied to rongmauhong's question in Scripting Support
4140,Knight_Of_Abyss_Card,Abysmal Knight Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddClass,Class_Boss,25; },{},{} * Class (c) Class_Normal, Class_Boss, Class_Guardian, Class_All case SP_ADDCLASS: // bonus2 bAddClass,c,x; PC_BONUS_CHK_CLASS(type2,SP_ADDCLASS); if(!sd->state.lr_flag || sd->state.lr_flag == 3) sd->right_weapon.addclass[type2]+=val; else if(sd->state.lr_flag == 1) sd->left_weapon.addclass[type2]+=val; else if(sd->state.lr_flag == 2) sd->arrow_addclass[type2]+=val; break; answer is no ... since rathena changed the monster mode, there are no field for setunitdata to modify a monster into Class_Boss mode unless ... well ... make an issue in rathena github- 1 reply
-
- 1
-
-
1. cell blocking ... already said there .. https://rathena.org/board/topic/118069-war-event-watcher-request/?do=findComment&comment=356824 change "official_cell_stack_limit" then "@reloadbattleconf" 2. for emotion ... not going to do this openly ... want to start concentrate more on hercules ... so hope you can get someone else to help, or buy this mod
-
yeah its too old, needs a complete revamp ... src/custom/script.inc | 20 ++++++++++++++++++++ src/custom/script_def.inc | 3 +++ src/map/clif.cpp | 2 +- src/map/pc.cpp | 2 +- src/map/pc.hpp | 2 ++ 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/custom/script.inc b/src/custom/script.inc index 839b990cb..0e8751707 100644 --- a/src/custom/script.inc +++ b/src/custom/script.inc @@ -17,3 +17,23 @@ // script_pushint(st,1); // return 0; //} + +BUILDIN_FUNC(pcblockchat) { + struct map_session_data *sd = map_id2sd( script_getnum(st,2) ); + if ( !sd ) { + ShowWarning( "buildin_pcblockchat: Couldn't find RID '%d'\n", script_getnum(st,2) ); + return SCRIPT_CMD_FAILURE; + } + sd->state.blockedchat = script_getnum(st,3) > 0; + return SCRIPT_CMD_SUCCESS; +} + +BUILDIN_FUNC(pcblockattack) { + struct map_session_data *sd = map_id2sd( script_getnum(st,2) ); + if ( !sd ) { + ShowWarning( "buildin_pcblockattack: Couldn't find RID '%d'\n", script_getnum(st,2) ); + return SCRIPT_CMD_FAILURE; + } + sd->state.blockedattack = script_getnum(st,3) > 0; + return SCRIPT_CMD_SUCCESS; +} diff --git a/src/custom/script_def.inc b/src/custom/script_def.inc index 886399273..63e683e82 100644 --- a/src/custom/script_def.inc +++ b/src/custom/script_def.inc @@ -9,3 +9,6 @@ **/ //BUILDIN_DEF(example,""), + +BUILDIN_DEF(pcblockchat,"ii"), +BUILDIN_DEF(pcblockattack,"ii"), diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 72a596a25..d8631a6fc 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -10110,7 +10110,7 @@ static bool clif_process_message(struct map_session_data* sd, bool whisperFormat if( is_atcommand( fd, sd, out_message, 1 ) ) return false; - if (sd->sc.cant.chat) + if (sd->sc.cant.chat || sd->state.blockedchat) return false; //no "chatting" while muted. if( battle_config.min_chat_delay ) { //[Skotlex] diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 5aace7ecb..7a9bce86e 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -9106,7 +9106,7 @@ bool pc_candrop(struct map_session_data *sd, struct item *item) bool pc_can_attack( struct map_session_data *sd, int target_id ) { nullpo_retr(false, sd); - if( pc_is90overweight(sd) || pc_isridingwug(sd) ) + if( pc_is90overweight(sd) || pc_isridingwug(sd) || sd->state.blockedattack ) return false; if( sd->sc.data[SC_BASILICA] || diff --git a/src/map/pc.hpp b/src/map/pc.hpp index ea5465bc8..9bcc01a88 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -256,6 +256,8 @@ struct map_session_data { unsigned int night :1; //Holds whether or not the player currently has the SI_NIGHT effect on. [Skotlex] unsigned int using_fake_npc :1; unsigned int rewarp :1; //Signals that a player should warp as soon as he is done loading a map. [Skotlex] + unsigned int blockedattack : 1; + unsigned int blockedchat : 1; unsigned int killer : 1; unsigned int killable : 1; unsigned int doridori : 1; prontera,153,178,4 script GvGPvP Watcher 414,{ if ( select ( "go to pvp", "spectator" ) == 2 ) { pcblockchat getcharid(3), true; pcblockattack getcharid(3), true; pcblockskill getcharid(3), true; setoption Option_Invisible, true; } warp "pvp_y_2-1",0,0; end; OnPCLogoutEvent: setoption Option_Invisible, false; end; } pvp_y_2-1 mapflag pvp pvp_y_2-1 mapflag nowarp pvp_y_2-1 mapflag nowarpto pvp_y_2-1 mapflag nosave SavePoint btw rathena developer still didn't do anything about that pull request ... https://github.com/rathena/rathena/pull/3209
-
I actually made one in hercules http://herc.ws/board/topic/11587-maxlvexpgain/ the above post ... exactly the same as my version 1.0, that means will have 2 bugs I mentioned in version 1.1 1. cannot pay guild tax exp 2. you actually gain 1 base exp and 1 job exp because of the cap value in pc_calcexp function you have to fix these 2 ...
-
OnMinute00: if ( gettime(DT_HOUR) % 2 ) end; change into OnMinute00: OnMinute30:
-
- script jksfhksjdf FAKE_NPC,{ OnInit: $malaya_pintados_00 = 1; donpcevent "Pintados Manager#pin::OnEnable"; // donpcevent "Pintados Manager#pin::OnEnableNPC"; // initnpctimer "Pintados Manager#pin"; end; } assuming you have your server maintenance every week
-
NPC:Scriptcont: unexpected state '2' for continue call.
AnnieRuru replied to LearningRO's question in Scripting Support
I think rathena *progressbar is currently broken ... I kinda remember my arathi basin script, which also uses progressbar to turn the flag to your side ... at the time making the script, tested on rathena -> I can move to simply cancel the progress tested on hercules -> I can't move, have to get hit from something so to answer your question, in hercules, once the progressbar start, there is no way to cancel it other than 1. get hit 2. warp if trying to use skill while *progressbar, its the same as rathena Any work in progress (NPC dialog, manufactoring ... ) quit and try again -
NPC:Scriptcont: unexpected state '2' for continue call.
AnnieRuru replied to LearningRO's question in Scripting Support
in Hercules, I can't move my character while the bar progress -
just give my 2 cents ... change the SC_ ... into OPTION_ ... means code a new OPTION_ ... something like that ... I'm out
-
How to find nearest enemy/obtain a list of units on the same map, etc...
AnnieRuru replied to Seravy's question in Source Support
there are 2 path-finding bug I'm currently aware of ... in rathena 1. if you ask me when rathena implement the unitwalk with event labels https://github.com/rathena/rathena/commit/730311e009c8078ecc21f679c425de944b293faf#diff-5961416799718de4529b20c1de23b440R6970 it was 3~4 years ago and if they have to change the path-finding to implement this ... event label, then its clearly has been broken before that commit 2. or maybe the problem you are addressing is ... prontera,147,174,5 script asdfasdf 402,{ warp "prontera",155,185; } click on this npc, and you walk to npc despite there is no unitwalk script command ... if you are talking about this, this bug also happens on Hercules, this one I have no idea how to fix and sorry, I also not having enough knowledge to fix either of these .... and... I think this is a bug, definitely not happen on official server EDIT: Provoke is mainly use to lower the DEF of monsters, because of risking making the monster ATK higher, this skill is situational ... mainly use on high DEF and low ATK low HIT monsters -
[Error]: buildin_delitem2: failed to delete 1 items
AnnieRuru replied to CyberDevil's question in Scripting Support
utofaery is correct, my script uses getitem2 actually shows which item I got, You got Lucky Vital Hard Dexterous Knife [3] (1) You got +3 Quadruple Lucky Knife [4] (1) and using identifyall script command only shows Item Appraisal has completed successfully Item Appraisal has completed successfully identifyall script command .... unique to rathena ... check I not really sure how players gets random option equipment officially ... though I thought this system is custom .... there is no getitem3 anywhere in rathena npc folder... although we just kinda make emulator supports it -
How to find nearest enemy/obtain a list of units on the same map, etc...
AnnieRuru replied to Seravy's question in Source Support
1. if the weapon is broken, and use *repairall script command, the equipment will stay in its own index so its fine to immediately repair it, and immediately re-equip it well, no idea how you going to code the auto-equip though solution 2 is better, like I said, spear boomerang and shield boomerang are the best skill to draw hate from a distance -> always (best) keep the party in wedge formation and never use provoke to draw hate ... if the sniper/wizard already engage monster automatically, using provoke will likely put them in danger ... can throw stone even draw hate from sniper/wizard ?? I highly doubt it ... EDIT: by the way... do you play Dungeon Siege ? that game also has some kind of ... party control vs mobs -
[Error]: buildin_delitem2: failed to delete 1 items
AnnieRuru replied to CyberDevil's question in Scripting Support
@inventorylist_attribute[] - whether it is broken. 1 = broken, 0 = not broken well, because my healer script actually has ... many functions, including *repairall, which your script missing ... https://drive.google.com/file/d/19jGaMK0QqAU76XufxwiyqEAZ_AUJaJRu/view note this is hercules script ... rathena doesn't support skill name or item name as constants ... also SC_INC_AGI is SC_INCREASEAGI in rathena .. etc looking at your script, having high identify cost, I guess your players has to go to repairman to get equipment repair prontera,147,174,5 script Identifier::identifier 402,{ // getitem2 1201, 1,0,0,0, 4001,4002,4003,4004; // getitem2 1202, 1,0,3,0, 4001,4001,4001,4001; .@price = 100; // that's expensive ... 1 magnifier cost 40 zeny actually getinventorylist; for ( .@i = 0; .@i < @inventorylist_count; ++.@i ) { if ( @inventorylist_identify[.@i] ) continue; if ( Zeny < .@price ) { dispbottom "The price is "+ .@price +" zeny to identify an item."; break; } Zeny -= .@price; delitem2 @inventorylist_id[.@i], 1, 0, @inventorylist_refine[.@i], @inventorylist_attribute[.@i], @inventorylist_card1[.@i], @inventorylist_card2[.@i], @inventorylist_card3[.@i], @inventorylist_card4[.@i]; getitem2 @inventorylist_id[.@i], 1, 1, @inventorylist_refine[.@i], @inventorylist_attribute[.@i], @inventorylist_card1[.@i], @inventorylist_card2[.@i], @inventorylist_card3[.@i], @inventorylist_card4[.@i]; ++.@total_item' .@total_zeny += .@price; } if ( !.@total_item ) { message strcharinfo(0),"No identified items."; end; } specialeffect2 EF_REFINEOK; message strcharinfo(0), "Identify "+ .@total_item +" items for "+ .@total_zeny +" Zeny"; end; } -
How to find nearest enemy/obtain a list of units on the same map, etc...
AnnieRuru replied to Seravy's question in Source Support
frenzy is use as a last ditch effort when run out of potions (or wish to save them), and want to kill the last batch of monsters at hand or just want to run away in a no-teleport map (can't use wing of fly/butterfly) if play as a team (your project) it not so useful, but when play solo, this skill is extremely useful to save potions I always on Concentration ... just a personal preference because it reduce defence and not flee, Agi build lord knight has more advantage than Vit build when using this skill increase 50 hit is useful if you always miss something head crush and joint beat is totally useless in PvM, even spam pierce has higher damage than any of these joint beat is useful in PvP, some status ailment like curse/fear/blind is useful in pvp situation ... joint beat needs 3 points from head crush Charge attack, a must learn skill for PvP, immediately close in wizard/hunter from far away PvM ? I found spear boomerang more useful to draw hate ... in a team PvM fight should always keep the formation in tact btw there are 2 common lord knight builds, 1 vit build - spear skill tree 2. agi build - two hand sword skill tree don't ask me about any of the 3rd job skill, I didn't play RO for a very long time too EDIT: stalkers are useless in PvM ... this class is highly demand in PvP situation though yeah only the double strafe is useful in PvM chasewalk vs hide ... is a very debate topic chasewalk walk faster than hide <-- perhaps is the only thing useful in PvM if want to use backstab, use hide, then walk slowly behind the target, backstab, lots of damage sniper ... up agi dex luk = killing machine or dex+int = falcon assault build whitesmith ... weapon breaking buff is no problem, can repair broken weapon on the field creator ... berserk pitcher and potion pitcher skill is highly useful in PvM -
set .slot$, "2966|2968"; //Items that can be slotted. change into set .slot$, "2966|2967|2968|2969"; //Items that can be slotted. although some in-game testing, it seems it actually only allow to enchant non-slot equipments because 2967 and 2969 are slot items