doom3脚本部分

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]将 弹药 添加到 clipammoInClip返回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 [联名]触发 联合 命名的 枪口闪光jointnamecreateMissile [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_DONEMOVE_STATUS_MOVINGMOVE_STATUS_WAITINGMOVE_STATUS_DEST_NOT_FOUNDMOVE_STATUS_DEST_UNREACHABLEMOVE_STATUS_BLOCKED_BY_WALLMOVE_STATUS_BLOCKED_BY_OBJECTMOVE_STATUS_BLOCKED_BY_ENJYMOVE_STATUS_BLOCKED_BY_MENSTERstopMove将移动状态设置为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_NEVERTALK_DEADTALK_OKTALK_BUSYenemyRange返回到敌人的距离。enemyRange2D返回2d中与敌人的距离忽略Z。getEnemy返回当前的敌方实体。getEnemyPos返回当前敌人的最后一个已知位置。getEnemyEyePos返回当前敌人眼中最后一个已知的位置。预测EnemyPos [时间]从现在 起 返回当前敌方时间秒的预测位置。canHitEnemy如果actor 和他的敌人或者actor和敌方队伍中的其他人之间没有任何东西则返回true。canHitEnemyFromAnim [动画]如果使用指定的动画发射的弹丸将击中敌人则返回true。canHitEnemyFromJoint [联名]如果从指定的关节发射的弹丸将击中敌人则返回true。enemyPositionValid如果 actor 知道敌人不在最后一个已知位置的事实则返回false。chargeAttack [damageDef]调用 attackBegindamageDef然后 直接向 敌方 位置 移动。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_STATICMOVETYPE_SLIDEMOVETYPE_ANIMMOVETYPE_FLYMOVETYPE_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到点bSLOW的 实际行驶距离。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中的实体的位置否则返回该位置。