fbef0102 / L4D2-Unlimited-Map

Original L4D2 maps are modified in this config. Create the Unlimited Map.
17 stars 4 forks source link

与C1M3激光路障有关的提示似乎并没有推送给所有玩家。 #2

Open X5005 opened 2 years ago

X5005 commented 2 years ago

貌似只有最接近激光路障(触发相关触发器)的玩家接收到了“等待60秒”的信息。

我在另一张图测试 env_instructor_hint 这个东西时也注意到了这个BUG的存在,并且这个BUG似乎同时也在C1M2给发电机灌油桶的相关提示("The generator is way too low on gas to operate the door!")中出现。

于是我想了一个比较阴间的方法:能不能将【文字提示】的触发范围设置为一个无限大的值并将其禁用,同时将相关触发器的设置变更为重新启用文字提示触发器,从而使所有位于【文字提示】触发范围(无限大的)生还者接收到相关的推送信息的“广播”呢?

例如:


add:

{
    "classname" "logic_auto"
    "OnMapSpawn" "房顶_文本提示_触发器Disable0-1"
    "OnMapSpawn" "房顶_文本提示_触发器addoutputmins -9999 -9999 -99990.1-1"
    "OnMapSpawn" "房顶_文本提示_触发器addoutputmaxs 9999 9999 99990.1-1"
    "OnMapSpawn" "房顶_文本提示_触发器addoutputsolid 20.1-1"
    "OnMapSpawn" "我是一个用来启用文字提示的触发器addoutputmins 0 -50 00-1"
    "OnMapSpawn" "我是一个用来启用文字提示的触发器addoutputmaxs 0 50 2000-1"
    "OnMapSpawn" "我是一个用来启用文字提示的触发器addoutputsolid 20-1"
}

}
    "classname" "trigger_once"
    "targetname" "我是一个用来启用文字提示的触发器";在玩家移动到addoutput定义的范围时触发该触发器
    "OnTrigger" "房顶_文本提示_触发器,Enable,,0.1,-1"
}

{
    "classname" "trigger_once"
    "targetname" "房顶_文本提示_触发器"
    "filtername" "sky_filter_survs"
    "spawnflags" "1"
    "startdisabled" "0"
    "origin" "-5945 -3228 744"
    "OnTrigger" "房顶_文本提示_逻辑中继,Trigger,,0.1,-1"
}

{
    "targetname" "房顶_文本提示_逻辑中继"
    "classname" "logic_relay"
    "spawnflags" "0"
    "startdisabled" "0"
    "OnTrigger" "房顶_文本提示,ShowHint,,0.1,-1"
}

{
    "targetname" "房顶_文本提示"
    "hint_target" "在这儿显示_房顶_文本提示"
    "hint_caption" "快跑!"
    "hint_color" "255 0 0"
    "hint_range" "10000"
    "hint_icon_onscreen" "icon_alert"
    "hint_icon_offscreen" "icon_alert_red"
    "hint_forcecaption""1"
    "hint_pulseoption" "1"
    "classname" "env_instructor_hint"
}

{
    "origin" "-5412 -17 384"
    "targetname" "在这儿显示_房顶_文本提示"
    "spawnflags" "1"
    "classname" "info_target"
}

嗯……我测试了一个类似的代码,显然它奏效了。

然而貌似有个小问题,这个触发器在镶嵌CAMERA相关代码时会导致视角切回后玩家无法移动、无法转动视角、没有第一人称手臂且无法射击。我甚至以为我电脑死机了XD。

这个问题我也测试了一下,简单来说就是不要把相关代码放进文本提示的触发器和逻辑中继(logic_relay)里。例如:

add:

{
    "classname" "logic_auto"
    "OnMapSpawn" "房顶_文本提示_触发器Disable0-1"
    "OnMapSpawn" "房顶_文本提示_触发器addoutputmins -9999 -9999 -99990.1-1"
    "OnMapSpawn" "房顶_文本提示_触发器addoutputmaxs 9999 9999 99990.1-1"
    "OnMapSpawn" "房顶_文本提示_触发器addoutputsolid 20.1-1"
    "OnMapSpawn" "我是一个用来启用文字提示的触发器addoutputmins 0 -50 00-1";被定义“无限大的触发范围”的触发器似乎会对某些代码的正常工作产生不利影响,然而这个触发器没有定义“无限大的触发范围”,因此它应该不会引起某些问题。
    "OnMapSpawn" "我是一个用来启用文字提示的触发器addoutputmaxs 0 50 2000-1"
    "OnMapSpawn" "我是一个用来启用文字提示的触发器addoutputsolid 20-1"
}

}
    "classname" "trigger_once"
    "targetname" "我是一个用来启用文字提示的触发器";在玩家移动到addoutput定义的范围时触发该触发器
    "OnTrigger" "房顶_文本提示_触发器,Enable,,0.1,-1"
    "OnTrigger" "房顶_相机镜头_逻辑中继,Trigger,,0.1,-1";显然有一些其他的代码为了正常工作而被放进了这个触发器里。
}

{
    "targetname" "房顶_相机镜头_逻辑中继";看来下面那个逻辑中继是专门为妨碍风化的粗鄙之语提供的,这个逻辑中继显然比下面那个要高雅一些。
    "classname" "logic_relay"
    "spawnflags" "0"
    "startdisabled" "0"
    "OnTrigger" "房顶_相机,Enable,,0.1,-1"
    "OnTrigger" "房顶_相机,Disable,,7.0,-1"
}

{
    "classname" "trigger_once"
    "targetname" "房顶_文本提示_触发器"
    "filtername" "sky_filter_survs"
    "spawnflags" "1"
    "startdisabled" "0"
    "origin" "-5945 -3228 744"
    "OnTrigger" "房顶_文本提示_逻辑中继,Trigger,,0.1,-1"
    ;在这里添加其他的代码可能会产生一些不可预料的后果
}

{
    "targetname" "房顶_文本提示_逻辑中继"
    "classname" "logic_relay"
    "spawnflags" "0"
    "startdisabled" "0"
    "OnTrigger" "房顶_文本提示,ShowHint,,0.1,-1"
}

{
    "targetname" "房顶_文本提示"
    "hint_target" "在这儿显示_房顶_文本提示"
    "hint_caption" "快跑!"
    "hint_color" "255 0 0"
    "hint_range" "10000"
    "hint_icon_onscreen" "icon_alert"
    "hint_icon_offscreen" "icon_alert_red"
    "hint_forcecaption""1"
    "hint_pulseoption" "1"
    "classname" "env_instructor_hint"
}

{
    "origin" "-5412 -17 384"
    "targetname" "在这儿显示_房顶_文本提示"
    "spawnflags" "1"
    "classname" "info_target"
}

总的来说,……也许不需要什么总结: 1)将HINT的相关代码(trigger_once*2和logic_relay)独立出来; 2)为HINT和其他事件按需定义触发范围(logic_auto); 3)将HINT的触发器定义为无限大范围,并将其禁用; 4)使某个事件重新启用HINT的触发器,从而实现HINT的广播; 5)没了,是不是很简单?学废了吗XD。

例如:

add:
{
    "classname" "logic_auto"
    "OnMapSpawn" "aviso_camara1_eventaddoutputmins -125 -125 00-1"
    "OnMapSpawn" "aviso_camara1_eventaddoutputmaxs 125 125 2000-1"
    "OnMapSpawn" "aviso_camara1_eventaddoutputsolid 20-1"
    "OnMapSpawn" "aviso_camara1_tiggerDisable0-1"
    "OnMapSpawn" "aviso_camara1_tiggeraddoutputmins -9999 -9999 -99990.1-1"
    "OnMapSpawn" "aviso_camara1_tiggeraddoutputmaxs 9999 9999 99990.1-1"
    "OnMapSpawn" "aviso_camara1_tiggeraddoutputsolid 20.1-1"
}

{
    "targetname" "aviso_camara1_event"
    "origin" "5384 -2624 384"
    "angles" "0 0 0"
    "model" "*148"
    "spawnflags" "1"
    "filtername" "filter_survivor"
    "classname" "trigger_once"
    "OnTrigger" "!activator,speakresponseconcept,PlayerWarnCareful,0,1"
    "OnTrigger" "director,PanicEvent,,2.5,-1"
    "OnTrigger" "camara_end,Trigger,,60,-1"
    "OnTrigger" "aviso_camara1_tigger,Enable,,0,-1"
}

{
    "classname" "trigger_once"
    "targetname" "aviso_camara1_tigger"
    "filtername" "sky_filter_survs"
    "spawnflags" "1"
    "startdisabled" "0"
    "origin" "5384 -2624 384"
    "OnTrigger" "aviso_camara1_relay,Trigger,,0.1,-1"

}

{
    "targetname" "aviso_camara1_relay"
    "classname" "logic_relay"
    "spawnflags" "0"
    "startdisabled" "0"
    "OnTrigger" "aviso_camara1,ShowHint,,0,-1"
}

{
    "targetname" "aviso_camara1"
    "hint_caption" "Wait until 60 seconds!"
    "hint_icon_onscreen" "icon_tip"
    "hint_color" "249 247 151"
    "hint_static" "1"
    "classname" "env_instructor_hint"
}

aviso_camara1.zip

不知道为什么文本编辑器的插入代码不能用,凑合一下吧XD。

C1M3的激光路障的相关代码改成这样应该就能用推送给每名生还者了,虽然我没测试过。我等会还要去给C1M3的一个电锯锯铁丝网触发警报的事件添加类似的文本提示XD。

还有就是 aviso_camara1_event 的 addoutput - min / max 的范围我还没试过有多近/多远,不过这应该不会有太大影响。

这个(c1m2_streets.zip)是我用来测试 env_instructor_hint 时反复修改出的最终代码。

在测试过程中主要通过用控制台命令 warp_all_survivors_here 传送电脑(BOTS)到附近,然后用电脑触发相关事件以测试 hint_caption 是否推送给每名生还者。

X5005 commented 2 years ago

奇怪,为什么还是会有这个BUG。我再看看。

X5005 commented 2 years ago

又测试了两次,没有出现这个BUG。奇怪。

X5005 commented 2 years ago

似乎这个BUG跟生还者的角色有关,电脑Nick在触发相关触发器时对应的文本并没有被广播

X5005 commented 2 years ago

寄,这是什么鬼BUG,同一个角色有时开图能触发有时不能。不做了,睡大觉。

fbef0102 commented 2 years ago

觸發範圍無限大覆蓋到整張地圖不是個好點子 你的想法很好但是存在很多錯誤

  1. trigger_once 是一次性物件,只要任何人碰到一次就會自己消失,所以覆蓋全場沒什麼意義
  2. env_instructor_hint 才是真正的提示訊息,會把提示訊息發給所有倖存者,設定屬性"hint_range" "0"就能全場倖存者無論多遠都能接收到,但受到很多限制影響
  1. 最好不要寫中文,容易有亂碼問題,不是每個系統都吃中文,一開始測試英文都是安全牌
X5005 commented 2 years ago

觸發範圍無限大覆蓋到整張地圖不是個好點子 你的想法很好但是存在很多錯誤

1. [trigger_once](https://developer.valvesoftware.com/wiki/Trigger_once) 是一次性物件,**只要任何人碰到一次就會自己消失**,所以覆蓋全場沒什麼意義

2. [env_instructor_hint](https://developer.valvesoftware.com/wiki/Env_instructor_hint) 才是真正的提示訊息,會把提示訊息發給所有倖存者,設定屬性`"hint_range" "0"`就能全場倖存者無論多遠都能接收到,但受到很多限制影響

* 玩家必須開始新手指導教學(esc->選項->多人連線->遊戲指導系統->啟用),否則只有他自己看不見

* 伺服器不得修改指令`sv_gameinstructor_disable`,否則全部玩家看不見

* 即使都有檢查無誤,依然受到遊戲系統影響,貌似是遊戲自己幫玩家決定要不要顯示或何時顯示

3. 最好不要寫中文,容易有亂碼問題,不是每個系統都吃中文,一開始測試英文都是[安全牌](https://baike.baidu.com/item/ASCII/309296)

trigger_once 主要是因为当玩家在 addoutput 定义的区域范围内时 trigger_multiple 会重复触发提示音。c1m1 关底的门前用的就是 trigger_multiple,然后只要一直呆在那个区域里 HINT 和相应的提示音就会重复触发。

我又看了看HINT的各种属性,也许可以将 hint_display_limit 设置为 1、将 hint_timeout 设置为 0,并和上述的全图触发器配套使用: 1)在地图生成时禁用 HINT; 2)触发器启用 HINT; 3)利用全图触发器使每名玩家都能触发 HINT,藉此使每名玩家都能够接收到信息的推送。

hint_auto_start 在某些情况下似乎不正常工作,也可能是我在查属性时忽略掉了这个东西。

这些功能以及中文换成英文的那些代码我还是过两天再看看,我还是先睡觉去了。

X5005 commented 2 years ago

觸發範圍無限大覆蓋到整張地圖不是個好點子 你的想法很好但是存在很多錯誤

1. [trigger_once](https://developer.valvesoftware.com/wiki/Trigger_once) 是一次性物件,**只要任何人碰到一次就會自己消失**,所以覆蓋全場沒什麼意義

2. [env_instructor_hint](https://developer.valvesoftware.com/wiki/Env_instructor_hint) 才是真正的提示訊息,會把提示訊息發給所有倖存者,設定屬性`"hint_range" "0"`就能全場倖存者無論多遠都能接收到,但受到很多限制影響

* 玩家必須開始新手指導教學(esc->選項->多人連線->遊戲指導系統->啟用),否則只有他自己看不見

* 伺服器不得修改指令`sv_gameinstructor_disable`,否則全部玩家看不見

* 即使都有檢查無誤,依然受到遊戲系統影響,貌似是遊戲自己幫玩家決定要不要顯示或何時顯示

3. 最好不要寫中文,容易有亂碼問題,不是每個系統都吃中文,一開始測試英文都是[安全牌](https://baike.baidu.com/item/ASCII/309296)

trigger_once 主要是因为当玩家在 addoutput 定义的区域范围内时 trigger_multiple 会重复触发提示音。c1m1 关底的门前用的就是 trigger_multiple,然后只要一直呆在那个区域里 HINT 和相应的提示音就会重复触发。

我又看了看HINT的各种属性,也许可以将 hint_display_limit 设置为 1、将 hint_timeout 设置为 0,并和上述的全图触发器配套使用: 1)在地图生成时禁用 HINT; 2)触发器启用 HINT; 3)利用全图触发器使每名玩家都能触发 HINT,藉此使每名玩家都能够接收到信息的推送。

* 设置类型为 Trigger_multiple 以免!self,kill;

* hint_display_limit 设置为 1,以免 Trigger_multiple  重复触发提示音;

* hint_timeout 设置为 0,以保证提示不会被自动关闭。

hint_auto_start 在某些情况下似乎不正常工作,也可能是我在查属性时忽略掉了这个东西。

这些功能以及中文换成英文的那些代码我还是过两天再看看,我还是先睡觉去了。

我又试了一下,似乎将 hint_display_limit 设置为 1 时仍然存在通知无法推送给所有玩家的 bug。

看了一会 env_instructor_hint 的参数,然后我试了试把 hint_display_limit 设置为 0(不限制提示的产生次数)、把 hint_instance_type 设置为 1(阻止新提示),测试后发现 c1m2 枪店房顶的 hint 能够稳定触发。

奇怪的是 c1m3 警报门前的 hint 提示有时不会被触发,而与开门有关的 hint 却能够稳定地触发。

我怀疑作为触发器的 addoutput 或基于此的触发过程存在某种形式的引擎 bug。总之,我想我找到了修复这个 bug 的替代方法……虽然有点麻烦。

——————

_用于测试 hint 的配置文件:c1m2_streets.zip_

测试方法:用 /tele 将电脑传送到 addoutput(触发器)定义的范围内,以触发 hint 的相关事件,然后看看它能不能正常工作。

测试结果:7/7 次触发。