-
Posts
2044 -
Joined
-
Last visited
-
Days Won
51
Content Type
Profiles
Forums
Downloads
Jobs Available
Server Database
Third-Party Services
Top Guides
Store
Crowdfunding
Posts posted by AnnieRuru
-
-
latest version is 2.4c actually
http://upaste.me/7c9c496344829d36f52 minutes ago, dolphincute said:hye guys, i would request if anyone or the author Annieruru herself could remake the old Mission Board?
as the old ones dint have access to preview the item reward, and yes i do know emistry did manage to make it but it require SQL
I remember the item require and item reward feature was done back eathena days in year 2010
when you submit a quest, OR accepting a quest, SCROLL DOWN the npc dialog to see them
btw type this to show the mission progress, that's how I usually debug my script
@mission
EDIT: Holy Sh^t, I think Ima gonna spend another 3 days making a topic telling what this script can do and can't do
-
1 hour ago, melv0 said:
btw in last version rathena UNITTYPE_PC change into BL_PC
of course I know, I mean com'on, this script only compatible with latest latest rathena,
because before that commit, rathena couldn't even insert RID on the getmapxybtw I instantly recognized this is my script when I see npc name is kjdshfksfj and account_id as aaa, no other member do like this
I wonder where you got this script from ... because you say things like "my script not working anymore" and " someone was help me to and working too"- 1
-
8 hours ago, utofaery said:
1. Is there anything that can be done for changing the mercenaries AI to be more aggressive (auto attack everything) than what is is now (passive)?
https://rathena.org/board/topic/116308-using-2018-05-30b-client-anyone-have-a-working-ai-for-homunc/
supposedly we can adjust it in the data/AI folder, but now it seems unable to do so
int mob_clone_spawn(struct map_session_data *sd, int16 m, int16 x, int16 y, const char *event, int master_id, enum e_mode mode, int flag, unsigned int duration) { int mob_id; int i,j,inf, fd; struct mob_data *md; struct mob_skill *ms; struct mob_db* db; struct status_data *status; nullpo_ret(sd); if(pc_isdead(sd) && master_id && flag&1) return 0; ARR_FIND( MOB_CLONE_START, MOB_CLONE_END, mob_id, mob_db(mob_id) == NULL ); if(mob_id >= MOB_CLONE_END) return 0; try{ db = &mob_db_data[mob_id]; }catch( const std::bad_alloc& ){ ShowError( "mob_clone_spawn: Memory allocation for clone %hu failed.\n", mob_id ); return 0; } status = &db->status; strcpy(db->sprite,sd->status.name); strcpy(db->name,sd->status.name); strcpy(db->jname,sd->status.name); db->lv=status_get_lv(&sd->bl); memcpy(status, &sd->base_status, sizeof(struct status_data)); status->rhw.atk2= status->dex + status->rhw.atk + status->rhw.atk2; //Max ATK status->rhw.atk = status->dex; //Min ATK if (status->lhw.atk) { status->lhw.atk2= status->dex + status->lhw.atk + status->lhw.atk2; //Max ATK status->lhw.atk = status->dex; //Min ATK } if (mode) //User provided mode. status->mode = mode; else if (flag&1) //Friendly Character, remove looting. status->mode = static_cast<enum e_mode>(status->mode&(~MD_LOOTER)); status->hp = status->max_hp; status->sp = status->max_sp; memcpy(&db->vd, &sd->vd, sizeof(struct view_data)); db->base_exp=1; db->job_exp=1; db->range2=AREA_SIZE; //Let them have the same view-range as players. db->range3=AREA_SIZE; //Min chase of a screen. db->option=sd->sc.option;
8 hours ago, utofaery said:2. does clone get equip bonuses like player?
yes
8 hours ago, utofaery said:3 is aspd inherited on creation of clone? (which from test case would seems to say otherwise)
no
by the way, Hercules #evilclone are smarter, rathena mess up the monster mode
EDIT : Reminds me of someone coding that #autopilot ... if we can also code a homunculus/mercenary AI at the server side ... hmm...
-
compile your server with disable all the renewal settings
https://github.com/rathena/rathena/blob/master/src/config/renewal.hppyeah, everyone miss that old Ragnarok and the Renewal is
bullshitsucks- 1
-
LMAO !!! this script was made for over 4 years, and only today I found out it has a bug
http://herc.ws/board/topic/11445-sameip-command-for-rathena/.@nb = query_sql( "select name, char_id, account_id as aaa, ( select last_ip from login where account_id = aaa ) from `char` where online = 1", .@name$, .@aid, .@cid, .@ip$ );
look closely, name, char_id, account_id, === BUT .@name$, .@aid, .@cid
up version 0.3
//===== Hercules Script ====================================== //= @sameip //===== By: ================================================== //= AnnieRuru //===== Current Version: ===================================== //= 0.3 //===== Compatible With: ===================================== //= Hercules 2019-02-01 //===== Description: ========================================= //= list all players with same ip address //===== Topic ================================================ //= https://rathena.org/board/topic/118137-error-buildin_getmapxy/ //===== Additional Comments: ================================= //= it always list all players online, unable to limit to a single map currently //============================================================ - script kjdshfksfj FAKE_NPC,{ OnInit: bindatcmd "sameip", strnpcinfo(0)+"::Onaaa"; end; Onaaa: freeloop true; .@nb = query_sql( "select name, char_id, account_id as aaa, ( select last_ip from login where account_id = aaa ) from `char` where online = 1", .@name$, .@cid, .@aid, .@ip$ ); for ( .@i = 0; .@i < .@nb; ++.@i ) { for ( .@j = 0; .@j < .@ip_list; ++.@j ) if ( .@b_ip$[.@j] == .@ip$[.@i] ) break; if ( .@j == .@ip_list ) { .@b_ip$[.@j] = .@ip$[.@i]; ++.@ip_list; } setd ".@b_ip"+ .@j +"_name$["+ .@b_ip_size[.@j] +"]", .@name$[.@i]; setd ".@b_ip"+ .@j +"_cid["+ .@b_ip_size[.@j] +"]", .@cid[.@i]; setd ".@b_ip"+ .@j +"_aid["+ .@b_ip_size[.@j] +"]", .@aid[.@i]; ++.@b_ip_size[.@j]; } dispbottom "===== SAME IP Searching ====="; for ( .@i = 0; .@i < .@ip_list; ++.@i ) { if ( .@b_ip_size[.@i] > 1 ) { dispbottom " == The IP ["+ .@b_ip$[.@i] +"] has "+ .@b_ip_size[.@i] +" players."; for ( .@j = 0; .@j < .@b_ip_size[.@i]; ++.@j ) { getmapxy .@map$, .@x, .@y, UNITTYPE_PC, getd( ".@b_ip"+ .@i +"_aid["+ .@j +"]"); dispbottom " = "+( .@j +1 )+". ("+ getd( ".@b_ip"+ .@i +"_cid["+ .@j +"]" ) +") "+ getd( ".@b_ip"+ .@i +"_name$["+ .@j +"]") +" -> "+ .@map$ +" "+ .@x +" "+ .@y; } ++.@result; } } dispbottom ">>> "+ .@result +" results found."; end; }
EDIT:
I think should write another version 0.4 since rathena has already upgrade the script engine quite some time ago
the only optimization I can think of is using inarray script command, so nah- 2
-
no, it is not, how come you have so many unrelated commits ?
https://github.com/HerculesWS/Hercules/compare/master...AnnieRuru:44-strmobinfo <- even this branch is outdated, but still only shows my commits
it should have only your patch in it, but yours has so many commits by other peopleso for us to download your work, we just have to put .patch at the end
https://github.com/HerculesWS/Hercules/compare/master...AnnieRuru:44-strmobinfo
https://github.com/HerculesWS/Hercules/compare/master...AnnieRuru:44-strmobinfo.patch
and obviously yours doesn't work
I'll try to download your whole folder and compare file by file then,
well, I'll do that when I have the time -
On 1/29/2019 at 5:43 AM, Haruka Mayumi said:
if( map_getmapflag(sd->bl.m, MF_NOVENDING) ) if( map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) )
to
if( !map_getmapflag(sd->bl.m, MF_NOVENDING) ) if( !map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) )
Line 754 Skill.cpp.. just a reverse. Any map that has NOVENDING mapflag will allow players to vend there. lolLMAO !! I love people think outside the box
src/map/clif.cpp | 4 ++-- src/map/skill.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index e1cc9b555..fae1e15da 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -13398,11 +13398,11 @@ void clif_parse_OpenVending(int fd, struct map_session_data* sd){ if( sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM ) return; - if( map_getmapflag(sd->bl.m, MF_NOVENDING) ) { + if( !map_getmapflag(sd->bl.m, MF_NOVENDING) ) { clif_displaymessage (sd->fd, msg_txt(sd,276)); // "You can't open a shop on this map" return; } - if( map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) ) { + if( !map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) ) { clif_displaymessage (sd->fd, msg_txt(sd,204)); // "You can't open a shop on this cell." return; } diff --git a/src/map/skill.cpp b/src/map/skill.cpp index e5cd8c61d..77ae11e5e 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -746,12 +746,12 @@ bool skill_isNotOk(uint16 skill_id, struct map_session_data *sd) break; case MC_VENDING: case ALL_BUYING_STORE: - if( map_getmapflag(sd->bl.m, MF_NOVENDING) ) { + if( !map_getmapflag(sd->bl.m, MF_NOVENDING) ) { clif_displaymessage (sd->fd, msg_txt(sd,276)); // "You can't open a shop on this map" clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return true; } - if( map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) ) { + if( !map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNOVENDING) ) { clif_displaymessage (sd->fd, msg_txt(sd,204)); // "You can't open a shop on this cell." clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return true;
- script fdsdf FAKE_NPC,{ OnInit: setmapflag "prontera", mf_novending, true; setcell "prontera",0,0,500,500, cell_novending, true; end; }
yeah this actually works !
- 1
-
7 hours ago, Hijirikawa said:
however I do want to learn how to fiddle around with source, and I believe this might be a good area to start.
src/custom/atcommand.inc | 24 ++++++++++++++++++++++++ src/custom/atcommand_def.inc | 2 ++ 2 files changed, 26 insertions(+) diff --git a/src/custom/atcommand.inc b/src/custom/atcommand.inc index 9dd4a3856..44d8d7b11 100644 --- a/src/custom/atcommand.inc +++ b/src/custom/atcommand.inc @@ -17,3 +17,27 @@ // clif_specialeffect(&sd->bl, EF_HEARTCASTING, AREA); // return 0; //} + +ACMD_FUNC(custom) { + intif_broadcast( message, strlen(message) + 1, BC_DEFAULT ); + return 0; +} + +ACMD_FUNC(custom_item) { + char item_name[99]; + int number = 0; + struct item_data *item_data; + + if ( sscanf( message, "\"%99[^\"]\" %11d", item_name, &number) < 1 && sscanf( message, "%99s %11d", item_name, &number ) < 1 ) { + clif_displaymessage(fd, msg_txt(sd,983)); // Please enter an item name or ID (usage: @item <item name/ID> <quantity>). + return -1; + } + if ( (item_data = itemdb_searchname(item_name)) == NULL && (item_data = itemdb_exists(atoi(item_name))) == NULL ) { + clif_displaymessage(fd, msg_txt(sd,19)); // Invalid item ID or name. + return -1; + } + + safesnprintf( atcmd_output, CHAT_SIZE_MAX, "[ Quality Control ]: %s created %s(%d) with the %s command", sd->status.name, item_data->jname, item_data->nameid, command ); + intif_broadcast( atcmd_output, strlen(atcmd_output) + 1, BC_DEFAULT ); + return 0; +} \ No newline at end of file diff --git a/src/custom/atcommand_def.inc b/src/custom/atcommand_def.inc index 54d9e74ba..86acf41da 100644 --- a/src/custom/atcommand_def.inc +++ b/src/custom/atcommand_def.inc @@ -9,3 +9,5 @@ **/ //ACMD_DEF(newcommand), +ACMD_DEF(custom), +ACMD_DEF(custom_item),
http://www.cplusplus.com/doc/tutorial/structures/
http://www.cplusplus.com/reference/cstdio/sscanf/
http://www.cplusplus.com/reference/cstdio/sprintf/EDIT: apparently
rAthenathe client has a bug for char-command , the command repeat itself, due to the # symbolSpoilerACMD_FUNC(custom2) { int number = 0; char item_name[99]; struct item_data *item_data; if ( sscanf( message, "\"%99[^\"]\" %11d", item_name, &number) < 1 && sscanf( message, "%99s %11d", item_name, &number ) < 1 ) { clif_displaymessage(fd, msg_txt(sd,983)); // Please enter an item name or ID (usage: @item <item name/ID> <quantity>). return -1; } if ( (item_data = itemdb_searchname(item_name)) == NULL && (item_data = itemdb_exists(atoi(item_name))) == NULL ) { clif_displaymessage(fd, msg_txt(sd,19)); // Invalid item ID or name. return -1; } if ( command[0] == '@' ) safesnprintf( atcmd_output, CHAT_SIZE_MAX, "[ Quality Control ]: %s created %s(%d) with the %s command", sd->status.name, item_data->jname, item_data->nameid, command ); else if ( command[0] == '#' ) { char *temp = (char*)aMalloc( strlen( command ) +1 ); struct map_session_data *ssd; struct s_mapiterator* iter = mapit_getallusers(); for ( ssd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); ssd = (TBL_PC*)mapit_next(iter) ) if ( ssd->fd == fd ) break; mapit_free(iter); safesnprintf( temp, CHAT_SIZE_MAX, "%s", command ); temp[0] = ' '; // replace this space into '#' and you get the bug, due to the client safesnprintf( atcmd_output, CHAT_SIZE_MAX, "[ Quality Control ]: %s created %s(%d) for %s with the %s command", ssd->status.name, item_data->jname, item_data->nameid, sd->status.name, temp ); } intif_broadcast( atcmd_output, strlen(atcmd_output) + 1, BC_DEFAULT ); return 0; }
- 1
-
3 hours ago, Hijirikawa said:
wtf why do it so complicated, rAthena can do the same with unit controller script commands
( hercules mob controller script commands are broken that's why I couldn't say anything there, but over here is working perfectly fine )function script camp_fire { monster "this", -1,-1, "--ja--", 1002, 1, ""; .@mobid = $@mobid; setunitdata .@mobid, UMOB_DMGIMMUNE, true; setunitdata .@mobid, UMOB_MODE, MD_STATUS_IMMUNE|MD_SKILL_IMMUNE|MD_KNOCKBACK_IMMUNE; getunitdata .@mobid, .@unitdata; for ( .@i = 0; .@i < 5; ++.@i ) { areapercentheal mapid2name(.@unitdata[UMOB_MAPID]), .@unitdata[UMOB_X]-5, .@unitdata[UMOB_Y]-5, .@unitdata[UMOB_X]+5, .@unitdata[UMOB_Y]+5, 10,1; sleep 1000; } unitkill .@mobid; end; }
ok back to topic, well asking for buff and so on needs duplicates, yeah need source modification
src/custom/script.inc | 197 ++++++++++++++++++++++++++++++++++++++++++++++ src/custom/script_def.inc | 3 + src/map/npc.cpp | 11 +-- src/map/npc.hpp | 10 +++ 4 files changed, 213 insertions(+), 8 deletions(-) diff --git a/src/custom/script.inc b/src/custom/script.inc index 839b990cb..70926e0a8 100644 --- a/src/custom/script.inc +++ b/src/custom/script.inc @@ -17,3 +17,200 @@ // script_pushint(st,1); // return 0; //} + +/*========================================== + * Duplicate any npc on live server + * duplicatenpc "<Source NPC name>","<New NPC shown name>","<New NPC hidden name>","<mapname>",<map_x>,<map_y>,<dir>{, spriteid{, map_xs, map_ys}}}; + *------------------------------------------*/ +BUILDIN_FUNC(duplicatenpc) +{ + int map_x = script_getnum(st, 6); + int map_y = script_getnum(st, 7); + int dir = script_getnum(st, 8); + int spriteid, map_xs = -1, map_ys = -1, sourceid, type, mapid, i; + const char *sourcename = script_getstr(st, 2); + const char *new_shown_name = script_getstr(st, 3); + const char *new_hidden_name = script_getstr(st, 4); + const char *mapname = script_getstr(st, 5); + + char new_npc_name[24] = ""; + struct npc_data *nd_source, *nd_target; + + if(script_hasdata(st, 10)) + map_xs = (script_getnum(st, 10) < -1) ? -1 : script_getnum(st, 10); + + if(script_hasdata(st, 11)) + map_ys = (script_getnum(st, 11) < -1) ? -1 : script_getnum(st, 10); + + if(map_xs == -1 && map_ys != -1) + map_xs = 0; + + if(map_xs != - 1 && map_ys == -1) + map_ys = 0; + + if(strlen(new_shown_name) + strlen(new_hidden_name) > NAME_LENGTH) { + ShowError("buildin_duplicatenpc: New NPC shown name + New NPC hidden name is too long (max %d chars). (%s)\n", sourcename, NAME_LENGTH); + script_pushint(st, 0); + return SCRIPT_CMD_FAILURE; + } + + nd_source = npc_name2id(sourcename); + + if(script_hasdata(st, 9)) + spriteid = (script_getnum(st, 9) < -1) ? -1 : script_getnum(st, 9); + else + spriteid = nd_source->class_; + + if(nd_source == NULL) { + ShowError("buildin_duplicatenpc: original npc not found for duplicate. (%s)\n", sourcename); + script_pushint(st, 0); + return SCRIPT_CMD_FAILURE; + } + + sourceid = nd_source->bl.id; + type = nd_source->subtype; + mapid = map_mapname2mapid(mapname); + + if(mapid < 0) { + ShowError("buildin_duplicatenpc: target map not found. (%s)\n", mapname); + script_pushint(st, 0); + return SCRIPT_CMD_FAILURE; + } + + CREATE(nd_target, struct npc_data, 1); + + strcat(new_npc_name, new_shown_name); + strncat(new_npc_name, "#", 1); + strncat(new_npc_name, new_hidden_name, strlen(new_hidden_name)); + + safestrncpy(nd_target->name, new_npc_name , sizeof(nd_target->name)); + safestrncpy(nd_target->exname, new_npc_name, sizeof(nd_target->exname)); + + nd_target->bl.prev = nd_target->bl.next = NULL; + nd_target->bl.m = mapid; + nd_target->bl.x = map_x; + nd_target->bl.y = map_y; + nd_target->bl.id = npc_get_new_npc_id(); + nd_target->class_ = spriteid; + nd_target->speed = 200; + nd_target->src_id = sourceid; + nd_target->bl.type = BL_NPC; + nd_target->subtype = (enum npc_subtype)type; + + switch(type) { + case NPCTYPE_SCRIPT: + nd_target->u.scr.xs = map_xs; + nd_target->u.scr.ys = map_ys; + nd_target->u.scr.script = nd_source->u.scr.script; + nd_target->u.scr.label_list = nd_source->u.scr.label_list; + nd_target->u.scr.label_list_num = nd_source->u.scr.label_list_num; + break; + case NPCTYPE_SHOP: + case NPCTYPE_CASHSHOP: + case NPCTYPE_ITEMSHOP: + case NPCTYPE_POINTSHOP: + case NPCTYPE_MARKETSHOP: + nd_target->u.shop.shop_item = nd_source->u.shop.shop_item; + nd_target->u.shop.count = nd_source->u.shop.count; + break; + case NPCTYPE_WARP: + if( !battle_config.warp_point_debug ) + nd_target->class_ = JT_WARPNPC; + else + nd_target->class_ = JT_GUILD_FLAG; + nd_target->u.warp.xs = map_xs; + nd_target->u.warp.ys = map_ys; + nd_target->u.warp.mapindex = nd_source->u.warp.mapindex; + nd_target->u.warp.x = nd_source->u.warp.x; + nd_target->u.warp.y = nd_source->u.warp.y; + nd_target->trigger_on_hidden = nd_source->trigger_on_hidden; + break; + } + + map_addnpc(mapid, nd_target); + status_change_init(&nd_target->bl); + unit_dataset(&nd_target->bl); + nd_target->ud.dir = dir; + npc_setcells(nd_target); + map_addblock(&nd_target->bl); + + if(spriteid >= 0) { + status_set_viewdata(&nd_target->bl, nd_target->class_); + clif_spawn(&nd_target->bl); + } + + strdb_put(npcname_db, nd_target->exname, nd_target); + + if(type == NPCTYPE_SCRIPT) { + for (i = 0; i < nd_target->u.scr.label_list_num; i++) { + char* lname = nd_target->u.scr.label_list[i].name; + int pos = nd_target->u.scr.label_list[i].pos; + + if ((lname[0] == 'O' || lname[0] == 'o') && (lname[1] == 'N' || lname[1] == 'n')) { + struct event_data* ev; + char buf[NAME_LENGTH*2+3]; + snprintf(buf, ARRAYLENGTH(buf), "%s::%s", nd_target->exname, lname); + + CREATE(ev, struct event_data, 1); + ev->nd = nd_target; + ev->pos = pos; + if(strdb_put(ev_db, buf, ev)) + ShowWarning("npc_parse_duplicate : duplicate event %s (%s)\n", buf, nd_target->name); + } + } + + for (i = 0; i < nd_target->u.scr.label_list_num; i++) { + int t = 0, k = 0; + char *lname = nd_target->u.scr.label_list[i].name; + int pos = nd_target->u.scr.label_list[i].pos; + if (sscanf(lname, "OnTimer%d%n", &t, &k) == 1 && lname[k] == '\0') { + struct npc_timerevent_list *te = nd_target->u.scr.timer_event; + int j, k = nd_target->u.scr.timeramount; + if (te == NULL) + te = (struct npc_timerevent_list *)aMalloc(sizeof(struct npc_timerevent_list)); + else + te = (struct npc_timerevent_list *)aRealloc( te, sizeof(struct npc_timerevent_list) * (k+1) ); + for (j = 0; j < k; j++) { + if (te[j].timer > t) { + memmove(te+j+1, te+j, sizeof(struct npc_timerevent_list)*(k-j)); + break; + } + } + te[j].timer = t; + te[j].pos = pos; + nd_target->u.scr.timer_event = te; + nd_target->u.scr.timeramount++; + } + } + nd_target->u.scr.timerid = INVALID_TIMER; + } + + script_pushint(st, 1); + return SCRIPT_CMD_SUCCESS; +} + +/*========================================== + * Remove any npc duplicate on live server + * duplicateremove "<NPC name>"; + *------------------------------------------*/ +BUILDIN_FUNC(duplicateremove) +{ + struct npc_data *nd; + + if(script_hasdata(st, 2)) { + nd = npc_name2id(script_getstr(st, 2)); + if(nd == NULL) { + script_pushint(st, -1); + return SCRIPT_CMD_FAILURE; + } + } else + nd = (struct npc_data *)map_id2bl(st->oid); + + if(!nd->src_id) + npc_unload_duplicates(nd); + else + npc_unload(nd,true); + + script_pushint(st, 1); + return SCRIPT_CMD_SUCCESS; +} \ No newline at end of file diff --git a/src/custom/script_def.inc b/src/custom/script_def.inc index 886399273..177e5cf1a 100644 --- a/src/custom/script_def.inc +++ b/src/custom/script_def.inc @@ -9,3 +9,6 @@ **/ //BUILDIN_DEF(example,""), + +BUILDIN_DEF(duplicatenpc, "ssssiii???"), +BUILDIN_DEF(duplicateremove, "?"), \ No newline at end of file diff --git a/src/map/npc.cpp b/src/map/npc.cpp index 64ae5a361..cfecfcfa7 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -85,13 +85,8 @@ int npc_get_new_npc_id(void) { } } -static DBMap* ev_db; // const char* event_name -> struct event_data* -static DBMap* npcname_db; // const char* npc_name -> struct npc_data* - -struct event_data { - struct npc_data *nd; - int pos; -}; +DBMap* ev_db; // const char* event_name -> struct event_data* +DBMap* npcname_db; // const char* npc_name -> struct npc_data* static struct eri *timer_event_ers; //For the npc timer data. [Skotlex] @@ -2140,7 +2135,7 @@ static int npc_unload_ev(DBKey key, DBData *data, va_list ap) //Chk if npc matches src_id, then unload. //Sub-function used to find duplicates. -static int npc_unload_dup_sub(struct npc_data* nd, va_list args) +int npc_unload_dup_sub(struct npc_data* nd, va_list args) { int src_id; diff --git a/src/map/npc.hpp b/src/map/npc.hpp index ee496ad9e..6d054dcab 100644 --- a/src/map/npc.hpp +++ b/src/map/npc.hpp @@ -108,6 +108,14 @@ struct npc_data { struct eri; extern struct eri *npc_sc_display_ers; +extern DBMap* ev_db; // const char* event_name -> struct event_data* +extern DBMap* npcname_db; // const char* npc_name -> struct npc_data* + +struct event_data { + struct npc_data *nd; + int pos; +}; + #define START_NPC_NUM 110000000 enum e_job_types @@ -1241,6 +1249,8 @@ int npc_instanceinit(struct npc_data* nd); int npc_instancedestroy(struct npc_data* nd); int npc_cashshop_buy(struct map_session_data *sd, unsigned short nameid, int amount, int points); +int npc_unload_dup_sub(struct npc_data *nd, va_list args); + void npc_shop_currency_type(struct map_session_data *sd, struct npc_data *nd, int cost[2], bool display); extern struct npc_data* fake_nd;
function script qwerty { // run this from item getmapxy .@map$, .@x, .@y, BL_PC; duplicatenpc "Kafra_Follower", "Kafra_Follower", $@kafra_follower +"", .@map$, .@x, .@y, DIR_SOUTH, 1_F_MARIA; addtimer 1, "Kafra_Follower#"+ $@kafra_follower +"::OnStart"; ++$@kafra_follower; return; } - script Kafra_Follower FAKE_NPC,{ .@id = atoi( strnpcinfo(2) ); if ( .masteraid[.@id] != getcharid(3) ) { mes "already have a master"; close; } mes "do whatever you like to me ^.^"; next; if ( select("buff", "open storage") == 1 ) { specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,240000,10; specialeffect2 EF_BLESSING; sc_start SC_BLESSING,240000,10; close; } close2; openstorage; end; OnStart: .@id = atoi( strnpcinfo(2) ); .masteraid[.@id] = getcharid(3); npcspeed 150; while ( .masteraid[.@id] ) { attachrid .masteraid[.@id]; getmapxy .@map$, .@x, .@y, BL_PC; getmapxy .@map1$, .@x1, .@y1, BL_NPC; if ( .@map$ != .@map1$ || distance( .@x, .@y, .@x1, .@y1 ) > 15 ) { while ( checkcell( .@map$, .@x2 = .@x + rand(-2,2), .@y2 = .@y + rand(-2,2), cell_chknopass ) ); unitwarp getnpcid(0), .@map$, .@x2, .@y2; } else if ( distance( .@x, .@y, .@x1, .@y1 ) > 5 ) { while ( checkcell( .@map$, .@x2 = .@x + rand(-2,2), .@y2 = .@y + rand(-2,2), cell_chknopass ) ); npcwalkto .@x2, .@y2; } sleep 250; } duplicateremove strnpcinfo(0); end; OnPCLogoutEvent: .@aid = getcharid(3); while ( countinarray( .masteraid, .@aid ) ) { .@id = inarray( .masteraid, .@aid ); .masteraid[.@id] = 0; } end; }
- 1
- 1
-
[Error]: buildin_delitem: failed to delete 50 items (AID=2000169 item_id=6488).
comes from this line
https://github.com/rathena/rathena/blob/master/npc/re/guild/invest_main.txt#L1579this tells a lot
few days ago melvo show me a screenshot of someone trying to hack in his server, he claim that player is duping eluniumyes his map-server also spam with this kind of error
I also have no idea how the countitem can fail the check, but the delitem command can catch it, maybe some 3rd party tools can bypass it
-
prontera,155,185,4 script Kafra Follower 1_F_MARIA,{ if ( .masteraid ) { if ( .masteraid != getcharid(3) ) { mes "already have a master"; close; } else { mes "do whatever you like to me ^.^"; next; if ( select("buff", "open storage") == 1 ) { specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,240000,10; specialeffect2 EF_BLESSING; sc_start SC_BLESSING,240000,10; close; } close2; openstorage; end; } } mes "my master ?"; next; select "Yes"; .masteraid = getcharid(3); close2; while ( .masteraid ) { attachrid .masteraid; getmapxy .@map$, .@x, .@y, UNITTYPE_PC; getmapxy .@map1$, .@x1, .@y1, UNITTYPE_NPC; if ( .@map$ != .@map1$ || distance( .@x, .@y, .@x1, .@y1 ) > 15 ) { while ( checkcell( .@map$, .@x2 = .@x + rand(-2,2), .@y2 = .@y + rand(-2,2), cell_chknopass ) ); unitwarp getnpcid(0), .@map$, .@x2, .@y2; } else if ( distance( .@x, .@y, .@x1, .@y1 ) > 5 ) { while ( checkcell( .@map$, .@x2 = .@x + rand(-2,2), .@y2 = .@y + rand(-2,2), cell_chknopass ) ); npcwalkto .@x2, .@y2; } sleep 250; } unitwarp getnpcid(0), "prontera", 155,185; end; OnInit: npcspeed 100; end; OnPCLogoutEvent: if ( .masteraid == getcharid(3) ) .masteraid = 0; end; }
a simple OnPCLogoutEvent should let the npc go back to its location
-
since this is not an hourly point script which require player has to constantly online
you only want it 'presence' every 12 hours, so just do it with static timerprontera,155,185,5 script kjdhfkshfj 1_F_MARIA,{ if ( presence_online + .delay <= gettimetick(2) ) { presence_points += 30; presence_online = gettimetick(2); mes "30 points given"; next; } mes "come back again on"; mes gettimestr( "%A, %I:%M:%S%p", 40, presence_online + .delay ); next; select "Presence Shop"; close2; callshop "presence_shop", 1; end; OnInit: .delay = 12*60*60; end; } - pointshop presence_shop FAKE_NPC,presence_points,501:10,502:20,503:30
-
function script F_MesItemInfo { .@item = getarg(0); .@itemname$ = getitemname(.@item); if (.@itemname$ != "null") { .@itemslot = getitemslots(.@item); if (.@itemslot) .@itemname$ = sprintf("%s [%d]", .@itemname$, .@itemslot); } else .@itemname$ = "Unknown Item"; return sprintf("<ITEM>%s<INFO>%d</INFO></ITEM>", .@itemname$, .@item); } prontera,155,185,5 script kjdhfkshfj 1_F_MARIA,{ input .@itemid; if ( getitemname(.@itemid) == "null" ) { mes "invalid item"; close; } query_sql "select "+ "ifnull((select sum(amount) from inventory where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from cart_inventory where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from storage where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from guild_storage where nameid = "+ .@itemid +"), 0) + "+ "ifnull((select sum(amount) from mail_attachments where nameid = "+ .@itemid +"), 0)" , .@sum; mes F_MesItemInfo(.@itemid) +" has total amount of "+ .@sum +" in the entire server"; close; }
- 1
- 1
-
if(getrefine()>5) {bonus bInt,20;}
means if refine is equal to 6 or above
if you want it 5 or above, should use >=
if(getrefine()>=5) {bonus bInt,20;}
-
prontera,155,185,5 script sdfskf 1_F_MARIA,{ mes "do you want to go to Nighogg's map ?"; next; if ( select( "Yes", "No" ) == 2 ) close; warp "2@nyd", 0,0; end; OnHour0000: OnHour0400: OnHour0800: OnHour1200: OnHour1600: OnHour2000: monster "2@nyd", 0,0, "monsters", 1002, 10, ""; end; }
-
4382
nice to see Syouji back
-
- script ksfjskfd 1_F_MARIA,{ OnPCStatCalcEvent: if ( readparam(bStr) >= 100 ) bonus bAtk, 1000; end; }
- 1
- 1
-
1 hour ago, Tanlor said:
If you want to block Vending on all maps except one, that's probably better make a Source Code Modification on src/map/skill.cpp. I can't help you on that way, but you can use the Source Support Area on forums and people will Hopefully help you, rAthena support rocks
just do a macro with notepad++ on the map_index.txt
https://annieruru.blogspot.com/2019/01/run-macro-in-notepad.html- script novending FAKE_NPC,{ OnInit: freeloop true; setarray .@map$, "alb_ship","alb2trea","alberta","alberta_in","alde_dun01","alde_dun02","alde_dun03","alde_dun04","aldeba_in","aldebaran","anthell01","anthell02","arena_room","c_tower1","c_tower2","c_tower3","c_tower4","force_1-1","force_1-2","force_1-3","force_2-1","force_2-2","force_2-3","force_3-1","force_3-2","force_3-3","gef_dun00","gef_dun01","gef_dun02","gef_dun03","gef_fild00","gef_fild01","gef_fild02","gef_fild03","gef_fild04","gef_fild05","gef_fild06","gef_fild07","gef_fild08","gef_fild09","gef_fild10","gef_fild11","gef_fild12","gef_fild13","gef_fild14","gef_tower","geffen","geffen_in","gl_cas01","gl_cas02","gl_church","gl_chyard","gl_dun01","gl_dun02","gl_in01","gl_knt01","gl_knt02","gl_prison","gl_prison1","gl_sew01","gl_sew02","gl_sew03","gl_sew04","gl_step","glast_01","hunter_1-1","hunter_2-1","hunter_3-1","in_hunter","in_moc_16","in_orcs01","in_sphinx1","in_sphinx2","in_sphinx3","in_sphinx4","in_sphinx5","iz_dun00","iz_dun01","iz_dun02","iz_dun03","iz_dun04","job_sword1","izlu2dun","izlude","izlude_in","job_thief1","knight_1-1","knight_2-1","knight_3-1","mjo_dun01","mjo_dun02","mjo_dun03","mjolnir_01","mjolnir_02","mjolnir_03","mjolnir_04","mjolnir_05","mjolnir_06","mjolnir_07","mjolnir_08","mjolnir_09","mjolnir_10","mjolnir_11","mjolnir_12","moc_castle","moc_fild01","moc_fild02","moc_fild03","moc_fild04","moc_fild05","moc_fild06","moc_fild07","moc_fild08","moc_fild09","moc_fild10","moc_fild11","moc_fild12","moc_fild13","moc_fild14","moc_fild15","moc_fild16","moc_fild17","moc_fild18","moc_fild19","moc_pryd01","moc_pryd02","moc_pryd03","moc_pryd04","moc_pryd05","moc_pryd06","moc_prydb1","moc_ruins","monk_in","morocc","morocc_in","new_1-1","new_1-2","new_1-3","new_1-4","new_2-1","new_2-2","new_2-3","new_2-4","new_3-1","new_3-2","new_3-3","new_3-4","new_4-1","new_4-2","new_4-3","new_4-4","new_5-1","new_5-2","new_5-3","new_5-4","orcsdun01","orcsdun02","ordeal_1-1","ordeal_1-2","ordeal_2-1","ordeal_2-2","ordeal_3-1","ordeal_3-2","pay_arche","pay_dun00","pay_dun01","pay_dun02","pay_dun03","pay_dun04","pay_fild01","pay_fild02","pay_fild03","pay_fild04","pay_fild05","pay_fild06","pay_fild07","pay_fild08","pay_fild09","pay_fild10","pay_fild11","payon","payon_in01","payon_in02","priest_1-1","priest_2-1","priest_3-1","prontera","prt_are_in","prt_are01","pvp_room","prt_castle","prt_church","prt_fild00","prt_fild01","prt_fild02","prt_fild03","prt_fild04","prt_fild05","prt_fild06","prt_fild07","prt_fild08","prt_fild09","prt_fild10","prt_fild11","prt_in","prt_maze01","prt_maze02","prt_maze03","prt_monk","prt_sewb1","prt_sewb2","prt_sewb3","prt_sewb4","pvp_2vs2","pvp_c_room","pvp_n_1-1","pvp_n_1-2","pvp_n_1-3","pvp_n_1-4","pvp_n_1-5","pvp_n_2-1","pvp_n_2-2","pvp_n_2-3","pvp_n_2-4","pvp_n_2-5","pvp_n_3-1","pvp_n_3-2","pvp_n_3-3","pvp_n_3-4","pvp_n_3-5","pvp_n_4-1","pvp_n_4-2","pvp_n_4-3","pvp_n_4-4","pvp_n_4-5","pvp_n_5-1","pvp_n_5-2","pvp_n_5-3","pvp_n_5-4","pvp_n_5-5","pvp_n_6-1","pvp_n_6-2","pvp_n_6-3","pvp_n_6-4","pvp_n_6-5","pvp_n_7-1","pvp_n_7-2","pvp_n_7-3","pvp_n_7-4","pvp_n_7-5","pvp_n_8-1","pvp_n_8-2","pvp_n_8-3","pvp_n_8-4","pvp_n_8-5","pvp_n_room","pvp_y_1-1","pvp_y_1-2","pvp_y_1-3","pvp_y_1-4","pvp_y_1-5","pvp_y_2-1","pvp_y_2-2","pvp_y_2-3","pvp_y_2-4","pvp_y_2-5","pvp_y_3-1","pvp_y_3-2","pvp_y_3-3","pvp_y_3-4","pvp_y_3-5","pvp_y_4-1","pvp_y_4-2","pvp_y_4-3","pvp_y_4-4","pvp_y_4-5","pvp_y_5-1","pvp_y_5-2","pvp_y_5-3","pvp_y_5-4","pvp_y_5-5","pvp_y_6-1","pvp_y_6-2","pvp_y_6-3","pvp_y_6-4","pvp_y_6-5","pvp_y_7-1","pvp_y_7-2","pvp_y_7-3","pvp_y_7-4","pvp_y_7-5","pvp_y_8-1","pvp_y_8-2","pvp_y_8-3","pvp_y_8-4","pvp_y_8-5","pvp_y_room","sword_1-1","sword_2-1","sword_3-1","treasure01","treasure02","wizard_1-1","wizard_2-1","wizard_3-1","xmas","xmas_dun01","xmas_dun02","xmas_fild01","xmas_in","beach_dun","beach_dun2","beach_dun3","cmd_fild01","cmd_fild02","cmd_fild03","cmd_fild04","cmd_fild05","cmd_fild06","cmd_fild07","cmd_fild08","cmd_fild09","cmd_in01","cmd_in02","comodo","quiz_00","quiz_01","g_room1-1","g_room1-2","g_room1-3","g_room2","tur_dun01","tur_dun02","tur_dun03","tur_dun04","tur_dun05","tur_dun06","alde_gld","aldeg_cas01","aldeg_cas02","aldeg_cas03","aldeg_cas04","aldeg_cas05","gefg_cas01","gefg_cas02","gefg_cas03","gefg_cas04","gefg_cas05","gld_dun01","gld_dun02","gld_dun03","gld_dun04","guild_room","guild_vs1","guild_vs2","guild_vs3","guild_vs4","guild_vs5","guild_vs1-1","guild_vs1-2","guild_vs1-3","guild_vs1-4","guild_vs2-1","guild_vs2-2","job_hunte","job_knt","job_prist","job_wiz","pay_gld","payg_cas01","payg_cas02","payg_cas03","payg_cas04","payg_cas05","prt_gld","prtg_cas01","prtg_cas02","prtg_cas03","prtg_cas04","prtg_cas05","alde_alche","in_rogue","job_cru","job_duncer","job_monk","job_sage","mag_dun01","mag_dun02","monk_test","quiz_test","yuno","yuno_fild01","yuno_fild02","yuno_fild03","yuno_fild04","yuno_in01","yuno_in02","yuno_in03","yuno_in04","yuno_in05","ama_dun01","ama_dun02","ama_dun03","ama_fild01","ama_in01","ama_in02","ama_test","amatsu","gon_dun01","gon_dun02","gon_dun03","gon_fild01","gon_in","gon_test","gonryun","sec_in01","sec_in02","sec_pri","umbala","um_dun01","um_dun02","um_fild01","um_fild02","um_fild03","um_fild04","um_in","niflheim","nif_fild01","nif_fild02","nif_in","yggdrasil01","valkyrie","himinn","lou_in01","lou_in02","lou_dun03","lou_dun02","lou_dun01","lou_fild01","louyang","siege_test","n_castle","nguild_gef","nguild_prt","nguild_pay","nguild_alde","jawaii","jawaii_in","gefenia01","gefenia02","gefenia03","gefenia04","new_zone01","new_zone02","new_zone03","new_zone04","payon_in03","ayothaya","ayo_in01","ayo_in02","ayo_fild01","ayo_fild02","ayo_dun01","ayo_dun02","que_god01","que_god02","yuno_fild05","yuno_fild07","yuno_fild08","yuno_fild09","yuno_fild11","yuno_fild12","alde_tt02","turbo_n_1","turbo_n_4","turbo_n_8","turbo_n_16","turbo_e_4","turbo_e_8","turbo_e_16","turbo_room","airplane","airport","einbech","einbroch","ein_dun01","ein_dun02","ein_fild06","ein_fild07","ein_fild08","ein_fild09","ein_fild10","ein_in01","que_sign01","que_sign02","ein_fild03","ein_fild04","lhz_fild02","lhz_fild03","yuno_pre","lhz_fild01","lighthalzen","lhz_in01","lhz_in02","lhz_in03","lhz_que01","lhz_dun01","lhz_dun02","lhz_dun03","lhz_cube","juperos_01","juperos_02","jupe_area1","jupe_area2","jupe_core","jupe_ele","jupe_ele_r","jupe_gate","y_airport","lhz_airport","airplane_01","jupe_cave","quiz_02","hu_fild07","hu_fild05","hu_fild04","hu_fild01","yuno_fild06","job_soul","job_star","que_job01","que_job02","que_job03","abyss_01","abyss_02","abyss_03","thana_step","thana_boss","tha_scene01","tha_t01","tha_t02","tha_t03","tha_t04","tha_t07","tha_t05","tha_t06","tha_t08","tha_t09","tha_t10","tha_t11","tha_t12","auction_01","auction_02","hugel","hu_in01","que_bingo","que_hugel","p_track01","p_track02","odin_tem01","odin_tem02","odin_tem03","hu_fild02","hu_fild03","hu_fild06","ein_fild01","ein_fild02","ein_fild05","yuno_fild10","kh_kiehl02","kh_kiehl01","kh_dun02","kh_dun01","kh_mansion","kh_rossi","kh_school","kh_vila","force_map1","force_map2","force_map3","job_hunter","job_knight","job_priest","job_wizard","ve_in02","rachel","ra_in01","ra_fild01","ra_fild02","ra_fild03","ra_fild04","ra_fild05","ra_fild06","ra_fild07","ra_fild08","ra_fild09","ra_fild10","ra_fild11","ra_fild12","ra_fild13","ra_san01","ra_san02","ra_san03","ra_san04","ra_san05","ra_temin","ra_temple","ra_temsky","que_rachel","ice_dun01","ice_dun02","ice_dun03","ice_dun04","que_thor","thor_camp","thor_v01","thor_v02","thor_v03","veins","ve_in","ve_fild01","ve_fild02","ve_fild03","ve_fild04","ve_fild05","ve_fild06","ve_fild07","poring_c01","poring_c02","que_ng","nameless_i","nameless_n","nameless_in","abbey01","abbey02","abbey03","poring_w01","poring_w02","que_san04","moscovia","mosk_in","mosk_ship","mosk_fild01","mosk_fild02","mosk_dun01","mosk_dun02","mosk_dun03","mosk_que","force_4-1","force_5-1","06guild_r","06guild_01","06guild_02","06guild_03","06guild_04","06guild_05","06guild_06","06guild_07","06guild_08","z_agit","que_temsky","itemmall","bossnia_01","bossnia_02","bossnia_03","bossnia_04","schg_cas01","schg_cas02","schg_cas03","schg_cas04","schg_cas05","sch_gld","cave","moc_fild20","moc_fild21","moc_fild22","que_ba","que_moc_16","que_moon","arug_cas01","arug_cas02","arug_cas03","arug_cas04","arug_cas05","aru_gld","bat_room","bat_a01","bat_a02","bat_b01","bat_b02","que_qsch01","que_qsch02","que_qsch03","que_qsch04","que_qsch05","que_qaru01","que_qaru02","que_qaru03","que_qaru04","que_qaru05","1@cata","2@cata","e_tower","1@tower","2@tower","3@tower","4@tower","5@tower","6@tower","mid_camp","mid_campin","man_fild01","man_fild03","spl_fild02","spl_fild03","moc_fild22b","que_dan01","que_dan02","schg_que01","schg_dun01","arug_que01","arug_dun01","1@orcs","2@orcs","1@nyd","2@nyd","nyd_dun01","nyd_dun02","manuk","man_fild02","man_in01","splendide","spl_fild01","spl_in01","spl_in02","bat_c01","bat_c02","bat_c03","moc_para01","job3_arch01","job3_arch02","job3_arch03","job3_guil01","job3_guil02","job3_guil03","job3_rang01","job3_rang02","job3_rune01","job3_rune02","job3_rune03","job3_war01","job3_war02","jupe_core2","brasilis","bra_in01","bra_fild01","bra_dun01","bra_dun02","dicastes01","dicastes02","dic_in01","dic_fild01","dic_fild02","dic_dun01","dic_dun02","job3_gen01","s_atelier","job3_sha01","mora","bif_fild01","bif_fild02","1@mist","dewata","dew_in01","dew_fild01","dew_dun01","dew_dun02","que_house_s","malangdo","mal_in01","mal_in02","mal_dun01","1@pump","2@pump","1@cash","iz_dun05","evt_mobroom","alde_tt03","dic_dun03","1@lhz","lhz_dun04","que_lhz","evt_swar_b","evt_swar_r","evt_swar_s","evt_swar_t","gld2_ald","gld2_gef","gld2_pay","gld2_prt","gld_dun01_2","gld_dun02_2","gld_dun03_2","gld_dun04_2","malaya","job_ko","ma_scene01","1@ma_b","1@ma_c","1@ma_h","ma_in01","ma_dun01","ma_fild01","ma_fild02","ma_zif01","ma_zif02","ma_zif03","ma_zif04","ma_zif05","ma_zif06","ma_zif07","ma_zif08","ma_zif09","new_event","eclage","ecl_fild01","ecl_tdun01","ecl_tdun02","ecl_tdun03","ecl_tdun04","que_avan01","1@ecl","ecl_in01","ecl_in02","ecl_in03","ecl_in04","ecl_hub01","moc_prydn1","moc_prydn2","iz_ac01","iz_ac02","treasure_n1","treasure_n2","iz_int","iz_ng01","iz_int01","iz_int02","iz_int03","iz_int04","iz_ac01_a","iz_ac02_a","iz_ac01_b","iz_ac02_b","iz_ac01_c","iz_ac02_c","iz_ac01_d","iz_ac02_d","te_prtcas01","te_prtcas02","te_prtcas03","te_prtcas04","te_prtcas05","te_aldecas1","te_aldecas2","te_aldecas3","te_aldecas4","te_aldecas5","prt_fild08a","prt_fild08b","prt_fild08c","prt_fild08d","izlude_a","izlude_b","izlude_c","izlude_d","te_prt_gld","te_alde_gld","teg_dun01","teg_dun02","1@gl_k","2@gl_k","gl_chyard_","gl_cas02_","evt_bomb","1@def01","1@def02","1@def03","1@gef","1@face","1@sara","1@gef_in","dali","dali02","1@ge_st","1@spa","1@tnm1","1@tnm2","1@tnm3","1@dth1","1@dth2","1@dth3","1@eom","1@jtb","1@rev","1@xm_d","moro_cav","moro_vol","silk_lair","c_tower2_","c_tower3_","1@mcd","ver_eju","ver_tunn","verus03","verus04","job_gun","1@air1","1@air2","1@glast","lhz_dun_n","lhz_d_n2","1@gl_kh","2@gl_kh","1@lab","1@uns","un_bk_q","un_bunker","un_myst","verus01","verus02","paramk","1@infi","1@ffp","1@mir","2@mir","1@sthb","1@sthc","1@sthd","prt_cas","prt_cas_q","prt_prison","prt_lib","prt_lib_q","prt_q","prt_pri00","int_land","int_land01","int_land02","int_land03","int_land04","lasagna","lasa_fild01","lasa_fild02","lasa_dun01","lasa_dun02","lasa_dun03","conch_in","lasa_in01","lasa_dun_q","1@pop1","1@pop2","1@pop3","1@slw","1@swat","que_swat","slabw01","rebel_in","1@md_gef","1@md_pay","har_in01","harboro1","harboro2","rockmi1","rockmi2","rockrdg1","rockrdg2","1@gl_k2","2@gl_k2","1@xm_d2","pay_d03_i","gef_d01_i","ice_d03_i","1@tre","1@begi","tur_d03_i","tur_d04_i","1@crd","ordeal_a00","ordeal_a02","pprontera","niflxmas","sch_lab","nakhyang","lasa_sea","1@drdo","x_lhz","x_prt","x_ra","prt_evt_in","vis_h01","vis_h02","vis_h03","vis_h04","ein_d02_i","com_d02_i","1@soul","star_frst","star_in","2009rwc_01","2009rwc_02","2009rwc_03","2009rwc_04","2009rwc_05","2009rwc_06","2009rwc_07","2009rwc_08","2009rwc_f01","2012rwc_01","2012rwc_02","2012rwc_03","2012rwc_04","2012rwc_05","2012rwc_06","2012rwc_07","2012rwc_08"; .@size = getarraysize(.map$); for ( .@i = 0; .@i < .@size; ++.@i ) setmapflag .@map$[.@i], mf_novending; end; }
take me less than 10 minutes
EDIT: no idea why change .map$ into .@map$ fix the error ... hmm ... something wrong with rathena
- 1
- 1
-
this is server side, you post wrong section
https://github.com/HerculesWS/Hercules/pull/2358yup this problem also happens in hercules, thanks for reporting ~EDIT: apparently, just type /showname will display correctly
or when diff the client, disable one of the recommend, "Enable /showname"
-
11 hours ago, Seravy said:
Actually, if you're fine with patches and don't want a branch pushed to some remote like the guys on that last project did then I can do that anytime if you tell me how. Currently I have all the stuff related to that autopilot feature in separate commits from other changes. So all I need is, how to tell git "I want a patch that is these 15 commits and not those 50 others"? I see "create patch serial" but no idea how to use it, doesn't even seem to list my commits. (btw so far all 1st classes are working and also priest and wizard. Other 2nd jobs I haven't done yet. It'll take a long while, I need to actually relearn how to play those classes)
create branch, that's also where most people done wrong
make sure your fork main branch is the same with rathena main branch
https://github.com/rathena/rathena <-- at the top right side, there is a [Fork]
then git pull your fork repo1. your fork main branch should be the same as rathena main branch
2. create a live branch in your fork that you are currently playing in
3. create another branch in your fork for this projectin other words, your fork repo should have 3 branch
so after you had enough fun in your branch, just commit a patch from your playing branch into another branch that push into github.com
then we can download your fork branch with the [Compare] button on the githubI hope I don't do another screenshot guide, its very time taxing, I'm sure you understand things fast
-
healing item doesn't have unique ID, only equipment has
there's no way to trace an item that can stackso to know which item used, just add something like
501,Red_Potion,Red Potion,0,50,,70,,,,,0xFFFFFFFF,63,2,,,,,,{ @itemuse = 501; itemheal rand(45,65),0; },{},{}
on every single item
or a source modification OnPCUseItemEvent ... seems its not floating in this forum
-
usually people go for setoption Option_xmas and Option_Invisible
well, if you are using Hercules, pcblock script great tooand for cell stacking, can just change the value here in battle config
battle/misc.conf// Determines max number of characters that can stack within a single cell. // Official - Only affects the walking routines of characters, including monsters. // If a unit stops walking and is on a cell with more than stack limit // characters on it, it will walk to the closest free cell. // Set to 0 for no cell stacking checks and free movement. // Custom - This variation will make every full cell to be considered a wall. // NOTE: For the custom setting to take effect you have to use a server compiled // with Cell Stack Limit support (see src/map/map.h) official_cell_stack_limit: 5
and probably a noinvitation mapflag to block friend invitation abuse
and also add pcblockskill in this script
-
10 hours ago, Seravy said:
btw, the "pull" option in visual studio 2013 didn't work, had to use the external TortoiseGit. Haven't dared to try updating the client yet. Probably should...
already looking forward to see the patch from your project ~
10 hours ago, Seravy said:Edit : client update seems to be working so far. I have the same question though, how do I merge my item description and skill description changes with it? I don't suppose I have to copy-paste the hundreds of entries manually, what tool do people use for this? (at least, comparing files shows the actual differences here...but there are many of them. Changed like 500+ items already...) ...or not, pressing alt-s instantly crashed my client. Maybe the update isn't successful at all...you have outdated skillinfolist file
download latest Asheraf client translation should fix this issueSpoilerOn 1/23/2019 at 1:07 AM, Seravy said:No, I am using renewal. It's the 6 months old version as you are already aware. So maybe this bug was fixed during these 6 months?
Let's see, https://github.com/rathena/rathena/blob/master/src/map/status.cpp
HAHAHAHA ~ that's the reason I said rAthena and Hercules used different function
I actually still thought rAthena haven't done the renewal calculation, but Hercules had done it YEARS ago
https://github.com/HerculesWS/Hercules/commit/8faef4ff7ef37f52f24ac6e1e026a418b19db1fe#diff-75b62ece08f52a7c6c3118a195e9194eR59 -
7 hours ago, Seravy said:
How do I merge my custom item descriptions (I changed the effects of about 500 standard items so far, mostly outdated, weak cards and weapons) into the new file automatically? Manual is obviously not an option for this quantity of text... how to people do this normally?
exactly what you said, and that's the reason why some server stuck at certain revision because they don't have the time to update their server files
so when they stop update the server --> server getting out of new juice --> because everyone release new stuffs only with latest server revision ->players left to join other private server to enjoy new stuffs --> server shut down ... hahaha7 hours ago, Seravy said:Also, this new client seems to show "there was an error when loading data account settings (please restart to retry)", does that mean anything? I logged in fine so there can't be a problem with loading accounts...
everyone seems to suppress this warning at msgstringtable.txt
Q > Mercenaries autoattack and Clones aspd bonuses
in Scripting Support
Posted
hmm ? you can't read the code I posted ?
mob_clone_spawn is the function to spawn a clone
no
tested with the script below, blessing and without blessing, the stat stays the same
spawn by atcommand #evilclone, no
spawn by script command, yes