UID140392
帖子
精華
主題
積分169
現金
積極性
威望
違規
熱心
推廣次數
閱讀權限5
註冊時間2009-3-25
在線時間 小時
最後登錄1970-1-1
TA的每日心情 | 怒 2013-5-22 12:05 AM |
---|
簽到天數: 5 天 連續簽到: 2 天 [LV.2]偶爾看看I
|
該角色x*x範圍玩家執行Script(持續的) - map.c
- static int buildin_ringscript_sub(struct block_list *bl,va_list ap)
- {
- TBL_PC* sd = (TBL_PC*)bl;
- struct script_code *code = va_arg(ap, struct script_code *);
- int use_id = va_arg(ap,int);
- int type = va_arg(ap,int);
- TBL_PC* use_sd = map_id2sd(use_id);
- if(use_sd == NULL) return 0;
- if(code != NULL){
- switch(type)
- {
- case 2:
- if(sd->status.guild_id != use_sd->status.guild_id)break;
- case 1:
- if(sd->status.party_id != use_sd->status.party_id && type != 2)break;
- case 0:
- sd->ringscript.range_script = use_sd->ringscript.range_script;
- sd->ringscript.minXrange = use_sd->ringscript.minXrange;
- sd->ringscript.minYrange = use_sd->ringscript.minXrange;
- sd->ringscript.maxXrange = use_sd->ringscript.minXrange;
- sd->ringscript.maxYrange = use_sd->ringscript.minXrange;
- sd->ringscript .trange = use_sd->ringscript.trange;
- sd->ringscript .stype =use_sd->ringscript.stype;
- sd->ringscript.use_id = use_id;
- break;
- default:
- ShowError("buildin_ringscript_sub : 一個未知的參數 (%d).\n",type);
- }
- }
- if(sd!=use_sd)
- status_calc_pc(sd,0);
- return 0;
- }
- int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick)
- {
- int x0 = bl->x, y0 = bl->y;
- struct status_change *sc = NULL;
- int moveblock = ( x0/BLOCK_SIZE != x1/BLOCK_SIZE || y0/BLOCK_SIZE != y1/BLOCK_SIZE);
- TBL_PC* sd =(TBL_PC*)bl;
- struct map_session_data *tsd=map_id2sd(sd->ringscript.use_id);
- if(tsd->ringscript.use_id ==sd->bl.id && tsd != NULL){
- map_foreachinarea(buildin_ringscript_sub, sd->bl.m,sd->bl.x-sd->ringscript.minXrange,sd->bl.y-sd->ringscript.minYrange,sd->bl.x+sd->ringscript.maxXrange,sd->bl.y+sd->ringscript.maxYrange,BL_PC, sd->ringscript .range_script,sd->bl.id,sd->ringscript .stype );
- }else if (tsd==NULL){
- sd->ringscript.range_script = NULL;
- sd->ringscript.minXrange = NULL;
- sd->ringscript.minYrange = NULL;
- sd->ringscript.maxXrange = NULL;
- sd->ringscript.maxYrange = NULL;
- sd->ringscript .trange = NULL;
- sd->ringscript .stype =NULL ;
- status_calc_pc(sd,0);
- }else if (tsd->ringscript.use_id && sd->bl.m==tsd->bl .m ){
- if(distance_xy(tsd->bl.x,tsd->bl.y,sd->bl.x,sd->bl.y)>sd->ringscript.trange)
- sd->ringscript .range_script = NULL;
- else
- sd->ringscript.range_script=tsd->ringscript.range_script;
- status_calc_pc(sd,0);
- }
- if (!bl->prev) {
- //Block not in map, just update coordinates, but do naught else.
- bl->x = x1;
- bl->y = y1;
- return 0;
- }
- .
- .
- .
- script.c
- static int buildin_ringscript_sub(struct block_list *bl,va_list ap)
- {
- TBL_PC* sd = (TBL_PC*)bl;
- struct script_code *code = va_arg(ap, struct script_code *);
- int use_id = va_arg(ap,int);
- int type = va_arg(ap,int);
- TBL_PC* use_sd = map_id2sd(use_id);
- if(use_sd == NULL) return 0;
- if(code != NULL){
- switch(type)
- {
- case 2:
- if(sd->status.guild_id != use_sd->status.guild_id)break;
- case 1:
- if(sd->status.party_id != use_sd->status.party_id && type != 2)break;
- case 0:
- sd->ringscript.range_script = use_sd->ringscript.range_script;
- sd->ringscript.minXrange = use_sd->ringscript.minXrange;
- sd->ringscript.minYrange = use_sd->ringscript.minXrange;
- sd->ringscript.maxXrange = use_sd->ringscript.minXrange;
- sd->ringscript.maxYrange = use_sd->ringscript.minXrange;
- sd->ringscript .trange = use_sd->ringscript.trange;
- sd->ringscript .stype = use_sd->ringscript.stype;
- sd->ringscript.use_id = use_id;
- break;
- default:
- ShowError("buildin_ringscript_sub : 一個未知的參數 (%d).\n",type);
- }
- }
- status_calc_pc(sd,0);
- return 0;
- }
- BUILDIN_FUNC(ringscript)
- {
- struct script_code *ring_script;
- TBL_PC* sd = script_rid2sd(st);
- const char *str = script_getstr(st,2);
- int range = script_getnum(st,3);
- int type = script_getnum(st,4);
- if( sd == NULL)
- return 0;
- ring_script = parse_script(str, "RingScript" ,0 ,0);
- if(sd->ringscript.range_script != NULL && sd->ringscript.use_id == sd->bl.id){
- struct script_code *c = sd->ringscript.range_script;
- aFree(c);
- sd->ringscript.range_script = NULL;
- }
- if( range < 1)
- return 0;
- if(range/=2)
- {
- sd->ringscript.minXrange = range;
- sd->ringscript.minYrange = range;
- sd->ringscript.maxXrange = range;
- sd->ringscript.maxYrange = range;
- }
- else
- {
- sd->ringscript.minXrange = range;
- sd->ringscript.minYrange = range;
- sd->ringscript.maxXrange = range-1;
- sd->ringscript.maxYrange = range-1;
- }
- sd->ringscript.stype = type;
- sd->ringscript.trange =range;
- sd->ringscript.use_id = sd->bl.id;
- sd->ringscript.range_script = ring_script;
- map_foreachinarea(buildin_ringscript_sub, sd->bl.m,sd->bl.x-sd->ringscript.minXrange,sd->bl.y-sd->ringscript.minYrange,sd->bl.x+sd->ringscript.maxXrange,sd->bl.y+sd->ringscript.maxYrange,BL_PC, ring_script,sd->bl.id,type);
- return 0;
- }
- BUILDIN_DEF(ringscript, "sii"),
- pc.h
- int delunit_prevline;
- struct {
- struct script_code *range_script;
- int minXrange,minYrange,maxXrange,maxYrange,trange;
- int use_id,stype;
- }ringscript;
- status.c
- int status_calc_pc_(struct map_session_data* sd, bool first)
- {
- .
- .
- .
- if(sd->ringscript.range_script != NULL)
- run_script(sd->ringscript.range_script,0,sd->bl.id,0);
- // Parse equipment.
- }
複製代碼
使用:
//範圍內玩家執行Script(玩家每次status_calc_pc_執行一次,直到原使用此腳本函數的腳色下線為止)
//ringscript "{Script}",Range,type
//Script如果是空的,將清除該script效果
//如:ringscript "{}",Range,type
//type:
//0:不限,1:同隊伍,2:同公會
ringscript "{bonus bStr,100;bonus bAgi,100;}",5,0; |
|