Jump to content

AnnieRuru

Members
  • Posts

    2044
  • Joined

  • Last visited

  • Days Won

    51

Posts posted by AnnieRuru

  1. hmm ? you can't read the code I posted ?
    mob_clone_spawn is the function to spawn a clone

     

    2 hours ago, utofaery said:

    4. Erm another question does clone inherit sc (status changes)?

    no

    tested with the script below, blessing and without blessing, the stat stays the same

    2 hours ago, utofaery said:

    5. Is there a way the list or check status change or stat of clone which get summon'ed?

    spawn by atcommand #evilclone, no

    spawn by script command, yes

    prontera,155,185,5	script	sjdfkshf	1_F_MARIA,{
    	if ( .cloneid ) {
    		getunitdata .cloneid, .@unitdata;
    		mes "map -> "+ mapid2name(.@unitdata[UMOB_MAPID]);
    		mes "X -> "+ .@unitdata[UMOB_X];
    		mes "Y -> "+ .@unitdata[UMOB_Y];
    		mes "str -> "+ .@unitdata[UMOB_STR];
    		mes "agi -> "+ .@unitdata[UMOB_AGI];
    		mes "vit -> "+ .@unitdata[UMOB_VIT];
    		mes "int -> "+ .@unitdata[UMOB_INT];
    		mes "dex -> "+ .@unitdata[UMOB_DEX];
    		mes "luk -> "+ .@unitdata[UMOB_LUK];
    		close;
    	}
    	getmapxy .@map$, .@x, .@y;
    	.cloneid = clone( .@map$, .@x, .@y, strnpcinfo(0)+"::OnDead", getcharid(0) );
    	end;
    OnDead:
    	.cloneid = 0;
    	end;
    }
    

     

  2. latest version is 2.4c actually
    http://upaste.me/7c9c496344829d36f

     

    52 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

    screen2019rAthena007.jpg

    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

  3. 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 getmapxy

     

    btw 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"

    • MVP 1
  4. 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...

  5. 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

    • Upvote 2
  6. 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 people

    so 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

  7. 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. lol

    LMAO !! 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 !

    • Upvote 1
  8. 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/

    screen2019rAthena006.jpg

     

    EDIT: apparently rAthena the client has a bug for char-command , the command repeat itself, due to the # symbol

    Spoiler
    
    ACMD_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;
    }

     

     

    • Love 1
  9. 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;
    }

     

    • MVP 1
    • Like 1
  10. [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#L1579

    this 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 elunium

    yes 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

  11. 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

  12. 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 timer

    prontera,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

     

  13. 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;
    }
    

     

    • Upvote 1
    • Like 1
  14. 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;
    }

     

  15. 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

    • Upvote 1
    • Love 1
  16. 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 repo

    1. 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 project

    in 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 github

    I hope I don't do another screenshot guide, its very time taxing, I'm sure you understand things fast

  17. healing item doesn't have unique ID, only equipment has
    there's no way to trace an item that can stack

    so 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

  18. usually people go for setoption Option_xmas and Option_Invisible
    well, if you are using Hercules, pcblock script great too

    and 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

  19. 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 issue

     

    Spoiler
    On 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

     

  20. 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 ... hahaha

     

     

    7 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

×
×
  • Create New...