OK論壇

 找回密碼
 註冊
查看: 2514|回復: 6

[分享] [轉貼+修改]Ringscript-英雄光環

[複製鏈接]
  • TA的每日心情

    2013-5-22 12:05 AM
  • 簽到天數: 5 天

    連續簽到: 2 天

    [LV.2]偶爾看看I

    發表於 2011-10-2 16:15:05 | 顯示全部樓層 |閱讀模式
    該角色x*x範圍玩家執行Script(持續的)
    1. map.c
    2. static int buildin_ringscript_sub(struct block_list *bl,va_list ap)
    3. {
    4.         TBL_PC* sd = (TBL_PC*)bl;
    5.         struct script_code *code = va_arg(ap, struct script_code *);
    6.         int use_id = va_arg(ap,int);
    7.         int type = va_arg(ap,int);
    8.         TBL_PC* use_sd = map_id2sd(use_id);
    9.         if(use_sd == NULL) return 0;
    10.         if(code != NULL){
    11.                 switch(type)
    12.                 {
    13.                         case 2:
    14.                                 if(sd->status.guild_id != use_sd->status.guild_id)break;
    15.                         case 1:
    16.                                 if(sd->status.party_id != use_sd->status.party_id && type != 2)break;
    17.                         case 0:
    18.                                 sd->ringscript.range_script = use_sd->ringscript.range_script;
    19.                                 sd->ringscript.minXrange = use_sd->ringscript.minXrange;
    20.                                 sd->ringscript.minYrange = use_sd->ringscript.minXrange;
    21.                                 sd->ringscript.maxXrange = use_sd->ringscript.minXrange;
    22.                                 sd->ringscript.maxYrange = use_sd->ringscript.minXrange;
    23.     sd->ringscript .trange = use_sd->ringscript.trange;
    24.     sd->ringscript .stype =use_sd->ringscript.stype;
    25.                                 sd->ringscript.use_id = use_id;
    26.                                 break;
    27.                         default:
    28.                                 ShowError("buildin_ringscript_sub : 一個未知的參數 (%d).\n",type);
    29.                 }
    30.         }
    31.   if(sd!=use_sd)
    32.    status_calc_pc(sd,0);
    33.         return 0;
    34. }

    35. int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick)
    36. {
    37. int x0 = bl->x, y0 = bl->y;
    38. struct status_change *sc = NULL;
    39. int moveblock = ( x0/BLOCK_SIZE != x1/BLOCK_SIZE || y0/BLOCK_SIZE != y1/BLOCK_SIZE);
    40. TBL_PC* sd =(TBL_PC*)bl;
    41. struct map_session_data *tsd=map_id2sd(sd->ringscript.use_id);
    42. if(tsd->ringscript.use_id ==sd->bl.id && tsd != NULL){
    43.   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 );
    44. }else if (tsd==NULL){
    45.          sd->ringscript.range_script = NULL;
    46.          sd->ringscript.minXrange = NULL;
    47.          sd->ringscript.minYrange = NULL;
    48.          sd->ringscript.maxXrange = NULL;
    49.          sd->ringscript.maxYrange = NULL;
    50.   sd->ringscript .trange = NULL;
    51.   sd->ringscript .stype =NULL ;
    52.   status_calc_pc(sd,0);
    53. }else if (tsd->ringscript.use_id && sd->bl.m==tsd->bl .m ){
    54.   if(distance_xy(tsd->bl.x,tsd->bl.y,sd->bl.x,sd->bl.y)>sd->ringscript.trange)
    55.    sd->ringscript .range_script = NULL;
    56.   else
    57.    sd->ringscript.range_script=tsd->ringscript.range_script;
    58.   status_calc_pc(sd,0);
    59. }
    60. if (!bl->prev) {
    61.   //Block not in map, just update coordinates, but do naught else.
    62.   bl->x = x1;
    63.   bl->y = y1;
    64.   return 0;
    65. }
    66. .
    67. .
    68. .
    69. script.c
    70. static int buildin_ringscript_sub(struct block_list *bl,va_list ap)
    71. {
    72.         TBL_PC* sd = (TBL_PC*)bl;
    73.         struct script_code *code = va_arg(ap, struct script_code *);
    74.         int use_id = va_arg(ap,int);
    75.         int type = va_arg(ap,int);
    76.         TBL_PC* use_sd = map_id2sd(use_id);
    77.         if(use_sd == NULL) return 0;
    78.         if(code != NULL){
    79.                 switch(type)
    80.                 {
    81.                         case 2:
    82.                                 if(sd->status.guild_id != use_sd->status.guild_id)break;
    83.                         case 1:
    84.                                 if(sd->status.party_id != use_sd->status.party_id && type != 2)break;
    85.                         case 0:
    86.                                 sd->ringscript.range_script = use_sd->ringscript.range_script;
    87.                                 sd->ringscript.minXrange = use_sd->ringscript.minXrange;
    88.                                 sd->ringscript.minYrange = use_sd->ringscript.minXrange;
    89.                                 sd->ringscript.maxXrange = use_sd->ringscript.minXrange;
    90.                                 sd->ringscript.maxYrange = use_sd->ringscript.minXrange;
    91.     sd->ringscript .trange = use_sd->ringscript.trange;
    92.     sd->ringscript .stype = use_sd->ringscript.stype;
    93.                                 sd->ringscript.use_id = use_id;                          
    94.                                 break;
    95.                         default:
    96.                                 ShowError("buildin_ringscript_sub : 一個未知的參數 (%d).\n",type);
    97.                 }
    98.         }
    99.         status_calc_pc(sd,0);
    100.         return 0;
    101. }
    102. BUILDIN_FUNC(ringscript)
    103. {
    104.         struct script_code *ring_script;
    105.         TBL_PC* sd = script_rid2sd(st);
    106.         const char *str = script_getstr(st,2);
    107.         int range = script_getnum(st,3);
    108.         int type = script_getnum(st,4);
    109.         if( sd == NULL)
    110.                 return 0;
    111.         ring_script = parse_script(str, "RingScript" ,0 ,0);
    112.         if(sd->ringscript.range_script != NULL && sd->ringscript.use_id == sd->bl.id){
    113.                 struct script_code *c = sd->ringscript.range_script;
    114.                 aFree(c);
    115.                 sd->ringscript.range_script = NULL;
    116.         }
    117.         if( range < 1)
    118.                 return 0;
    119.         if(range/=2)
    120.         {
    121.                 sd->ringscript.minXrange = range;
    122.                 sd->ringscript.minYrange = range;
    123.                 sd->ringscript.maxXrange = range;
    124.                 sd->ringscript.maxYrange = range;
    125.         }
    126.         else
    127.         {
    128.                 sd->ringscript.minXrange = range;
    129.                 sd->ringscript.minYrange = range;
    130.                 sd->ringscript.maxXrange = range-1;
    131.                 sd->ringscript.maxYrange = range-1;
    132.         }
    133. sd->ringscript.stype = type;
    134. sd->ringscript.trange =range;
    135.         sd->ringscript.use_id = sd->bl.id;
    136.         sd->ringscript.range_script = ring_script;
    137.         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);
    138.         return 0;
    139. }

    140. BUILDIN_DEF(ringscript, "sii"),
    141. pc.h
    142. int delunit_prevline;
    143. struct {
    144.   struct script_code *range_script;
    145.   int minXrange,minYrange,maxXrange,maxYrange,trange;
    146.   int use_id,stype;
    147.    }ringscript;
    148. status.c
    149. int status_calc_pc_(struct map_session_data* sd, bool first)
    150. {
    151. .
    152. .
    153. .
    154. if(sd->ringscript.range_script != NULL)
    155.          run_script(sd->ringscript.range_script,0,sd->bl.id,0);
    156. // Parse equipment.
    157. }
    複製代碼



    使用:
    //範圍內玩家執行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;
    回復

    使用道具 舉報

  • TA的每日心情
    慵懶
    2017-2-15 05:18 PM
  • 簽到天數: 476 天

    連續簽到: 1 天

    [LV.9]以壇為家II

    發表於 2011-10-2 22:48:10 | 顯示全部樓層
    我想知道你改了什么地方.
    求&#26631;&#35782;?!
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    慵懶
    2013-7-11 12:09 AM
  • 簽到天數: 118 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-10-4 18:02:18 | 顯示全部樓層
    本帖最後由 Alopex 於 2011-10-4 06:05 PM 編輯

    回復 2# dreamunreal


       他把我沒寫完的補齊了

    給一個讚




    (有安全疑慮,如果tsd = NULL ,會崩潰)
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2012-10-20 12:31 AM
  • 簽到天數: 305 天

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-10-4 22:12:37 | 顯示全部樓層
    回復  dreamunreal


       他把我沒寫完的補齊了

    給一個讚




    (有安全疑慮,如果tsd = NULL ...
    Alopex 發表於 2011-10-4 06:02 PM



        那樣為什麼會崩潰?

    求解釋- -.((我看不出來
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    慵懶
    2013-7-11 12:09 AM
  • 簽到天數: 118 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-10-5 17:58:17 | 顯示全部樓層
    回復 4# rgrg1234


       如果tsd是空指標,那怎麼去取ringscript.use_id?
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2012-10-20 12:31 AM
  • 簽到天數: 305 天

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-10-5 22:34:27 | 顯示全部樓層
    本帖最後由 rgrg1234 於 2011-10-5 10:47 PM 編輯

    回復 5# Alopex


    就算 sd->ringscript.use_id =0
    tsd=map_id2sd(sd->ringscript.use_id) 好像也會出現一個值
    不至於會出現空指標吧...
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    慵懶
    2013-7-11 12:09 AM
  • 簽到天數: 118 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-10-6 17:58:34 | 顯示全部樓層
    回復 6# rgrg1234


    1. struct map_session_data * map_id2sd(int id){        if (id <= 0) return NULL;        return (struct map_session_data*)idb_get(pc_db,id);}
    複製代碼
    回復 支持 反對

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 註冊

    本版積分規則

    Archiver|手機版|小黑屋|OK討論區

    GMT+8, 2024-5-2 04:35 PM , Processed in 0.049433 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回復 返回頂部 返回列表