OK論壇

 找回密碼
 註冊
樓主: 哆啦ˇ

[教學] 【 源 碼 】 Ea源碼 - 修改源碼、技術分享 ( 第二章 )

[複製鏈接]

該用戶從未簽到

發表於 2010-3-13 19:37:20 | 顯示全部樓層
本帖最後由 gakuenro 於 2010-3-13 09:40 PM 編輯

這目前有個小問題...
就是怪物的MHP若超過32768的話
會無法正常顯示

就會像這樣
你打完32768滴的傷害,他的血條已經見底了可是還不會死
因為他實際的血量不只32768

新手上路
目前還在找修正方法
不知道有沒有前輩們知道如何修改此處
------------------------------------

經過我一個小時的反覆修改(對新手來說=_=)

已經解決了

將哆啦大大原本的 clif_hpmeter_monster 修改成如下即可囉
*藍字部分為我修正的方法...

void clif_hpmeter_monster(unsigned int fd,struct mob_data *md){

if(fd==0){

struct s_mapiterator* iter;

unsigned int hp,max_hp;

TBL_PC* tsd;

iter = mapit_getallusers();

while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )

{

if(( tsd->bl.x > md->bl.x-AREA_SIZE ) && (tsd->bl.x < md->bl.x+AREA_SIZE) && ( tsd->bl.y > md->bl.y-AREA_SIZE ) && (tsd->bl.y < md->bl.y+AREA_SIZE))

{

WFIFOHEAD(tsd->fd,packet_len(0x106));

WFIFOW(tsd->fd,0) = 0x106;

WFIFOL(tsd->fd,2) = md->bl.id;
                                if (md->status.max_hp > 32768) {
                                        WFIFOW(tsd->fd,6) = md->status.hp/(md->status.max_hp/100);
                                        WFIFOW(tsd->fd,8) = 100;
                                } else {
                                        WFIFOW(tsd->fd,6) = md->status.hp;
                                        WFIFOW(tsd->fd,8) = md->status.max_hp;
                                }

WFIFOSET(tsd->fd, packet_len(0x106));

}

}

}else{

WFIFOHEAD(fd,packet_len(0x106));

WFIFOW(fd,0) = 0x106;

WFIFOL(fd,2) = md->bl.id;

WFIFOW(fd,6) = md->status.hp;

WFIFOW(fd,8) = md->status.max_hp;

WFIFOSET(fd, packet_len(0x106));

}
}
回復 支持 反對

使用道具 舉報

  • TA的每日心情
    擦汗
    2024-1-19 12:37 AM
  • 簽到天數: 2354 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

    發表於 2010-7-17 23:58:59 | 顯示全部樓層
    雖然不懂!!

    但還是看看好了~

    應該有些幫助= =
    回復 支持 反對

    使用道具 舉報

    該用戶從未簽到

    發表於 2010-8-9 01:43:37 | 顯示全部樓層
    本帖最後由 qq556644 於 2010-8-9 02:28 AM 編輯

    1>d:\eathena-project\src\map\clif.c(5996) : error C2059: 語法錯誤 : 'else'

    我沒打錯他一直說我語法錯誤=         =



    找到錯誤 了 成功 !
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2022-3-25 10:24 AM
  • 簽到天數: 259 天

    連續簽到: 1 天

    [LV.8]以壇為家I

    發表於 2010-8-13 22:55:07 | 顯示全部樓層
    本帖最後由 reasapakisa 於 2010-8-14 12:23 AM 編輯

    請問要如何改成只有點擊魔物才顯示呢?

    也就是只有確定攻擊了之後才要顯示。

    (自己依然在嘗試中。)


    已經解決!

    其他問題,如何在取消攻擊之後就不顯示?

    怎麼改成只有自己顯示?
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2010-8-15 11:28:02 | 顯示全部樓層
    本帖最後由 Alopex 於 2010-8-15 12:25 PM 編輯

    回復 19# reasapakisa


       

    1. while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
    2.    {
    3.     if(( tsd->bl.x > md->bl.x-AREA_SIZE ) && (tsd->bl.x < md->bl.x+AREA_SIZE) && ( tsd->bl.y > md->bl.y-AREA_SIZE ) && (tsd->bl.y < md->bl.y+AREA_SIZE))
    4.    
    複製代碼



    這段是向所有在附近的玩家傳送封包(視線範圍內)
    可是clif_charnameack有很多部分(絕大多數)都是伺服器主動發出的訊息

    所以在執行clif_hpmeter_monster之前
    判斷(fd!=0)//伺服器主動發出訊息

    然後clif_hpmeter_monster改成

    1. void clif_mobhp_bar(int fd,struct mob_data *md)
    2. {
    3.         WFIFOHEAD(fd,packet_len(0x106));
    4.         WFIFOW(fd,0) = 0x106;
    5.         WFIFOL(fd,2) = md->bl.id;
    6.         if( md->status.max_hp > SHRT_MAX )
    7.         {
    8.                 WFIFOW(fd,6) = md->status.hp/(md->status.max_hp/100);
    9.                 WFIFOW(fd,8) = 100;
    10.         } else {
    11.                 WFIFOW(fd,6) = md->status.hp;
    12.                 WFIFOW(fd,8) = md->status.max_hp;
    13.         }
    14.         WFIFOSET(fd, packet_len(0x106));
    15. }
    複製代碼



    這樣就夠了
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2010-8-15 11:45:57 | 顯示全部樓層
    本帖最後由 Alopex 於 2010-8-15 12:09 PM 編輯

    回復 1# 哆啦ˇ


      有一個點不太好  iter應該要釋放掉

    它不是暫存,不會自動釋放
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2022-3-25 10:24 AM
  • 簽到天數: 259 天

    連續簽到: 1 天

    [LV.8]以壇為家I

    發表於 2010-8-15 14:55:39 | 顯示全部樓層
    請問判斷(fd!=0)要加在哪裡?

    沒加的話血條不會更新嗎?
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2010-8-15 16:25:02 | 顯示全部樓層
    回復 22# reasapakisa


       不是,那是更改為只有自己看的到
    在執行clif_hpmeter_monster之前加入

    (fd==0)//這是伺服器發送消息,所以附近玩家都會看見血條
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2022-3-25 10:24 AM
  • 簽到天數: 259 天

    連續簽到: 1 天

    [LV.8]以壇為家I

    發表於 2010-8-15 17:55:08 | 顯示全部樓層
    1. void clif_mobhp_bar(int fd,struct mob_data *md)
    2. {
    3.         if(fd!=0)
    4.         {
    5.                 WFIFOHEAD(fd,packet_len(0x106));
    6.                 WFIFOW(fd,0) = 0x106;
    7.                 WFIFOL(fd,2) = md->bl.id;
    8.                 if (md->status.max_hp > SHRT_MAX)
    9.                 {
    10.                         WFIFOW(fd,6) = md->status.hp/(md->status.max_hp/100);
    11.                         WFIFOW(fd,8) = 100;
    12.                 }else{
    13.                         WFIFOW(fd,6) = md->status.hp;
    14.                         WFIFOW(fd,8) = md->status.max_hp;
    15.                 }
    16.                 WFIFOSET(fd, packet_len(0x106));
    17.         }
    18. }
    複製代碼
    只有游標移至怪物身上的人才看得到血條,但攻擊之後血條不會更新。
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2010-8-15 19:18:03 | 顯示全部樓層
    本帖最後由 Alopex 於 2010-8-15 08:58 PM 編輯

    嗯...如果血條能夠銷掉,下面這個就可以成功了(還不知道怎麼銷血條...)
    1. void clif_mobhp_bar(struct mob_data *md)
    2. {
    3.         struct s_mapiterator* iter;
    4.         TBL_PC* tsd;
    5.         iter = mapit_getallusers();
    6.         while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
    7.         {
    8.                 if((tsd->ud.target == md->bl.id) &&( tsd->bl.x > md->bl.x-AREA_SIZE ) && (tsd->bl.x < md->bl.x+AREA_SIZE) && ( tsd->bl.y > md->bl.y-AREA_SIZE ) && (tsd->bl.y < md->bl.y+AREA_SIZE))
    9.                 {
    10.                         WFIFOHEAD(tsd->fd,packet_len(0x106));
    11.                         WFIFOW(tsd->fd,0) = 0x106;
    12.                         WFIFOL(tsd->fd,2) = md->bl.id;

    13.                                if (md->status.max_hp > SHRT_MAX)
    14.                                {
    15.                                        WFIFOW(tsd->fd,6) = md->status.hp/(md->status.max_hp/100);
    16.                                        WFIFOW(tsd->fd,8) = 100;
    17.                                }else{
    18.                                        WFIFOW(tsd->fd,6) = md->status.hp;
    19.                                        WFIFOW(tsd->fd,8) = md->status.max_hp;
    20.                                }
    21.                         WFIFOSET(tsd->fd, packet_len(0x106));
    22.                         }
    23.                 }
    24.         mapit_free(iter);
    25. }



    26. mob_damage:

    27. if (!src)上面增加:
    28. clif_mobhp_bar(md);


    29. mob_heal:增加
    30. clif_mobhp_bar(md);
    複製代碼

    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2022-3-25 10:24 AM
  • 簽到天數: 259 天

    連續簽到: 1 天

    [LV.8]以壇為家I

    發表於 2010-8-16 00:42:31 | 顯示全部樓層
    這個:TBL_PC *tsd;
    改成:TBL_PC *sd, *tsd;  

    這個:if(( tsd->bl.x > md->bl.x-AREA_SIZE)....)
    改成:if(sd->status.party_id==tsd->status.party_id||
        sd->status.guild_id==tsd->status.guild_id)

    這樣是不是可以判斷是否為同工會或隊伍呢?

    請問要如何定義sd為第一個打怪的人?

    錯誤訊息「使用未初始化變數'sd'」
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2010-8-16 16:58:21 | 顯示全部樓層
    回復 26# reasapakisa


      這個本身不會傳入攻擊者資料
    如果要,就要改變一下


    mob_damage:

    clif_mobhp_bar(md,src);
    1. void clif_mobhp_bar(struct mob_data *md,struct block_list *src)
    2. {...
    3.         TBL_PC *sd = (struct map_session_data *)src;
    4.         ...
    5. }
    複製代碼
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2022-3-25 10:24 AM
  • 簽到天數: 259 天

    連續簽到: 1 天

    [LV.8]以壇為家I

    發表於 2010-8-16 20:04:05 | 顯示全部樓層
    請問
    struct block_list *src

    struct block_list *bl

    src和bl各自代表了什麼意義呢?
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2010-8-17 10:52:22 | 顯示全部樓層
    回復 28# reasapakisa


        你是指哪裡?

    那只是個宣告,實體還要看...

    如果是在mob_damage
    src表示攻擊者資料地址

    bl表示魔物(自身
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情

    2014-6-25 12:05 AM
  • 簽到天數: 15 天

    連續簽到: 1 天

    [LV.4]偶爾看看III

    發表於 2011-10-16 11:43:57 | 顯示全部樓層
    對新手來說 有點難懂 不過謝謝你的教學
    原來血條是這樣做修改的
    回復 支持 反對

    使用道具 舉報

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

    本版積分規則

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

    GMT+8, 2024-5-2 07:44 PM , Processed in 0.049708 second(s), 17 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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