- Cleaned up getmapxy script function, also added support for type 4 so that it returns a player's homunculus position if such exists.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8459 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2006-08-23 20:27:24 +00:00
parent a288f9c512
commit db3fdbe23b
2 changed files with 96 additions and 109 deletions

View File

@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/08/23 2006/08/23
* Cleaned up getmapxy script function, also added support for type 4 so
that it returns a player's homunculus position if such exists. [Skotlex]
* SC_ARMOR_ELEMENT looks like gone away from status_change_start since ... rev 6791. * SC_ARMOR_ELEMENT looks like gone away from status_change_start since ... rev 6791.
Try to reimplement it. [Toms] Try to reimplement it. [Toms]
* Fixed HVAN_EXPLOSION [Skotlex] * Fixed HVAN_EXPLOSION [Skotlex]

View File

@ -10470,6 +10470,7 @@ int buildin_getsavepoint(struct script_state *st)
* 1 - NPC coord * 1 - NPC coord
* 2 - Pet coord * 2 - Pet coord
* 3 - Mob coord (not released) * 3 - Mob coord (not released)
* 4 - Homun coord
* CharName$ - Name object. If miss or "this" the current object * CharName$ - Name object. If miss or "this" the current object
* *
* Return: * Return:
@ -10478,9 +10479,8 @@ int buildin_getsavepoint(struct script_state *st)
*------------------------------------------ *------------------------------------------
*/ */
int buildin_getmapxy(struct script_state *st){ int buildin_getmapxy(struct script_state *st){
struct block_list *bl = NULL;
struct map_session_data *sd=NULL; struct map_session_data *sd=NULL;
struct npc_data *nd;
struct pet_data *pd;
int num; int num;
char *name; char *name;
@ -10490,126 +10490,111 @@ int buildin_getmapxy(struct script_state *st){
char mapname[MAP_NAME_LENGTH+1]; char mapname[MAP_NAME_LENGTH+1];
memset(mapname, 0, sizeof(mapname)); memset(mapname, 0, sizeof(mapname));
if( st->stack->stack_data[st->start+2].type!=C_NAME ){ if( st->stack->stack_data[st->start+2].type!=C_NAME ){
ShowWarning("script: buildin_getmapxy: not mapname variable\n"); ShowWarning("script: buildin_getmapxy: not mapname variable\n");
push_val(st->stack,C_INT,-1); push_val(st->stack,C_INT,-1);
return 0; return 1;
} }
if( st->stack->stack_data[st->start+3].type!=C_NAME ){ if( st->stack->stack_data[st->start+3].type!=C_NAME ){
ShowWarning("script: buildin_getmapxy: not mapx variable\n"); ShowWarning("script: buildin_getmapxy: not mapx variable\n");
push_val(st->stack,C_INT,-1); push_val(st->stack,C_INT,-1);
return 0; return 1;
} }
if( st->stack->stack_data[st->start+4].type!=C_NAME ){ if( st->stack->stack_data[st->start+4].type!=C_NAME ){
ShowWarning("script: buildin_getmapxy: not mapy variable\n"); ShowWarning("script: buildin_getmapxy: not mapy variable\n");
push_val(st->stack,C_INT,-1); push_val(st->stack,C_INT,-1);
return 0; return 1;
} }
//??????????? >>> Possible needly check function parameters on C_STR,C_INT,C_INT <<< ???????????// //??????????? >>> Possible needly check function parameters on C_STR,C_INT,C_INT <<< ???????????//
type=conv_num(st,& (st->stack->stack_data[st->start+5])); type=conv_num(st,& (st->stack->stack_data[st->start+5]));
switch (type){ switch (type){
case 0: //Get Character Position case 0: //Get Character Position
if( st->end>st->start+6 ) if( st->end>st->start+6 )
sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6]))); sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
else else
sd=script_rid2sd(st); sd=script_rid2sd(st);
if ( sd==NULL ) { //wrong char name or char offline if (sd)
push_val(st->stack,C_INT,-1); bl = &sd->bl;
return 0; break;
} case 1: //Get NPC Position
if( st->end > st->start+6 )
{
struct npc_data *nd;
nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+6])));
if (nd)
bl = &nd->bl;
} else //In case the origin is not an npc?
bl=map_id2bl(st->oid);
break;
case 2: //Get Pet Position
if(st->end>st->start+6)
sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
else
sd=script_rid2sd(st);
if (sd && sd->pd)
bl = &sd->pd->bl;
break;
case 3: //Get Mob Position
break; //Not supported?
case 4: //Get Homun Position
if(st->end>st->start+6)
sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
else
sd=script_rid2sd(st);
x=sd->bl.x; if (sd && sd->hd)
y=sd->bl.y; bl = &sd->hd->bl;
memcpy(mapname,mapindex_id2name(sd->mapindex), MAP_NAME_LENGTH); break;
break; }
case 1: //Get NPC Position if (!bl) { //No object found.
if( st->end > st->start+6 ) push_val(st->stack,C_INT,-1);
nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+6]))); return 0;
else }
nd=(struct npc_data *)map_id2bl(st->oid);
if ( nd==NULL ) { //wrong npc name or char offline x= bl->x;
push_val(st->stack,C_INT,-1); y= bl->y;
return 0; memcpy(mapname, map[bl->m].name, MAP_NAME_LENGTH);
}
x=nd->bl.x; //Set MapName$
y=nd->bl.y; num=st->stack->stack_data[st->start+2].u.num;
memcpy(mapname, map[nd->bl.m].name, MAP_NAME_LENGTH); name=(char *)(str_buf+str_data[num&0x00ffffff].str);
break; prefix=*name;
case 2: //Get Pet Position
if( st->end>st->start+6 )
sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
else
sd=script_rid2sd(st);
if ( sd==NULL ) { //wrong char name or char offline if(not_server_variable(prefix))
push_val(st->stack,C_INT,-1); sd=script_rid2sd(st);
return 0; else
} sd=NULL;
set_reg(st,sd,num,name,(void*)mapname,st->stack->stack_data[st->start+2].ref);
pd=sd->pd; //Set MapX
num=st->stack->stack_data[st->start+3].u.num;
name=(char *)(str_buf+str_data[num&0x00ffffff].str);
prefix=*name;
if(pd==NULL){ //pet data not found if(not_server_variable(prefix))
push_val(st->stack,C_INT,-1); sd=script_rid2sd(st);
return 0; else
} sd=NULL;
x=pd->bl.x; set_reg(st,sd,num,name,(void*)x,st->stack->stack_data[st->start+3].ref);
y=pd->bl.y;
memcpy(mapname, map[pd->bl.m].name, MAP_NAME_LENGTH);
break;
case 3: //Get Mob Position //Set MapY
push_val(st->stack,C_INT,-1); num=st->stack->stack_data[st->start+4].u.num;
return 0; name=(char *)(str_buf+str_data[num&0x00ffffff].str);
default: //Wrong type parameter prefix=*name;
push_val(st->stack,C_INT,-1);
return 0;
}
//Set MapName$ if(not_server_variable(prefix))
num=st->stack->stack_data[st->start+2].u.num; sd=script_rid2sd(st);
name=(char *)(str_buf+str_data[num&0x00ffffff].str); else
prefix=*name; sd=NULL;
set_reg(st,sd,num,name,(void*)y,st->stack->stack_data[st->start+4].ref);
if(not_server_variable(prefix)) //Return Success value
sd=script_rid2sd(st); push_val(st->stack,C_INT,0);
else return 0;
sd=NULL;
set_reg(st,sd,num,name,(void*)mapname,st->stack->stack_data[st->start+2].ref);
//Set MapX
num=st->stack->stack_data[st->start+3].u.num;
name=(char *)(str_buf+str_data[num&0x00ffffff].str);
prefix=*name;
if(not_server_variable(prefix))
sd=script_rid2sd(st);
else
sd=NULL;
set_reg(st,sd,num,name,(void*)x,st->stack->stack_data[st->start+3].ref);
//Set MapY
num=st->stack->stack_data[st->start+4].u.num;
name=(char *)(str_buf+str_data[num&0x00ffffff].str);
prefix=*name;
if(not_server_variable(prefix))
sd=script_rid2sd(st);
else
sd=NULL;
set_reg(st,sd,num,name,(void*)y,st->stack->stack_data[st->start+4].ref);
//Return Success value
push_val(st->stack,C_INT,0);
return 0;
} }
/*========================================== /*==========================================