請問大大如何用AMXX修改武器開槍的聲音

Home Home
引用 | 編輯 z2352671213
2016-08-04 21:17
樓主
推文 x0
是這樣的。

我想把黃金AK47開槍的聲音改成M3霰彈槍開槍的聲音。

於是我在插件裏這麼寫道(只是sma的一部分):


複製程式
new const Fire_Sounds[][] = { "weapons/m3-1.wav" }
public plugin_init()
{
    RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "fw_scar_PrimaryAttack_Post", 1)
}
public fw_scar_PrimaryAttack_Post(Weapon)
{

    new id = get_pdata_cbase(Weapon, 41, 4)
    
    new szClip, szAmmo
    get_user_weapon(id, szClip, szAmmo)
    
    if(!is_user_alive(id))
        return

    if(g_HasAk[id] == true)          //如果玩家持有黃金AK,g_HasAk[玩家索引] 就是true。
    {
        if (!g_clip_ammo[id])
            return

        emit_sound(id, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

    }
}
public plugin_precache()
{
    for(new i = 0; i < sizeof Fire_Sounds; i++)
        precache_sound(Fire_Sounds[i])    
}



然而,我進入遊戲,用黃金AK47開槍,發現聲音還是AK47的聲音,完全沒有變成M3的聲音,請問大大們,這是為什麼呢?或者,請問大大們,如何才能用AMXX修改武器(如AK)開槍的聲音呢?

獻花 x0
引用 | 編輯 弒血
2016-08-05 00:04
1樓
  
下面是引用 z2352671213 於 2016-08-04 21:17 發表的 請問大大如何用AMXX修改武器開槍的聲音: 到引言文
是這樣的。
我想把黃金AK47開槍的聲音改成M3霰彈槍開槍的聲音。
於是我在插件裏這麼寫道(只是sma的一部分):

[code].......



用 register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1); 去註冊


阻絕客戶端上傳開槍資料 就可以把聲音給隔絕掉了..缺點 連traceattack的彈孔都會被阻絕..

[/pre]

獻花 x1
引用 | 編輯 z2352671213
2016-08-05 14:21
2樓
  

圖 1.


下面是引用 s8720419 於 2016-08-05 00:04 發表的 : 到引言文




用 register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1); 去註冊


阻絕客戶端上傳開槍資料 就可以把聲音給隔絕掉了..缺點 連traceattack的彈孔都會被阻絕..

[/pre]


天哪。謝謝大大!表情我在alliedmodders上找了超多方法,全都沒用,最後還是大大你的方法有用!

請問大大有重寫彈孔的方法嗎(雖然我已經加上激光特效所以無需彈孔也可以……

獻花 x0
引用 | 編輯 弒血
2016-08-05 19:16
3樓
  
下面是引用 z2352671213 於 2016-08-05 14:21 發表的 : 到引言文



天哪。謝謝大大!表情 我在alliedmodders上找了超多方法,全都沒用,最後還是大大你的方法有用!

請問大大有重寫彈孔的方法嗎(雖然我已經加上激光特效所以無需彈孔也可以……



複製程式
static Float:aimOrigin[3]; //設法取得最終子彈座標..這邊看妳要用traceattack去弄 還是..什麼方法取



engfunc(EngFunc_MessageBegin, MSG_BROADCAST, SVC_TEMPENTITY, aimOrigin, 0)
write_byte(TE_WORLDDECAL)
engfunc(EngFunc_WriteCoord,aimOrigin[0])
engfunc(EngFunc_WriteCoord,aimOrigin[1])
engfunc(EngFunc_WriteCoord,aimOrigin[2])
write_byte(random_num(41, 45)) //HL彈孔特有的spr排列 41-45是彈孔
message_end()
 
engfunc(EngFunc_MessageBegin, MSG_BROADCAST, SVC_TEMPENTITY, aimOrigin, 0)
write_byte(TE_GUNSHOTDECAL)
engfunc(EngFunc_WriteCoord,aimOrigin[0])
engfunc(EngFunc_WriteCoord,aimOrigin[1])
engfunc(EngFunc_WriteCoord,aimOrigin[2])
write_short(attacker) //使用者
write_byte(random_num(41, 45)) // HL彈孔特有的spr排列 41-45是彈孔
message_end()



獻花 x0
引用 | 編輯 z2352671213
2016-08-05 22:59
4樓
  
下面是引用 s8720419 於 2016-08-05 19:16 發表的 : 到引言文


[code]static Float:aimOrigin[3]; //設法取得最終子彈座標..這邊看妳要用traceattack去弄 還是..什麼方法取

.......


大大,那個能把聲音和彈孔都阻絕的東西,沒辦法阻絕子彈傷害。雖然開槍沒有彈孔,但是被準星瞄準的人還是會受到子彈傷害,有沒有辦法把子彈傷害也隔絕掉?(像dias寫的plasma gun那種槍那樣,就把子彈傷害隔絕了,但是我沒看懂他是怎麼做到的。我試過    RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage"),但是這東西有時候會不起作用……他用的也不是註冊ham_takadamage的方法)。

獻花 x0
引用 | 編輯 弒血
2016-08-05 23:11
5樓
  
[hide=5]
下面是引用 z2352671213 於 2016-08-05 22:59 發表的 : 到引言文



大大,那個能把聲音和彈孔都阻絕的東西,沒辦法阻絕子彈傷害。雖然開槍沒有彈孔,但是被準星瞄準的人還是會受到子彈傷害,有沒有辦法把子彈傷害也隔絕掉。(像dias寫的plasma gun那種槍那樣,就把子彈傷害隔絕了,但是我沒看懂他是怎麼做到的。我試過    RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage"),但是這東西有時候會不起作用……他用的也不是註冊ham_takadamage的方法)。



複製程式
//這個雖然註冊再控制台有效,不過也是對玩家有用BOT是不行的..
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage") 

要用這段:↓

// 開場遊戲登入時UI開始選單,選人物UI前的設定
public client_putinserver(id) 
{
 static  classname[32], bool:debug
 pev(id, pev_classname, classname, charsmax(classname))

 if(!equal(classname,"player") && !debug)
 {
 //主要是讓非player以外的id套用此task..因為bot不接受player字串? 不知道為啥...
 set_task(1.0,"_Debug", id)
 //這邊主要是阻絕效果 不要讓他set_task過多..
 debug = true
 }
}

//非玩家的ID註冊完畢後..就可以執行fw_TakeDamage這段..
public _Debug(id)
 RegisterHamFromEntity(Ham_TakeDamage, id, "fw_TakeDamage")




獻花 x0
引用 | 編輯 z2352671213
2016-08-06 21:38
6樓
  
下面是引用 s8720419 於 2016-08-05 23:11 發表的 : 到引言文
[hide=5]

[code]//這個雖然註冊再控制台有效,不過也是對玩家有用BOT是不行的..
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage") 
.......


問題並沒有解決。

因為那行 debug = true 的存在,所以插件編譯出現了錯誤。我把那行刪掉後,插件就能編譯了,但是fw_takadamage對於BOT還是完全沒有反應。


最後我用了另一種方法,就成功隔絕對BOT的子彈傷害了,詳見私人訊息。表情  

我還有個問題。如果我想繪製一條laserbeam,起始點在我的origin位置,終止點在我槍口瞄準的origin位置,那是非常簡單的。但如果我想繪製一條laserbeam,起始點在我的origin位置,方向與我槍口瞄準的方向相同,而laserbeam的長度由我自己定義(比如長度是500),我該如何做?

因為我正在寫一個武器,能夠自動探測並電擊半徑500以內的所有僵屍(這個我會寫)。我想做成如果半徑500以內沒有任何僵屍,電流就沿著準星方向飛行500單位然後終止。卻不知道(憑空飛行500單位的)該怎麼寫。


獻花 x0
引用 | 編輯 弒血
2016-08-06 23:15
7樓
  
對不起!您沒有登入,請先登入論壇


獻花 x0
引用 | 編輯 z2352671213
2016-08-07 00:03
8樓
  
下面是引用 s8720419 於 2016-08-06 23:15 發表的 : 到引言文
瀏覽此文章需要威望


謝謝大大,成功了,一條完美的長度 = 500 的電弧


不過我在編譯的時候遇到了一些小問題。

複製程式
    new vec1[3], vec2[3],float:vec3[3]

    //我聲明了三組變數
    //vec1 就是origin
    //vec3 就是aim的方向和長度
    //vec2 是vec3的整數形式,因為velocity_by_aim保存變數的形式是浮點數
    if(count == 0)    //如果探測到的僵屍數量為零
    {

        get_user_origin(id, vec1, 1)
        velocity_by_aim(id, 500, vec3)    //第691行
        for (new i;i<3;i++)
            vec2[i] = vec1[i] + floatround (vec3[i],floatround_round )   //第693行


        //以下的代碼省略................

    }




這樣子寫,插件運行起來完全沒有任何問題,也沒有報錯。可是編譯的時候,編譯器卻給出了2個warning,說691和693行tag mismatch,請問這是為什麼呢,我有什麼地方寫錯了嗎?表情
還有,如果聲明了一個bool變數,如 new bool:check,然後判斷的時候寫成if(check == true),也會tag mismatch,但是寫成if(check)或者if(check == 1)就不會,這是為什麼呢?表情

獻花 x0
引用 | 編輯 弒血
2016-08-07 00:21
9樓
  
對不起!您沒有登入,請先登入論壇


獻花 x0
引用 | 編輯 z2352671213
2016-08-07 14:34
10樓
  
下面是引用 s8720419 於 2016-08-07 00:21 發表的 : 到引言文
瀏覽此文章需要威望


謝謝大大,果然沒有warning了 表情

獻花 x0
引用 | 編輯 z2352671213
2016-08-10 12:32
11樓
  
下面是引用 s8720419 於 2016-08-07 00:21 發表的 : 到引言文
瀏覽此文章需要威望


請問,大大會修改武器的子彈數(clip)嗎?
我想把M4A1-S的子彈數改成35,於是借鑒了其他武器插件修改子彈數的方法。我發現,第一次購買M4A1-S的時候子彈數是35,但是重新裝填完後子彈數又變成30了。有什麼辦法可以把M4A1-S(或者任意槍支)的max clip改成35嗎?

表情

獻花 x0