武器定身插件BUG

Home Home
引用 | 編輯 mnbmnb5266
2014-12-15 01:41
樓主
推文 x0
插件介紹:這是一個被打就會減慢速度的插件無論是在空中還是地上都有效


BUG介紹:正常的狀態是挨打之後以極為緩慢的速度移動但是在對戰平台上加入服務器的玩家中會有10%可以在挨打之後以比較緩慢而不是極為緩慢的速度移動,如果先用沙盤建立一個遊戲再用正常的系統加入進去的話也會出現這個問題,我覺得這應該是疏漏了一些設定造成的,希望大大能幫我看看是哪裡出的問題為我指點迷津多謝您了


BUG視頻:?firsttime=47.096

本帖包含附件
檔名: zip zombiecantmove.7z   (2022-06-09 14:21 / 1 KB)   下載次數:13


獻花 x0
引用 | 編輯 mnbmnb5266
2014-12-17 00:28
1樓
  
zp_nvg_give 0               //自动给予夜视仪 [0-禁用 // 1-开启并自动打开 // 2-开启则不打开]
zp_nvg_custom 0               //开启自定义夜视仪
zp_nvg_size 0               //夜视仪的可视范围
zp_nvg_color_R 0             //僵尸的自定义夜视仪颜色 (红)
zp_nvg_color_G 0             //僵尸的自定义夜视仪颜色 (绿)
zp_nvg_color_B 0             //僵尸的自定义夜视仪颜色 (蓝)
zp_nvg_hum_color_R 0           //人类的自定义夜视仪颜色 (红)
zp_nvg_hum_color_G 0         //人类的自定义夜视仪颜色 (绿)
zp_nvg_hum_color_B 0           //人类的自定义夜视仪颜色 (蓝)
zp_nvg_nem_color_R 255         //复仇之神的自定义夜视仪颜色 (红)
zp_nvg_nem_color_G 100         //复仇之神的自定义夜视仪颜色 (绿)
zp_nvg_nem_color_B 200         //复仇之神的自定义夜视仪颜色 (蓝)
zp_flash_custom 1             //开启自定义手电筒
zp_flash_size 0.1             //手电筒照亮区域大小 (半径)
zp_flash_drain 0             //自定义手电筒电量流失 [0-无限的电量]
zp_flash_charge 0             //自定义手电筒充电速率 [0-无法充电]
zp_flash_distance 0.1           //自定义手电筒的最大距离
zp_flash_color_R 0           //自定义手电筒颜色 (红)
zp_flash_color_G 0           //自定义手电筒颜色 (绿)
zp_flash_color_B 0           //自定义手电筒颜色 (蓝)
zp_flash_show_all 0           //让玩家看到彼此的手电筒

我還發現了一個類似的BUG就是ZP主插件的夜視儀和手電設置,如果像上面那樣就不會看到自己和別人的手電但是卻有少數人可以無視這個規則他開啟的手電別人都能看到

獻花 x0
引用 | 編輯 i-c0112
2014-12-18 06:15
2樓
  
第一個BUG改好了,基本上是重寫了,原本的方法會讓玩家停在空中(在空中受到傷害的話),感覺很不科學 :P

至於BUG原因有待測試,根據描述和原碼比對,很有可能是因為
未正確註冊BOT的Ham hook


獻花 x0
引用 | 編輯 mnbmnb5266
2014-12-18 08:32
3樓
  
下面是引用 i-c0112 於 2014-12-18 06:15 發表的 : 到引言文
第一個BUG改好了,基本上是重寫了,原本的方法會讓玩家停在空中(在空中受到傷害的話),感覺很不科學 :P

至於BUG原因有待測試,根據描述和原碼比對,很有可能是因為

多謝大大幫忙,我這就去對戰平台上測試一下表情  


發現了4個問題,定身時間不支持小數點比如0.5,在挨打時向後跳會被擊退打飛(AK47)雖然我把全部擊退參數都設為了0,在向前跳躍中被擊中不會停止,如果被打中后停止移動然後垂直落下就完美了,最後就是如果先用沙盤建立一個遊戲再用正常的系統加入進去的話還會出現在挨打之後以比較緩慢而不是極為緩慢的速度移動這個問題

獻花 x0
引用 | 編輯 i-c0112
2014-12-21 15:08
4樓
  
不支援小數點大概是因為
CS內建系統 在玩家受到傷害後 回復到最大速度的間隔
解決辦法:
在插件設定的時間一到就設回最大速即可(雖然目前是設為0.8)
要改的話在59行
複製程式
fm_set_user_painshock(id, 0.8);

至於BOT的BUG依然存在 是因為個人失誤 sorry
複製程式
public task_RegisterCzBot(id)
{
    // ...

    /* bugfix: At this time, the bot entity data is initialized and thus the classname is now "player".
     * So, checking classname here is a bad idea.
    static classname[16]
    pev(id, pev_classname, classname, charsmax(classname))
    if (equal(classname, "player"))
        return
    */

    // ...
}


獻花 x0
引用 | 編輯 i-c0112
2014-12-21 15:11
5樓
  
至於擊退 似乎也是CS 內建系統
再加上 空中被擊中停止的要求

在受到攻擊後 把 XY 的 速度向量都設為 0.0
勉強算是符合條件吧.......試試看囉

獻花 x0
引用 | 編輯 mnbmnb5266
2014-12-21 18:04
6樓
  
下面是引用 i-c0112 於 2014-12-21 15:11 發表的 : 到引言文
至於擊退 似乎也是CS 內建系統
再加上 空中被擊中停止的要求

在受到攻擊後 把 XY 的 速度向量都設為 0.0
勉強算是符合條件吧.......試試看囉

您真是個熱心的大好人,對您的感謝無以言表,所有問題都得到了解決,只要在與人聯網時不出問題這就是個完美的武器屬性插件了,對於可害人可逃跑弊大於利的擊退系統來說這真是個不錯的替代品

獻花 x0
引用 | 編輯 mnbmnb5266
2014-12-22 00:33
7樓
  
下面是引用 i-c0112 於 2014-12-21 15:11 發表的 : 到引言文
至於擊退 似乎也是CS 內建系統
再加上 空中被擊中停止的要求

在受到攻擊後 把 XY 的 速度向量都設為 0.0
勉強算是符合條件吧.......試試看囉



測試結果:在原地跳躍或向擊退方向順勢跳躍時不是停止而是會被擊退打飛一點(AK47之類的大威力武器,所有擊退參數均設定為0)要是能做到在空中被打後停止移動垂直落下就太好了,以前那個武器定身插件只要能修復有時會讓其他玩家脫離規則的問題也是很不錯的

獻花 x0
引用 | 編輯 i-c0112
2014-12-23 10:48
8樓
  
[FIX]
原本是在 TraceAttack 時設定玩家的 pev_velocity 結果依然有 [CS內建的擊退]。改在 TakeDamage 就OK了
[CS內建的擊退]:
經測試 AK, M4 這兩把會有擊退,AWP反而沒有!?

現在殭屍跳起的話也不會受到[垂直方向(Z軸)的擊退]了
[垂直方向(Z軸)的擊退]:
TakeDamage 前抓取 pev_velocity , TakeDamage 後再設回


獻花 x0
引用 | 編輯 mnbmnb5266
2014-12-26 22:15
9樓
  
下面是引用 i-c0112 於 2014-12-23 10:48 發表的 : 到引言文
[FIX]





真是辛苦您了大大,進過測試空中擊退現象已經徹底消除了,但是還存在一個問題那就是加入服務器的玩家中會有10%可以在挨打之後以比較緩慢而不是極為緩慢的速度移動,剛開始我以為是BOT程序在作怪可是後來當我完全刪除BOT程序后依然會出現這種情況,還希望您能在修訂之後做出一個可以把人定在空中的版本。多謝您了表情

獻花 x0
引用 | 編輯 i-c0112
2014-12-30 22:02
10樓
  
把人定在空中的版本

本帖包含附件
檔名: zip zombiecantmove.7z   (2022-06-09 14:21 / 3 KB)   下載次數:5


獻花 x0
引用 | 編輯 mnbmnb5266
2014-12-31 11:59
11樓
  
下面是引用 i-c0112 於 2014-12-30 22:02 發表的 : 到引言文
把人定在空中的版本

最近思考了很多關於這個插件的製作流程其實只需要三步一點也不複雜

1:保留被擊中后減速和取消擊退效果的設定,2:創建并設定被打之人為特殊凌空狀態(無論空中挨打還是地上挨打都會進入此狀態,特殊凌空狀態的持續時間需要支持小數點,如果設定為普通凌空狀態那麼就會執行sv_airaccelerate這樣一旦修改此參數所有玩家都會受到影響),3:創建并設定特殊凌空狀態的專用移動參數zp_airaccelerate(只作用於挨打之人對沒有受傷的玩家沒有影響,無需支持小數點)


還請大大解決BUG后再費些心做出定在空中與不定在空中兩個版本的插件,多謝您了

獻花 x0
引用 | 編輯 i-c0112
2015-01-12 20:10
12樓
  
目前先奉上使用 "pev_maxspeed" 的版本讓人完全停止的方案

使用滯空的方法正在嘗試

本帖包含附件
檔名: zip zombiecantmove.7z   (2022-06-09 14:21 / 3 KB)   下載次數:3


獻花 x0
引用 | 編輯 mnbmnb5266
2015-01-13 02:30
13樓
  
下面是引用 i-c0112 於 2015-01-12 20:10 發表的 : 到引言文
目前先奉上使用 "pev_maxspeed" 的版本讓人完全停止的方案

使用滯空的方法正在嘗試



BUG已被修復經過測試也沒有發現其他問題,此版挨打的人無法上下移動跳躍,請大大再做出一個挨打後不限制上下移動跳躍的版本即可表情

獻花 x0
引用 | 編輯 i-c0112
2015-01-16 09:13
14樓
  
這樣可能就無法把人訂在空中囉 ( ´•̥ו̥` )

獻花 x0
引用 | 編輯 mnbmnb5266
2015-01-16 11:16
15樓
  
下面是引用 i-c0112 於 2015-01-16 09:13 發表的 : 到引言文
這樣可能就無法把人訂在空中囉 ( ´•̥ו̥` )



只要無法前後左右移動就行,山下不要限制

獻花 x0
引用 | 編輯 i-c0112
2015-01-18 08:00
16樓
  
不限制上下移動的版本

本帖包含附件
檔名: zip zombiecantmove.7z   (2022-06-09 14:21 / 3 KB)   下載次數:7


獻花 x0
引用 | 編輯 岳岳
2015-02-07 22:11
17樓
  
下面是引用 i-c0112 於 2015-01-18 08:00 發表的 : 到引言文
不限制上下移動的版本



想問一下喔...假如弒定在空中而已的話是不是可以只用TakeDamage就好了?
為何要使用兩個變數來判斷g_isalive跟g_connected?我記得內件好像已經有這兩種的判斷了
(is_user_alive(id)、is_user_connected(id))
在來是 client_putinserver 裡的 is_user_bot(id) 好像是多餘的,已經有equal(classname, "player")作玩家的判斷就不用在特意去禎測是否為BOT了 ( 因為玩家好像都在player群組,BOT也只會跑到另一個群組,所以只要判斷不是在玩家群組裡的使用者(id)並取得當前使用者(BOT)的群組名稱就會一次套用進去了)
在TakeDamage取得victim的動能以後在直接把x,y規零是否就能得到定身的效果了?
而且有讀取ZP的inc怎會需要fm_cs_get_user_team的stock來判斷隊伍?
然後我也搞不太懂為何會需要用到TraceAttack 和 PlayerPreThink ( 好像用TakeDamage就夠了? )
不過假如是用set_pev給maxspeed的話那就真的需要PlayerPreThink...
給把洞能規0的話應該就能達到定身的目的才對...
※以上純屬各種疑問,無其他之意,只想知道各自使用的用意而已

獻花 x0
引用 | 編輯 i-c0112
2015-02-10 00:01
18樓
  
下面是引用 岳岳 於 2015-02-07 22:11 發表的 : 到引言文


想問一下喔...假如弒定在空中而已的話是不是可以只用TakeDamage就好了?
為何要使用兩個變數來判斷g_isalive跟g_connected?我記得內件好像已經有這兩種的判斷了
(is_user_alive(id)、is_user_connected(id))
.......

想問一下喔...假如弒定在空中而已的話是不是可以只用TakeDamage就好了?
為何要使用兩個變數來判斷g_isalive跟g_connected?我記得內件好像已經有這兩種的判斷了
(is_user_alive(id)、is_user_connected(id))

[以變數存取而不呼叫native] 是因為 [效率] 問題
詳見下列文章:
https://forums.alliedmods.net/showthread.php?t=88792
https://forums.alliedmods.net/showpost.php?p=784091&postcount=1?p=784091&postcount=1
https://wiki.alliedmods.net/Optimizing_Plugins_(AMX_Mod_X_Scripting)#Always_Save_Results

zp 也是這樣用的喔

在來是 client_putinserver 裡的 is_user_bot(id) 好像是多餘的,已經有equal(classname, "player")作玩家的判斷就不用在特意去禎測是否為BOT了 ( 因為玩家好像都在player群組,BOT也只會跑到另一個群組,所以只要判斷不是在玩家群組裡的使用者(id)並取得當前使用者(BOT)的群組名稱就會一次套用進去了)

[client_putinserver] 裡的 [is_user_bot] 以及 [pev_classname 是否為 "player"]
嘛...聽說(对就是听说) podbot 家族的都是 跟玩家一樣 pev_classname 都是 player


在TakeDamage取得victim的動能以後在直接把x,y規零是否就能得到定身的效果了?
是的
爹麼捏 題目要求的是要持續一段時間的 (人家想要持久的)


而且有讀取ZP的inc怎會需要fm_cs_get_user_team的stock來判斷隊伍?
以防有 CS_TEAM_UNASSIGNED 的情況
這應該是很少見啦,就像是
「前面紅燈,看了看是沒有車,闖過去吧!!」
(突然不知道那裡冒出來一台車)
「靠北,這下衰小了」
(==跑馬燈==)

有點像是這種感覺
多一分小心,總是有保障的吧 (吧?

為何會需要用到TraceAttack 和 PlayerPreThink ( 好像用TakeDamage就夠了? )
假如是用set_pev給maxspeed的話那就真的需要PlayerPreThink...
PlayerPreThink 如您所說
同第二個問題的回答 持久de-su

至於 TraceAttack 之必要性...
這我也不知道(什么鬼) 當初忘了留下 comment 了 (低級失誤!?)
不過可以從 code 的邏輯推測
CS 內建的擊退是發生於 TraceAttack 和 TakeDamage 之間的
所以 你說的 "應該" 也對喔
用 TakeDamage 和 TakeDamage (post) 這兩個 "應該" 也是可以的
(但是我記得當初也是龜毛的測試過了,但是忘了結果XD 等下可以再試試)

獻花 x0