Zh/Prop ragdoll: Difference between revisions
< Zh
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 13: | Line 13: | ||
{{note|原始版本仍可作为<code>prop_ragdoll_original</code>使用。区别在于: | {{note|原始版本仍可作为<code>prop_ragdoll_original</code>使用。区别在于: | ||
* <code>prop_ragdoll_original</code>无法通过爆炸造成碎尸 | * <code>prop_ragdoll_original</code>无法通过爆炸造成碎尸 | ||
* 如果没有在Spawnflags勾选<code>[4] Debris</code>,撬棍的攻击可以击中<code>prop_ragdoll_original</code>(由于某些原因,撬棍的攻击判定会跳过<code>prop_ragdoll</code>) | * 如果没有在Spawnflags勾选<code>[4]Debris</code>,撬棍的攻击可以击中<code>prop_ragdoll_original</code>(由于某些原因,撬棍的攻击判定会跳过<code>prop_ragdoll</code>) | ||
* <code>prop_ragdoll_original</code>没有流血效果且不会产生印花 | * <code>prop_ragdoll_original</code>没有流血效果且不会产生印花 | ||
* <code>prop_ragdoll_original</code>无法被拾取 | * <code>prop_ragdoll_original</code>无法被拾取 | ||
Line 19: | Line 19: | ||
}} | }} | ||
{{bug|<br/> | {{bug|<br/> | ||
* | * 自Steam首发版本开始,除非进行存读档,NPC尸体转换成的服务端布娃娃无法被碎尸,已碎尸的布娃娃创建的尸块也是如此,如果你需要在mod中使用服务端布娃娃,请使用[https://community.lambdageneration.com/black-mesa/post/efesc2f8cyf 该插件] | ||
* | * 自Steam首发版本开始,撬棍的攻击判定会无视/跳过服务端布娃娃 | ||
* | * 拌雷的爆炸不会导致碎尸 | ||
* | * 在多人模式中,勾选<code>[4]Debris</code> Spawnflag的布娃娃不会生成印花纹理和血迹,如果禁用此Flag,布娃娃仍然不会生成血液特效和在玩家的手臂模型上生成血迹}} | ||
}} | }} | ||
== | ==尸体布娃娃/布娃娃转换== | ||
在NPC/玩家死亡,或者接收到<code>BecomeRagdoll</code>输入的情况下,通常会创建一个'''客户端'''布娃娃,并将大部分动画和视觉数据复制到其中。与服务端<tt>布娃娃</tt>不同的是,这些客户端布娃娃完全基于每个客户端进行处理,在性能开销方面比服务端布娃娃要廉价,简单的多,但代价是在服务端上几乎不存在,在客户端的视角之间存在不一致,并且只会与在客户端上具有物理属性的道具互动(比如{{ent|mode=name|worldspawn}}) | |||
然而,当NPC处于以下任意一种情况时,其会变成服务端布娃娃 | |||
* | * NPC位于{{ent|mode=name|trigger_serverragdoll}}体积内 | ||
* | * NPC在单人模式中被玩家的载具撞死 | ||
* | * [[weapon_physcannon|重力枪]]处于充能状态 | ||
* | * 当[[env_global|Alyx darkness mode]]开启时,NPC被烧死 | ||
* | * NPC是重要队友(比如{{ent|mode=name|npc_alyx}}) | ||
和<tt>prop_ragdoll</tt>一样,这些服务端的尸体布娃娃会与物理道具和其他东西发生碰撞,但它们被标记为<code>debris</code>,不会互相产生碰撞,不像客户端布娃娃,它们也不会与''自身''产生碰撞(已在{{ez2|4}}和{{bms|4}}中被修复)。这通常被认为是有意为之,皆在减少性能/网络开销 | |||
{{bug| | {{bug|服务端布娃娃不会保存血液印花,已在{{mapbase|4}}和{{bms|4}}中被修复}} | ||
{{note| | {{note|以上的大部分内容虽尚未进行进一步的测试,但'''理论上'''也适用与玩家}} | ||
{{warning| | {{warning|虽然大部分的动画/视觉数据都被复制到了客户端布娃娃上,但诸如淡入/淡出距离一类的数据并没有被复制}} | ||
: {{codenote| | : {{codenote|对于服务端布娃娃,可以修改<code>baseanimating.cpp</code>中的<code>CBaseAnimating::CopyAnimationDataFrom()</code>,而对于客户端布娃娃,则可以修改<code>c_baseanimating.cpp</code>中的<code>C_BaseAnimating::CreateRagdollCopy()</code>}} | ||
==Keyvalues== | ==Keyvalues== | ||
{{KV Targetname}} | {{KV Targetname}} | ||
{{KV|Override Animation|intn=angleOverride|string| | {{KV|Override Animation|intn=angleOverride|string|由引擎通过[[hammer_update_entity]]或{{Hammer++|4}}的物理模拟工具填充。除非需要清空,否则不要手动修改}} | ||
{{Expand|title= | {{Expand|title=非V社游戏特定内容| | ||
{{KV|Health|intn=health|integer| | {{KV|Health|intn=health|integer|布娃娃要被碎尸所需受到的伤害值|only=BMS|also=ez2}} | ||
{{KV|Character Manifest Mimic Name|intn=MimicName|string| | {{KV|Character Manifest Mimic Name|intn=MimicName|string|从角色清单中选择一个名字或实体类名来给布娃娃穿衣|only=BMS}} <!--谁能给我解释下这什么意思--> | ||
{{KV GMOD}} | {{KV GMOD}} | ||
}} | }} | ||
==Flags== | ==Flags== | ||
{{fl|4|Debris| | {{fl|4|Debris|不会与玩家或其他碎片交互}} | ||
{{fl|4096|Use 'Least Recently Used' Retirement | {{fl|4096|Use 'Least Recently Used' Retirement|使用LRU机制,“LRU”指的是起源的布娃娃清理系统,该系统会自动删除未使用的布娃娃。由NPC生成的服务端布娃娃会自动添加到此系统中,但是由地图制作者放置的布娃娃不会}} {{Not in FGD}} | ||
{{fl|8192|Allow Dissolve}} | {{fl|8192|Allow Dissolve|允许被分解}} | ||
{{fl|16384|Motion Disabled}} | {{fl|16384|Motion Disabled|禁用物理运动}} | ||
{{fl|32768|Allow stretch}} | {{fl|32768|Allow stretch|允许拉伸}} | ||
{{fl|65536|Start asleep}} | {{fl|65536|Start asleep|默认休眠}} | ||
==Inputs== | ==Inputs== | ||
{{IO|StartRagdollBoogie| | {{IO|StartRagdollBoogie|开始布娃娃抖动效果,持续5秒{{bugfix|这个输入实际上应该使用一个参数来指定抖动时长,但在代码中的数据类型描述时使用了错误的字段类型|在<code>CRagdollProp</code>的数据类型中,查找<code>DEFINE_INPUTFUNC( FIELD_VOID, "StartRagdollBoogie", InputStartRadgollBoogie )</code>并将<code>FIELD_VOID</code>替换为<code>FIELD_FLOAT</code>.|code}}}} | ||
{{IO|EnableMotion / DisableMotion| | {{IO|EnableMotion / DisableMotion|启用/禁用物理运动}} | ||
{{IO|FadeAndRemove| | {{IO|FadeAndRemove|淡出并删除自身,附加参数<nowiki>=</nowiki>淡出所需时间|since={{hl2ep2}}}} | ||
{{IO|AllowBloodPool| | {{IO|AllowBloodPool|如果放置在固体上,则会产生一摊血迹(粒子特效){{note|不适用于<code>prop_ragdoll_original</code>和<code>prop_ragdoll_attached</code>.}}|nofgd=1|only={{bms}}}} | ||
== | == 参见 == | ||
* {{ent|env_ragdoll_boogie}} | * {{ent|env_ragdoll_boogie}} | ||
* [[Prop Types Overview]] | * [[Prop Types Overview]] |
Revision as of 19:56, 6 August 2024
参见: 有关创建布娃娃的具体细节,详见$collisionjoints.
![]() |
---|
CRagdollProp |
![]() |
prop_ragdoll
是一个点实体 ,可在所有的 起源 游戏中使用。是一个具有物理性质的布娃娃。布娃娃是一组约束在一起的物理对象的集合,用于模拟像尸体这样的关节物体,它们的物理模拟有着昂贵的性能开销.


Start Asleep
Flag会导致渲染框无法更新,在生成时唤醒布娃娃一帧时间后再次休眠即可解决此问题 [todo tested in ?]
physics_prop_ragdoll
。
![]() prop_ragdoll_original 使用。区别在于:
|
尸体布娃娃/布娃娃转换
在NPC/玩家死亡,或者接收到BecomeRagdoll
输入的情况下,通常会创建一个客户端布娃娃,并将大部分动画和视觉数据复制到其中。与服务端布娃娃不同的是,这些客户端布娃娃完全基于每个客户端进行处理,在性能开销方面比服务端布娃娃要廉价,简单的多,但代价是在服务端上几乎不存在,在客户端的视角之间存在不一致,并且只会与在客户端上具有物理属性的道具互动(比如worldspawn)
然而,当NPC处于以下任意一种情况时,其会变成服务端布娃娃
- NPC位于trigger_serverragdoll体积内
- NPC在单人模式中被玩家的载具撞死
- 重力枪处于充能状态
- 当Alyx darkness mode开启时,NPC被烧死
- NPC是重要队友(比如npc_alyx)
和prop_ragdoll一样,这些服务端的尸体布娃娃会与物理道具和其他东西发生碰撞,但它们被标记为debris
,不会互相产生碰撞,不像客户端布娃娃,它们也不会与自身产生碰撞(已在 Entropy : Zero 2和
黑山中被修复)。这通常被认为是有意为之,皆在减少性能/网络开销


代码:对于服务端布娃娃,可以修改
baseanimating.cpp
中的CBaseAnimating::CopyAnimationDataFrom()
,而对于客户端布娃娃,则可以修改c_baseanimating.cpp
中的C_BaseAnimating::CreateRagdollCopy()
Keyvalues
- Name (目标名称) <target_source>[ Edit ]
- 这个名称是其他实体通过 输入/输出 或其他 关键值 (如
parentname
或target
) 来引用该实体时使用的标识符。
该名称也会显示在 Hammer 编辑器的 2D 视图和 实体报告 中。参见: 所有实体均可使用的 通用键值、输入与输出
- Override Animation (angleOverride) <字符串 >
- 由引擎通过hammer_update_entity或
Hammer++的物理模拟工具填充。除非需要清空,否则不要手动修改
GMODSandbox:
|
Flags
- Debris : [4]
- 不会与玩家或其他碎片交互
- Use 'Least Recently Used' Retirement : [4096]
- 使用LRU机制,“LRU”指的是起源的布娃娃清理系统,该系统会自动删除未使用的布娃娃。由NPC生成的服务端布娃娃会自动添加到此系统中,但是由地图制作者放置的布娃娃不会 不存在于FGD!
- Allow Dissolve : [8192]
- 允许被分解
- Motion Disabled : [16384]
- 禁用物理运动
- Allow stretch : [32768]
- 允许拉伸
- Start asleep : [65536]
- 默认休眠
Inputs
- StartRagdollBoogie
- 开始布娃娃抖动效果,持续5秒
错误:这个输入实际上应该使用一个参数来指定抖动时长,但在代码中的数据类型描述时使用了错误的字段类型 [todo tested in ?]
代码修复:在
CRagdollProp
的数据类型中,查找DEFINE_INPUTFUNC( FIELD_VOID, "StartRagdollBoogie", InputStartRadgollBoogie )
并将FIELD_VOID
替换为FIELD_FLOAT
.
- EnableMotion / DisableMotion
- 启用/禁用物理运动
- AllowBloodPool (仅存在于
之中) 不存在于FGD!
- 如果放置在固体上,则会产生一摊血迹(粒子特效)
注意:不适用于
prop_ragdoll_original
和prop_ragdoll_attached
.