doom3脚本部分

📅 2026/7/10 1:03:01 👁️ 阅读次数 📝 编程学习
doom3脚本部分

原文地址 https://www.iddevnet.com/doom3/script.php

(有删减,完了看情况补充)

译文如下

doom3脚本部分

脚本与Doom 3 c++的编程大致相同,您可以无需购买Visual C ++即可。

该语言与C ++类似,但可以说更容易学习和使用。

Doom 3中有三个主要组件由脚本控制:

  • 地图东西
  • weapon​​​​​​
  • AI(怪物)

我按照难度顺序列出了他们。

地图脚本很容易编写和理解,武器脚本相当简单,AI脚本相当复杂。

审查系统是围绕对象和事件的思想。

对象被引用$ name,

其中“name”是DOOMEdit中对象的名称。

事件看起来像C ++成员函数调用,你可以真正想到这样的方式。

要将'hide'事件发送到speaker_280,你会写$ speaker_280.hide();

被称为“sys”的特殊对象是所有系统调用(如打印)隐藏的地方。

所有事件(包括系统调用)都可以在“doom_events.script”中找到

地图脚本

地图脚本允许级别设计者 创建 比 以 前 可能的旧的目标/触发器系统更高级的(?)

(尽管目标/触发器系统没有消失,它们并行工作)。

当地图启动时,将调用worldspawn“call”键中指定的功能。

该功能可以执行 额外的设置,生成线程等。

最好的解释方法就是以示例的方式打开 map_marscity2.script。

在火星城2脚本中首先要注意的是命名空间map_marscity2

DoomScript中的命名空间与C ++中的命名空间相同,

它们提供了一种方便的方式来分离另外可能具有相同名称的函数和变量。

由于我们在map_marscity2命名空间中包含了所有的功能,

所以我们不用担心使用与我们其中一个函数 名称 相同 的 函数 的 另一个地图。

marscity2.map中的“call”键设置为map_marscity2 :: main

它定义在map_marscity2.script的底部。

双冒号与C ++中的工作方式相同,并指定函数所在的命名空间。

在此示例中,所有主要功能都是从video_request_speaker函数(上面定义)创建一个线程。

如果您不太确定C ++中的线程是什么,

不用担心,因为DoomScript中的线程略有不同。

它们是微型线程而不是操作系统线程,但这并不重要。

通常当您调用函数时,您的代码将停止,直到该函数完成,

但是当您创建一个线程来调用该函数时,代码将继续进行。

在marscity2示例中,我们必须创建一个线程,

因为“video_request_speaker”函数很长一段时间循环

(更具体地说,只要“request_speaker”设置为1)它就循环。

该功能播放“请求的视频链接”声音,

等待一秒钟,

然后再次执行。

当你走到终端,

你打了一个触发器,

“call”设置为map_marscity2 :: connect_sarge_speaker

如果我们检查该函数,我们看到第一件事情是将“request_speaker”设置为0,

这导致“video_request_speaker”线程中的“while”循环退出。

然后,它告诉“speaker_280”(这是“请求的视频链接”)来 停止 播放 声音,

触发“sarge_monitor”实体(这会导致 屏幕上 弹出 一个 信息)

和“speaker_281”(“connection established”) 。

它等待四分之一秒钟,触发“speaker_282”(sarges speech),

并再次触发监视器(这导致Sarge在屏幕上弹出)。

最后,触发“relay_111”等待32秒,

然后触发一堆垃圾,如“提供安全许可”和“停止说话”。

最后一部分也可以在脚本中等待32秒,

然后通过脚本触发一切,

但这个特定的级别的设计师决定只是触发继电器,

并让它做所有的工作。

使用中继而不是脚本来实现的主要优点是更容易看到和编辑在辐射。

武器脚本

武器脚本可以做地图脚本可以做的一切,他们只是没有这么多的对象来抚摸。

关于武器脚本最令人困惑的事情可能是它是一个类型为idWeapon的对象。

这意味着您不必在发送事件时指定对象名称,

因为它将事件发送到自身。经验丰富的C ++程序员将把它视为隐藏的这个指针。

通常你会说$ something.hide();

但是当函数在一个对象中被定义时,

你可以只说一下hide();它会自动知道对象是什么。

在武器脚本的情况下,对象是武器本身。

当您看到AI脚本(对象将是怪物)时,您将再次看到它。

我们来分析一下这个weapon_pistol.script。

在#define部分之后,我们转发声明了weapon_pistol对象,

并说它将继承自weapon_base。

继承使我们能够在武器库中放置一些常用功能,

并将其提供给所有武器。

我们指定什么变量和功能将在我们的武器。

在对象定义之后,我们发现我们说的所有函数的声明。

当一个武器被选中(用脉冲命令或者拾取它)时,

在武器对象上调用init函数。

通常这将从武器entityDef读取一些默认值,并将武器状态设置为“提升”。

武器状态

武器状态 功能 是驱动武器代码的关键。

此功能控制从武器对象中的成员函数定义的各种武器状态的转换。

第一个参数是要切换到的状态的名称(应该是一个函数名),

第二个参数是在状态更改期间混合动画的帧数。

一个状态变化的一个很好的例子是在weapon_pistol :: Reload中

该函数启动重新加载动画并等待它完成。

然后它将一些子弹添加到剪辑并转换到空闲状态。

animDone函数将共享计数作为第二个参数。

在这种情况下,混合计数是4,所以当动画中只剩下4帧时,它将返回true。

我们将相同的值传递给weaponState功能,

所以它知道在当前动画中还有4帧可以播放。

武器状态功能存储这些信息,

所以当空闲动画开始播放时,前4个帧与前一个动画的最后4个帧(重新加载)混合。

这种动画混合可以在完全不同的动画之间进行平滑的转换,

而不会发生真正的丑陋动作。

方便武器功能
getOwner

返回持有该武器的玩家实体

接下来的武器

循环到玩家库存中的下一个“武器”

武器状态

[状态],

[混合]

(如上所述)

useAmmo [amount]

从clip中减去弹药

addToClip [amount]

将 弹药 添加到 clip

ammoInClip

返回clip中有多少弹药

ammoAvailable

返回剩下多少张“弹药”

totalAmmoCount

返回 剩下多少 弹药 数目

clipSize

返回clip的大小

weaponOutOfAmmo

告诉游戏代码,武器是弹药

weaponReady

告诉游戏代码,武器准备开火了

weaponReloading

告诉玩具正在重新加载的游戏代码

weaponHolstered

告诉游戏代码,武器被降低

weaponRising

告诉游戏代码,武器正在上升

weaponLowering

告诉游戏代码,武器正在降低

手电筒[启用]启用或禁用常规枪口闪光灯
launchProjectiles [numProjectiles],
[spread],[fuseOffset],
[launchPower],[dmgPower]

在武器entityDef中发射由“def_projectile”定义的射弹。

它还从clip中减去适量的弹药,

设置枪口闪光和烟雾,

在AI附近发出警报,踢视图,

并重置着色器第4和第5(多样性和时间偏移)。

numProjectiles指定启动了多少个弹丸。


spread指定扩展角(以度为单位)。


fuseOffset指定保险丝应该开始的距离(手榴弹是您持有火焰按钮的时间长短)。


launchPower是乘以弹丸速度的值(因此1.0是弹道的正常速度)。

手榴弹使用它,使其按住按钮更长,使他们走得更快。


dmgPower就像launchPower,但是对于损坏。(此处翻译可能有误……)

createProjectile

创建并返回由“def_projectile”定义的新的弹丸实体。

除了返回它,它实际上并不对弹道做任何事情。

几乎每次都可能要使用launchProjectiles。

这个功能目前只被手榴弹用来附加声音。

ejectBrass

随机抛出由“def_ejectBrass”键定义的武器entityDef中的一些碎片实体。

乱斗

检查“melee_distance”范围内的实体,

并执行由“def_melee”定义的任何内容。

这包括推动,窃取和破坏另一个实体(以及执行声音)。

如果有人被击中,则返回true。

getWorldModel

返回实际的动画武器模型的实体。
目前仅被chaingun用于旋转桶的模型。

allowDrop [allow]

传递真实,以防止玩家掉落武器。
目前仅在BFG过度充电时使用。

isInvisible

返回true,如果播放器有不可见性加电

自动重载

如果播放器设置了“ui_autoReload”,则返回true。

netReload

此功能将导致服务器向客户端发送重新加载事件。

重新加载事件信号WEAPON_NETRELOAD,

武器脚本捕获在客户端重新加载。

这是需要的,

所以你可以看到其他客户端重新加载他们的武器。

在更改为“重新加载”武器状态之前,应该始终调用它。

netEndReload

类似于netReload,但当武器完成重新加载时调用。


目前只用于霰弹枪(因为可以中止重新加载)。

AI脚本

AI本比地图或武器脚本复杂几个数量级。

我真的不会尝试触摸他们,除非你知道C ++真的很好。

伯尼可能有最简单的ai脚本(他只是走向你试图嘲笑你),

但即使这比大多数武器脚本更复杂。

稍后我会提供更多的文件。

方便的AI功能
findEnemy [useFOV]

返回演员可以看到的第一个活的敌人。

如果useFOV是true,

那么它只返回actors中的敌人。

如果 actor 在玩家PVS之外,则返回null。

findEnemyAI [useFOV]

返回actor可以看到的 最近的敌人

(而不是第一个敌人,可能不是最接近的)。

否则行为像findEnemy。

findEnemyInCombatNodes

返回此actor所针对的战斗节点可见的第一个活的敌人。

nearestReachableEnemyOfEntity [entity]

返回 最接近指定 实体 的 生物敌人。

哨兵 使用这个来攻击 靠近玩家的actor。

hearSound [ignore_team]

如果在演员区域中创建了警报声,

则此功能将返回声音。

否则返回null。

ignore_team将使其跳过团队成员发出的声音。

setEnemy [entity]

如果这个actor到 实体 设置敌人。

clearEnemy

设置 这个 actor 没有 敌人。

muzzleFlash [联名]

触发 联合 命名的 枪口闪光jointname

createMissile [jointname]

创建 一个 绑定到 联合名 为 jointname的 联合名称的

actor (由actor entityDef中的“def_projectile”指定),

然后 返回 弹丸。

attackMissile [联名]

从联合命名的联合名称向敌人发射弹药。

返回 弹丸实体。

fireMissileAtTarget [jointname],
[targetname]

在指定的目标实体上发射弹体。

否则的行为就像attackMissile。

launchmissile [origin],[angles]

从指定的起点和角度发射 射弹。返回弹药。

attackMelee [meleeDef]

使用 指定的近战damageDef执行近战攻击(有关示例定义,

请参阅actor_zombie_commando.def中的melee_commandoTentacle)。

如果它打了东西,

返回true。

directDamage [target],[damageDef]

使用damageDef指定的damageDef对目标实体造成直接损害。

radiusDamageFromJoint [jointname],
[damageDef]

使用指定的damageDef执行 半径损伤。

半径的中心附在由联名指定的关节上。

attackBegin [damageDef]

开始攻击,如果演员在攻击过程中触动任何事情,

他将使用指定的damageDef对对象造成直接伤害。

attackEnd

结束攻击

meleeAttackToJoint [jointname],
[damageDef]

使用指定的damageDef对眼睛位置和指定关节之间的任何实体进行直接伤害。

突击队使用这种方法来破坏触手术的任何东西。

randomPath

随机返回此actor定位的路径实体之一。

canBecomeSolid

如果没有与此actor碰撞几何相交,

则返回true。

becomeSolid

使演员稳固。启用和链接演员剪辑模型,

并允许演员受到伤害(假设“noDamage”未设置)。

becomeRagdoll

把actor 变成一个布娃娃。

用于使比如游戏中 有一关 中

Ed(游戏中的角色 名 “科学家与灯”)'最终' 驾鹤西游……

stopRagdoll

禁用抹布并将控制权返回给动画师。

用于由Archvile复活的怪物。

setHealth [健康]

设置actor 的 健康状况。

用于复原的东西,也是MC地下科学家变成“僵尸的科学家”。

getHealth

返回actor的健康状况。

allowDamage

使actor受到伤害。

ignoreDamage

使actor不会受到伤害。

getCurrentYaw

返回actor的当前偏航角(朝向,朝向)。

转到[角]

设置actor的理想偏航(实际上 不设置 偏航,actor将转过几帧)。

turnToPos [position]

为actor设定 理想的偏航,使他 面对指定的 位置。

turnToEntity [实体]

为actor设置理想的偏航,因此他面向指定的实体。

moveStatus

返回actor的当前移动状态,它是以下之一:


MOVE_STATUS_DONE,MOVE_STATUS_MOVING,

MOVE_STATUS_WAITING,MOVE_STATUS_DEST_NOT_FOUND,

MOVE_STATUS_DEST_UNREACHABLE,

MOVE_STATUS_BLOCKED_BY_WALL,

MOVE_STATUS_BLOCKED_BY_OBJECT,

MOVE_STATUS_BLOCKED_BY_ENJY,

MOVE_STATUS_BLOCKED_BY_MENSTER

stopMove

将移动状态设置为MOVE_STATUS_DONE。

moveToCover

告诉actor试图移动到敌人看不到的地方。

moveToEnemy

告诉actor试图向敌人或最后一个已知的敌方阵地移动。

moveToEnemyHeight

移动到与敌人相同的身高(用于监护人)。

moveOutOfRange [entity],[range]

告诉actor离开指定实体至少范围单位。

moveToAttackPosition [entity],
[animation]

告诉actor移动到可以使用指定动画攻击实体的某个位置。

由于他必须进入他的“攻击姿势”,才能开始射击,才能使用。

漫步

告诉 actor随便随地漫游,没有任何特定的方向。

moveToEntity [实体]

告诉actor尽可能靠近实体(8个单位内)。

moveToPosition [pos]

告诉actor尽可能靠近指定的位置(8个单位内)。

slideTo [pos],[time]

随着时间的推移,将actor滑动到该 位置。

用于确保actor在触发某事之前处于确切的位置。

时间通常很小(0.25),

但不一定是。

facingIdeal

如果actor面对他的 理想 偏航角

(由turnTo或类似功能设置),

则返回true。

faceEnemy

告诉actor不断转向最后知道的敌人阵地。

faceEntity [entity]

告诉actor不断转向指定的实体。

getCombatNode

返回 比 当前actor位置 更靠近敌人的 战斗节点。

enemyInCombatCone [combatCone],
[useCurrentEnemyPosition]

如果敌人在指定的战斗锥体中,

则返回true。

如果useCurrentPosition为真,

那么它将使用实际的敌人位置,

否则将使用最后一个已知位置。

waitMove

直到当前的 动作完成 后才 返回。

Doom 3中没有使用。

getJumpVelocity

[pos],

[speed],

[maxHeight]

返回将导致actor 降落在 该位置的 速度向量。

如果 不可能跳转,

则 返回 零向量。

jumpHeight是 允许 跳转的 最大高度。

entityInAttackCone [entity]

如果 实体 是 我们的 攻击锥体,

则返回true。

canSee [实体]

如果 实体 在 我们的视野 而不是 墙 后面,

则返回true。

setTalkTarget [entity]

将通话目标设置为指定的实体,

并将AI_TALK设置为true

(如果实体为空,则将AI_TALK设置为false)。

getTalkTarget

返回 当前的 通话 目标。

setTalkState [state]

通话 状态是:
TALK_NEVER,TALK_DEAD,TALK_OK,TALK_BUSY

enemyRange

返回到敌人的距离。

enemyRange2D

返回2d中与敌人的距离(忽略Z)。

getEnemy

返回当前的敌方实体。

getEnemyPos

返回当前敌人的最后一个已知位置。

getEnemyEyePos

返回当前敌人眼中最后一个已知的位置。

预测EnemyPos [时间]

从现在 起 返回当前敌方时间秒的预测位置。

canHitEnemy

如果actor 和他的敌人

(或者actor和敌方队伍中的其他人)之间没有任何东西,

则返回true。

canHitEnemyFromAnim [动画]

如果使用指定的动画发射的弹丸将击中敌人,

则返回true。

canHitEnemyFromJoint [联名]

如果从指定的关节发射的弹丸将击中敌人,

则返回true。

enemyPositionValid

如果 actor 知道敌人不在最后一个已知位置的事实,

则返回false。

chargeAttack [damageDef]

调用 attackBegin(damageDef)

然后 直接向 敌方 位置 移动。

testChargeAttack

如果actor直奔,则 返回击中敌人所需的时间。

如果有问题,返回0。

testMoveToPosition [position]

如果actor和职位之间没有任何内容,则返回true。

testAnimMoveTowardEnemy [动画]

如果actor 可以在运行指定的动画而没有任何妨碍的情况下 击中敌人,

则返回true。

testAnimMove [动画]

如果actor 可以 执行 动画 而没有阻碍 某些 动作,

则返回 true。

testMeleeAttack

如果近战攻击将击中敌人,则返回true。

testAnimAttack [动画]

如果执行指定的动画将触发播放器,

则返回true。

shrivel [时间]

修改shaderparm 8从1.0到0.5以上的时间(多个帧之后将返回)。

Doom 3中没有使用。

clearBurn

重置actor刻录时间(所以actor不再被烧)。

关闭阴影。

setSmokeVisibility [smokeSystem],[state]

打开或关闭指定的烟雾粒子系统

(通过将状态设置为true或false)。

numSmokeEmitters

返回actor 烟雾排放者的数量。

waitAction [action]

直到指定的操作完成后才返回。

在这种情况下,动作通常是一个动画名称。

别想了

导致线程结束,演员休眠。

getTurnDelta

返回当前偏航和理想偏航之间的角度(以度为单位)。

getMoveType

获取当前的移动类型。

移动类型是以下之一:

MOVETYPE_STATIC

MOVETYPE_SLIDE,

MOVETYPE_ANIM,

MOVETYPE_FLY,

MOVETYPE_DEAD,( 某物状态 为 戴德)

setMoveType

设置 当前 的 移动类型。

saveMove

将 当前 移动 保存到 内部变量。

restoreMove

恢复 以前保存的动作。

allowMovement [flag]

传递 真正让 actor走动。

enableClip

启用 actor 碰撞几何。

disableClip”

禁用 actor 碰撞几何。

enableGravity”

使actor 遵守 物理学规律。

disableGravity”

让 actor 像重力一样漂浮在一起不存在。

enableAFPush”

将“af_push_moveables”设置为true。

disableAFPush”

将“af_push_moveables”设置为false。

setFlySpeed [speed]

设置“fly_speed”。

setFlyOffset [offset]

设置“fly_offset”。

clearFlyOffset

将“fly_offset”重新设置为产生agrs的任何内容。

getClosestHiddenTarget [type]

返回玩家无法看到的最接近的指定类型的实体。

用于找到玩家无法看到的失去的战斗节点。

getRandomTarget [type]

随机 返回 指定类型的 目标。

travelDistanceToPoint [pos]

返回到 指定位置的 实际行驶距离(SLOW)。

travelDistanceToEntity [entity]

返回到指定实体的 实际行驶距离(SLOW)。

travelDistanceBetweenPoints [pointa],[pointb]

返回从点a到点b(SLOW)的 实际行驶距离。

travelDistanceBetweenEntities [ent1],[ent2]

返回从实体1到实体2的实际行驶距离(SLOW)。

lookAt [实体],[持续时间]

瞄准一个actor的头和眼睛在一个实体一段时间。

lookAtEnemy [持续时间]

瞄准一个actor的头和眼睛 在他的敌人一段时间。

setBoneMod [flag]

启用或禁用头脑。(此处 翻译可能有误 ……)

wakeOnFlashlight [flag]

传递真实,当 手电筒照亮时,actor激活。

locateEnemy

更新最后知道的敌方位置。

kickObstacles [实体],[force]

对actor前面的对象施加一些踢力,

将重点放在实体上(可以为null)。

getObstacle

返回阻止actor运动的实体(可能被kick的“游戏候选角色”)。

pushPointIntoAAS [pos]

试图将 位置 推向有效的AAS区域。

返回新位置。

getTurnRate

返回“turn_rate”

setTurnRate [rate]

设置“turn_rate”

animTurn [maxAngle]

启用或禁用动画控制车削。(未必翻译正确……)

通过动画转换的最大度数,或0禁用。

allowHiddenMovement [flag]

即使actor被隐藏也可以通过真实的运行物理学。

findActorsInBounds [mins],[maxs]

返回指定范围内的actor。

canReachPosition [pos]

如果actor可以移动到指定的位置,则返回true。

canReachEntity [entity]

如果actor可以移动到指定的实体,则返回true。

canReachEnemy

如果actor有可能移动到他的敌人,则返回true。

getReachableEntityPosition [entity]如果可能,返回AAS中的实体的位置,否则返回该位置。