added new script commands
from jA git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1182 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
27e379f0cb
commit
9f0d5a05a8
1788
Changelog-SVN.txt
1788
Changelog-SVN.txt
File diff suppressed because it is too large
Load Diff
1771
Changelog.txt
1771
Changelog.txt
File diff suppressed because it is too large
Load Diff
@ -4760,6 +4760,27 @@ int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* グローバルメッセージ
|
||||
*------------------------------------------
|
||||
*/
|
||||
void clif_GlobalMessage(struct block_list *bl,char *message)
|
||||
{
|
||||
char buf[100];
|
||||
int len,cmd=0x8d;
|
||||
|
||||
if(!bl || !message)
|
||||
return;
|
||||
|
||||
len=strlen(message)+1;
|
||||
|
||||
WBUFW(buf,0)=cmd;
|
||||
WBUFW(buf,2)=len+8;
|
||||
WBUFL(buf,4)=bl->id;
|
||||
strncpy(WBUFP(buf,8),message,len);
|
||||
clif_send(buf,WBUFW(buf,2),bl,AREA_CHAT_WOC);
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* HPSP回復エフェクトを送信する
|
||||
*------------------------------------------
|
||||
|
@ -92,7 +92,7 @@ int clif_misceffect(struct block_list*,int); // area
|
||||
int clif_misceffect2(struct block_list *bl,int type);
|
||||
int clif_changeoption(struct block_list*); // area
|
||||
int clif_useitemack(struct map_session_data*,int,int,int); // self
|
||||
|
||||
void clif_GlobalMessage(struct block_list *bl,char *message);
|
||||
int clif_createchat(struct map_session_data*,int); // self
|
||||
int clif_dispchat(struct chat_data*,int); // area or fd
|
||||
int clif_joinchatfail(struct map_session_data*,int); // self
|
||||
|
@ -915,6 +915,32 @@ int npc_checknear(struct map_session_data *sd,int id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* NPCのオープンチャット発言
|
||||
*------------------------------------------
|
||||
*/
|
||||
int npc_globalmessage(const char *name,char *mes)
|
||||
{
|
||||
struct npc_data *nd=strdb_search(npcname_db,name);
|
||||
char temp[100];
|
||||
char ntemp[50];
|
||||
char *ltemp;
|
||||
|
||||
if(nd==NULL) return 0;
|
||||
if(name==NULL) return 0;
|
||||
|
||||
ltemp=strchr(name,'#');
|
||||
if(ltemp!=NULL) {
|
||||
strncpy(ntemp,name,ltemp - name); // 123#456 の # から後ろを削除する
|
||||
ntemp[ltemp - name]=0x00; // strncpy のバグ?使い方間違ってる?
|
||||
}
|
||||
|
||||
snprintf(temp, sizeof temp ,"%s : %s",ntemp,mes);
|
||||
clif_GlobalMessage(&nd->bl,temp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* クリック時のNPC処理
|
||||
*------------------------------------------
|
||||
|
@ -26,6 +26,7 @@ int npc_buylist(struct map_session_data *,int,unsigned short *);
|
||||
int npc_selllist(struct map_session_data *,int,unsigned short *);
|
||||
int npc_parse_mob(char *w1,char *w2,char *w3,char *w4);
|
||||
int npc_parse_warp(char *w1,char *w2,char *w3,char *w4);
|
||||
int npc_globalmessage(const char *name,char *mes);
|
||||
|
||||
int npc_enable(const char *name,int flag);
|
||||
struct npc_data* npc_name2id(const char *name);
|
||||
|
276
src/map/script.c
276
src/map/script.c
@ -308,6 +308,16 @@ int buildin_isnight(struct script_state *st); // [celest]
|
||||
int buildin_isday(struct script_state *st); // [celest]
|
||||
int buildin_isequipped(struct script_state *st); // [celest]
|
||||
int buildin_isequippedcnt(struct script_state *st); // [celest]
|
||||
int buildin_getusersname(struct script_state *st); //jA commands added [Lupus]
|
||||
int buildin_dispbottom(struct script_state *st);
|
||||
int buildin_recovery(struct script_state *st);
|
||||
int buildin_getpetinfo(struct script_state *st);
|
||||
int buildin_checkequipedcard(struct script_state *st);
|
||||
int buildin_globalmes(struct script_state *st);
|
||||
int buildin_jump_zero(struct script_state *st);
|
||||
int buildin_select(struct script_state *st);
|
||||
int buildin_getmapmobs(struct script_state *st); //jA addition end
|
||||
|
||||
|
||||
void push_val(struct script_stack *stack,int type,int val);
|
||||
int run_func(struct script_state *st);
|
||||
@ -550,6 +560,15 @@ struct {
|
||||
{buildin_deactivatepset, "deactivatepset", "i"}, // Deactive a pattern set [MouseJstr]
|
||||
{buildin_deletepset, "deletepset", "i"}, // Delete a pattern set [MouseJstr]
|
||||
#endif
|
||||
{buildin_dispbottom,"dispbottom","s"}, //added from jA [Lupus]
|
||||
{buildin_getusersname,"getusersname","*"},
|
||||
{buildin_recovery,"recovery",""},
|
||||
{buildin_getpetinfo,"getpetinfo","i"},
|
||||
{buildin_checkequipedcard,"checkequipedcard","i"},
|
||||
{buildin_jump_zero,"jump_zero","ii"}, //for future jA script compatibility
|
||||
{buildin_select,"select","*"}, //for future jA script compatibility
|
||||
{buildin_globalmes,"globalmes","s*"},
|
||||
{buildin_getmapmobs,"getmapmobs","s"}, //end jA addition
|
||||
{NULL,NULL,NULL},
|
||||
};
|
||||
|
||||
@ -4139,6 +4158,25 @@ int buildin_getusers(struct script_state *st)
|
||||
push_val(st->stack,C_INT,val);
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
* Works like @WHO - displays all online users names in window
|
||||
*------------------------------------------
|
||||
*/
|
||||
int buildin_getusersname(struct script_state *st)
|
||||
{
|
||||
struct map_session_data *pl_sd = NULL;
|
||||
int i=0,disp_num=1;
|
||||
|
||||
for (i=0;i<fd_max;i++)
|
||||
if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){
|
||||
if( !(battle_config.hide_GM_session && pc_isGM(pl_sd)) ){
|
||||
if((disp_num++)%10==0)
|
||||
clif_scriptnext(script_rid2sd(st),st->oid);
|
||||
clif_scriptmes(script_rid2sd(st),st->oid,pl_sd->status.name);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
* マップ指定ユーザー数所得
|
||||
*------------------------------------------
|
||||
@ -4552,6 +4590,29 @@ int buildin_waitingroom(struct script_state *st)
|
||||
limit,pub,trigger,name,strlen(name)+1,ev);
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
* Works like 'announce' but outputs in the common chat window
|
||||
*------------------------------------------
|
||||
*/
|
||||
int buildin_globalmes(struct script_state *st)
|
||||
{
|
||||
struct block_list *bl = map_id2bl(st->oid);
|
||||
struct npc_data *nd = (struct npc_data *)bl;
|
||||
char *name=NULL,*mes;
|
||||
|
||||
mes=conv_str(st,& (st->stack->stack_data[st->start+2])); // メッセージの取得
|
||||
if(mes==NULL) return 0;
|
||||
|
||||
if(st->end>st->start+3){ // NPC名の取得(123#456)
|
||||
name=conv_str(st,& (st->stack->stack_data[st->start+3]));
|
||||
} else {
|
||||
name=nd->name;
|
||||
}
|
||||
|
||||
npc_globalmessage(name,mes); // グローバルメッセージ送信
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
* npcチャット削除
|
||||
*------------------------------------------
|
||||
@ -6116,6 +6177,221 @@ int buildin_gmcommand(struct script_state *st)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Displays a message for the player only (like system messages like "you got an apple" )
|
||||
*------------------------------------------
|
||||
*/
|
||||
int buildin_dispbottom(struct script_state *st)
|
||||
{
|
||||
struct map_session_data *sd=script_rid2sd(st);
|
||||
char *message;
|
||||
message=conv_str(st,& (st->stack->stack_data[st->start+2]));
|
||||
if(sd)
|
||||
clif_disp_onlyself(sd,message,strlen(message));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* All The Players Full Recovery
|
||||
(HP/SP full restore and resurrect if need)
|
||||
*------------------------------------------
|
||||
*/
|
||||
int buildin_recovery(struct script_state *st)
|
||||
{
|
||||
int i = 0;
|
||||
for (i = 0; i < fd_max; i++) {
|
||||
if (session[i]){
|
||||
struct map_session_data *sd = session[i]->session_data;
|
||||
if (sd && sd->state.auth) {
|
||||
sd->status.hp = sd->status.max_hp;
|
||||
sd->status.sp = sd->status.max_sp;
|
||||
clif_updatestatus(sd, SP_HP);
|
||||
clif_updatestatus(sd, SP_SP);
|
||||
if(pc_isdead(sd)){
|
||||
pc_setstand(sd);
|
||||
clif_resurrection(&sd->bl, 1);
|
||||
}
|
||||
clif_displaymessage(sd->fd,"You have been recovered!");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
* Get your pet info: getpetinfo(n)
|
||||
* n -> 0:pet_id 1:pet_class 2:pet_name
|
||||
3:friendly 4:hungry
|
||||
*------------------------------------------
|
||||
*/
|
||||
int buildin_getpetinfo(struct script_state *st)
|
||||
{
|
||||
struct map_session_data *sd=script_rid2sd(st);
|
||||
int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
|
||||
|
||||
if(sd && sd->status.pet_id){
|
||||
switch(type){
|
||||
case 0:
|
||||
push_val(st->stack,C_INT,sd->status.pet_id);
|
||||
break;
|
||||
case 1:
|
||||
if(sd->pet.class_)
|
||||
push_val(st->stack,C_INT,sd->pet.class_);
|
||||
else
|
||||
push_val(st->stack,C_INT,0);
|
||||
break;
|
||||
case 2:
|
||||
if(sd->pet.name)
|
||||
push_str(st->stack,C_STR,sd->pet.name);
|
||||
else
|
||||
push_val(st->stack,C_INT,0);
|
||||
break;
|
||||
case 3:
|
||||
//if(sd->pet.intimate)
|
||||
push_val(st->stack,C_INT,sd->pet.intimate);
|
||||
break;
|
||||
case 4:
|
||||
//if(sd->pet.hungry)
|
||||
push_val(st->stack,C_INT,sd->pet.hungry);
|
||||
break;
|
||||
default:
|
||||
push_val(st->stack,C_INT,0);
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
push_val(st->stack,C_INT,0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
* Shows wether your inventory(and equips) contain
|
||||
selected card or not.
|
||||
checkequipedcard(4001);
|
||||
*------------------------------------------
|
||||
*/
|
||||
int buildin_checkequipedcard(struct script_state *st)
|
||||
{
|
||||
struct map_session_data *sd=script_rid2sd(st);
|
||||
int n,i,c=0;
|
||||
c=conv_num(st,& (st->stack->stack_data[st->start+2]));
|
||||
|
||||
if(sd){
|
||||
for(i=0;i<MAX_INVENTORY;i++){
|
||||
if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].amount){
|
||||
for(n=0;n<4;n++){
|
||||
if(sd->status.inventory[i].card[n]==c){
|
||||
push_val(st->stack,C_INT,1);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
push_val(st->stack,C_INT,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int buildin_jump_zero(struct script_state *st) {
|
||||
int sel;
|
||||
sel=conv_num(st,& (st->stack->stack_data[st->start+2]));
|
||||
if(!sel) {
|
||||
int pos;
|
||||
if( st->stack->stack_data[st->start+3].type!=C_POS ){
|
||||
printf("script: jump_zero: not label !\n");
|
||||
st->state=END;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pos=conv_num(st,& (st->stack->stack_data[st->start+3]));
|
||||
st->pos=pos;
|
||||
st->state=GOTO;
|
||||
// printf("script: jump_zero: jumpto : %d\n",pos);
|
||||
} else {
|
||||
// printf("script: jump_zero: fail\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int buildin_select(struct script_state *st)
|
||||
{
|
||||
char *buf;
|
||||
int len,i;
|
||||
struct map_session_data *sd;
|
||||
|
||||
sd=script_rid2sd(st);
|
||||
|
||||
if(sd->state.menu_or_input==0){
|
||||
st->state=RERUNLINE;
|
||||
sd->state.menu_or_input=1;
|
||||
for(i=st->start+2,len=16;i<st->end;i++){
|
||||
conv_str(st,& (st->stack->stack_data[i]));
|
||||
len+=strlen(st->stack->stack_data[i].u.str)+1;
|
||||
}
|
||||
buf=(char *)aCalloc(len,sizeof(char));
|
||||
buf[0]=0;
|
||||
for(i=st->start+2,len=0;i<st->end;i++){
|
||||
strcat(buf,st->stack->stack_data[i].u.str);
|
||||
strcat(buf,":");
|
||||
}
|
||||
clif_scriptmenu(script_rid2sd(st),st->oid,buf);
|
||||
free(buf);
|
||||
} else if(sd->npc_menu==0xff){ // cansel
|
||||
sd->state.menu_or_input=0;
|
||||
st->state=END;
|
||||
} else {
|
||||
pc_setreg(sd,add_str("l15"),sd->npc_menu);
|
||||
pc_setreg(sd,add_str("@menu"),sd->npc_menu);
|
||||
sd->state.menu_or_input=0;
|
||||
push_val(st->stack,C_INT,sd->npc_menu);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* GetMapMobs
|
||||
returns mob counts on a set map:
|
||||
e.g. GetMapMobs("prontera.gat")
|
||||
use "this" - for player's map
|
||||
*------------------------------------------
|
||||
*/
|
||||
int buildin_getmapmobs(struct script_state *st)
|
||||
{
|
||||
char *str=NULL;
|
||||
int m=-1,bx,by,i;
|
||||
int count=0,c;
|
||||
struct block_list *bl;
|
||||
|
||||
str=conv_str(st,& (st->stack->stack_data[st->start+2]));
|
||||
|
||||
if(strcmp(str,"this")==0){
|
||||
struct map_session_data *sd=script_rid2sd(st);
|
||||
if(sd)
|
||||
m=sd->bl.m;
|
||||
else{
|
||||
push_val(st->stack,C_INT,-1);
|
||||
return 0;
|
||||
}
|
||||
}else
|
||||
m=map_mapname2mapid(str);
|
||||
|
||||
if(m < 0){
|
||||
push_val(st->stack,C_INT,-1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(by=0;by<=(map[m].ys-1)/BLOCK_SIZE;by++){
|
||||
for(bx=0;bx<=(map[m].xs-1)/BLOCK_SIZE;bx++){
|
||||
bl = map[m].block_mob[bx+by*map[m].bxs];
|
||||
c = map[m].block_mob_count[bx+by*map[m].bxs];
|
||||
for(i=0;i<c && bl;i++,bl=bl->next){
|
||||
if(bl->x>=0 && bl->x<=map[m].xs-1 && bl->y>=0 && bl->y<=map[m].ys-1)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
push_val(st->stack,C_INT,count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* movenpc [MouseJstr]
|
||||
*------------------------------------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user