OK論壇

 找回密碼
 註冊
查看: 2574|回復: 10

[疑問] 請問一下關於這些指令的功用(RFIFOB、WFIFOB...)

[複製鏈接]
  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

    發表於 2011-7-14 19:58:25 | 顯示全部樓層 |閱讀模式
    目前製作的指令中需要顯示訊息

    如你撿取道具後,對話藍會出現你撿了什麼東西這類的

    重點是可以讓玩家設定是否要顯示(對話欄右上角有可以設定ON或OFF)

    現在問題是,我不知道這些指令的功用到底是什麼...

    不知道有沒有人可以告訴我,在此先感謝您的幫助。

    1. // socket I/O macros
    2. #define RFIFOHEAD(fd)
    3. #define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0)
    4. #define RFIFOP(fd,pos) (session[fd]->rdata + session[fd]->rdata_pos + (pos))
    5. #define WFIFOP(fd,pos) (session[fd]->wdata + session[fd]->wdata_size + (pos))

    6. #define RFIFOB(fd,pos) (*(uint8*)RFIFOP(fd,pos))
    7. #define WFIFOB(fd,pos) (*(uint8*)WFIFOP(fd,pos))
    8. #define RFIFOW(fd,pos) (*(uint16*)RFIFOP(fd,pos))
    9. #define WFIFOW(fd,pos) (*(uint16*)WFIFOP(fd,pos))
    10. #define RFIFOL(fd,pos) (*(uint32*)RFIFOP(fd,pos))
    11. #define WFIFOL(fd,pos) (*(uint32*)WFIFOP(fd,pos))
    12. #define RFIFOQ(fd,pos) (*(uint64*)RFIFOP(fd,pos))
    13. #define WFIFOQ(fd,pos) (*(uint64*)WFIFOP(fd,pos))
    14. #define RFIFOSPACE(fd) (session[fd]->max_rdata - session[fd]->rdata_size)
    15. #define WFIFOSPACE(fd) (session[fd]->max_wdata - session[fd]->wdata_size)

    16. #define RFIFOREST(fd)  (session[fd]->flag.eof ? 0 : session[fd]->rdata_size - session[fd]->rdata_pos)
    17. #define RFIFOFLUSH(fd) \
    18.         do { \
    19.                 if(session[fd]->rdata_size == session[fd]->rdata_pos){ \
    20.                         session[fd]->rdata_size = session[fd]->rdata_pos = 0; \
    21.                 } else { \
    22.                         session[fd]->rdata_size -= session[fd]->rdata_pos; \
    23.                         memmove(session[fd]->rdata, session[fd]->rdata+session[fd]->rdata_pos, session[fd]->rdata_size); \
    24.                         session[fd]->rdata_pos = 0; \
    25.                 } \
    26.         } while(0)

    27. // buffer I/O macros
    28. #define RBUFP(p,pos) (((uint8*)(p)) + (pos))
    29. #define RBUFB(p,pos) (*(uint8*)RBUFP((p),(pos)))
    30. #define RBUFW(p,pos) (*(uint16*)RBUFP((p),(pos)))
    31. #define RBUFL(p,pos) (*(uint32*)RBUFP((p),(pos)))
    32. #define RBUFQ(p,pos) (*(uint64*)RBUFP((p),(pos)))

    33. #define WBUFP(p,pos) (((uint8*)(p)) + (pos))
    34. #define WBUFB(p,pos) (*(uint8*)WBUFP((p),(pos)))
    35. #define WBUFW(p,pos) (*(uint16*)WBUFP((p),(pos)))
    36. #define WBUFL(p,pos) (*(uint32*)WBUFP((p),(pos)))
    37. #define WBUFQ(p,pos) (*(uint64*)WBUFP((p),(pos)))

    38. #define TOB(n) ((uint8)((n)&UINT8_MAX))
    39. #define TOW(n) ((uint16)((n)&UINT16_MAX))
    40. #define TOL(n) ((uint32)((n)&UINT32_MAX))
    複製代碼
    回復

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-17 16:57:59 | 顯示全部樓層
    r開頭 讀取rdata(recv資料)
    w開頭 寫入wdata(send資料)

    至於後面的W L Q 依型態而定
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-17 17:00:44 | 顯示全部樓層
    補上

    RFIFOFLUSH
    清空讀取資料
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-17 18:51:43 | 顯示全部樓層
    本帖最後由 he01204046 於 2011-7-17 06:53 PM 編輯

    好吧,我承認我看不懂...

    不知道能不能舉個例子,例如這個刪除物品的部分,中間的WFIDXXX,它的作用是什麼,整個程式的解釋...

    麻煩您了,在此先謝謝您。

    1. int clif_delitem(struct map_session_data *sd,int n,int amount, short reason)
    2. {
    3. #if PACKETVER < 20091117
    4.         return clif_dropitem(sd,n,amount);
    5. #else
    6.         int fd;

    7.         nullpo_ret(sd);
    8.         
    9.         if (reason == 7)
    10.                 return clif_dropitem(sd,n,amount);

    11.         fd=sd->fd;
    12.         
    13.         WFIFOHEAD(fd, packet_len(0x7fa));
    14.         WFIFOW(fd,0)=0x7fa;
    15.         WFIFOW(fd,2)=reason;
    16.         WFIFOW(fd,4)=n+2;
    17.         WFIFOW(fd,6)=amount;
    18.         WFIFOSET(fd,packet_len(0x7fa));

    19.         return 0;
    20. #endif
    21. }
    複製代碼
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-19 17:18:32 | 顯示全部樓層
    本帖最後由 Alopex 於 2011-7-19 05:36 PM 編輯

    回復 4# he01204046


       總括來說,就是寫入一個封包,讓客戶端顯示物品已經移除

    詳細點:

    1. WFIFOHEAD(fd, packet_len(0x7fa));//設定封包大小
    2.         WFIFOW(fd,0)=0x7fa;//封包開頭位置0放入0x7fa
    3.         WFIFOW(fd,2)=reason;//封包第2位置放入reason
    4.         WFIFOW(fd,4)=n+2;//依序
    5.         WFIFOW(fd,6)=amount;//同上...
    6.         WFIFOSET(fd,packet_len(0x7fa));//你可以當作送出封包(其實不只)..
    複製代碼
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-20 00:14:56 | 顯示全部樓層
    恩,感謝回答

    尚有一些問題,就是客戶端要怎麼知道我是要刪物品還是要加物品?

    利用封包大小?


    不知道這個算不算問題了= =

    我寫一個給一的道具到手推車中的指令

    使用後可以成功給予,但是被給予的玩家沒有訊息提示出現他得到了一個物品

    然後我使用了

    snprintf(atcmd_output, sizeof atcmd_output, "獲得了物品【%s】並自動存入手推車。",name);
    clif_displaymessage(sd->fd, atcmd_output);

    這種方式來顯示訊息

    但是問題來了,玩家抗議會有洗頻的問題

    希望可以像撿取物品所顯示的訊息那樣,可以自己決定是否關掉顯示

    恩,結論是,這有辦法做到嗎?

    恩,我的問題真多,很抱歉,但是還是希望能請您幫個忙,再次感謝您。
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    擦汗
    2014-8-13 07:23 AM
  • 簽到天數: 109 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-20 06:07:14 | 顯示全部樓層
    回復 6# he01204046

    不是很了解源碼

    但是我覺得可以加入一個事件標籤

    然後用腳本控制之類的= =

    或是

    if (pc_readglobalreg_str( sd, "cart_show"))

    snprintf(atcmd_output, sizeof atcmd_output, "獲得了物品【%s】並自動存入手推車。",name);


    然後腳本
    set cart_show,1; //顯示

    set cart_show,0; //不顯示

    個人淺見
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-20 13:56:10 | 顯示全部樓層
    回復 6# he01204046


       如上方法解決。
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-20 14:03:14 | 顯示全部樓層
    回復  he01204046

    不是很了解源碼

    但是我覺得可以加入一個事件標籤

    然後用腳本控制之類的= =

    ...
    sense 發表於 2011-7-20 06:07 AM



       
    恩,我也有想過這方法,但是卻想不到要如何去提取玩家的變數資料

    原來可以用這方式來提取,感謝解答,我也又學到新的方法了~
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-20 14:08:58 | 顯示全部樓層
    本帖最後由 Alopex 於 2011-7-20 02:15 PM 編輯

    回復 7# sense


       糾正一下
    pc_readglobalreg_str用來讀取字符變量..


    pc_readglobalreg用來讀取數字變量
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    擦汗
    2014-8-13 07:23 AM
  • 簽到天數: 109 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-20 14:12:32 | 顯示全部樓層
    回復 10# Alopex


    恩,對= =
    我直接用複製的沒去注意

    感謝白狐大大糾正
    回復 支持 反對

    使用道具 舉報

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

    本版積分規則

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

    GMT+8, 2024-5-7 02:55 AM , Processed in 0.051825 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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