doom3脚本部分

来源:互联网 发布:遇见聊天软件 编辑:程序博客网 时间:2024/05/22 06:24

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

需要先翻墙以后人机验证,才能访问原英文网站,我强烈建议读者访问该英文网站。

译文如下


doom3脚本部分,

脚本与Doom 3 c++的编程大致相同,您可以无需购买Visual C ++即可。该语言与C ++类似,但可以说更容易学习和使用。

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

  • 地图东西
  • 武器
  • AI(怪物)

我按照难度顺序列出了他们。地图脚本很容易编写和理解,武器脚本相当简单,AI脚本相当复杂。

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

对象被引用$ name,其中“name”是DOOMEdit中对象的名称。

事件看起来像C ++成员函数调用,你可以真正想到这样的方式。要将'hide'事件发送到speaker_280,你会写$ speaker_280.hide();

被称为“sys”的特殊对象是所有系统调用(如打印)隐藏的地方。所有事件(包括系统调用)都可以在“doom_events.script”中找到

地图脚本

地图脚本允许级别设计者创建比以前可能的旧的目标/触发器系统更高级的欺骗(尽管目标/触发器系统没有消失,它们并行工作)。当地图启动时,将调用worldspawn“call”键中指定的功能。该功能可以执行额外的设置,生成线程等。最好的解释方法就是以示例的方式打开map_marscity2.script。

在火星城2脚本中首先要注意的是命名空间map_marscity2DoomScript中的命名空间与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]从剪辑中减去弹药addToClip [amount]将弹药添加到剪辑ammoInClip返回剪辑中有多少弹药ammoAvailable返回剩下多少张照片totalAmmoCount返回剩下多少弹药clipSize返回剪辑的大小weaponOutOfAmmo告诉游戏代码,武器是弹药weaponReady告诉游戏代码,武器准备开火了weaponReloading告诉玩具正在重新加载的游戏代码weaponHolstered告诉游戏代码,武器被降低weaponRising告诉游戏代码,武器正在上升weaponLowering告诉游戏代码,武器正在降低手电筒[启用]启用或禁用常规枪口闪光灯launchProjectiles [numProjectiles],
[spread],[fuseOffset],
[launchPower],[dmgPower]在武器entityDef中发射由“def_projectile”定义的射弹。它还从剪辑中减去适量的弹药,设置枪口闪光和烟雾,在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中的敌人。如果演员在玩家PVS之外,则返回null。findEnemyAI [useFOV]返回演员可以看到的最近的敌人(而不是第一个敌人,可能不是最接近的)。否则行为像findEnemy。findEnemyInCombatNodes返回此演员所针对的战斗节点可见的第一个活的敌人。nearestReachableEnemyOfEntity [entity]返回最接近指定实体的生物敌人。哨兵使用这个来攻击靠近玩家的演员。hearSound [ignore_team]如果在演员区域中创建了警报声,则此功能将返回声音。否则返回null。ignore_team将使其跳过团队成员发出的声音。setEnemy [entity]如果这个演员到实体设置敌人clearEnemy设置这个演员没有敌人。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如果没有与此演员碰撞几何相交,则返回true。becomeSolid使演员稳固。启用和链接演员剪辑模型,并允许演员受到伤害(假设“noDamage”未设置)。becomeRagdoll把演员变成一个布娃娃。用于使Ed(科学家与灯)'最终'死亡。stopRagdoll禁用抹布并将控制权返回给动画师。用于由Archvile复活的怪物。setHealth [健康]设置演员的健康状况。用于复原的东西,也是MC地下科学家变成僵尸的科学家。getHealth返回演员的健康状况。allowDamage使演员受到伤害。ignoreDamage使演员不会受到伤害。getCurrentYaw返回演员的当前偏航角(朝向,朝向)。转到[角]设置演员的理想偏航(实际上不设置偏航,演员将转过几帧)。turnToPos [position]为演员设定理想的偏航,使他面对指定的位置。turnToEntity [实体]为演员设置理想的偏航,因此他面向指定的实体。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_MENSTERstopMove将移动状态设置为MOVE_STATUS_DONE。moveToCover告诉演员试图移动到敌人看不到的地方。moveToEnemy告诉演员试图向敌人或最后一个已知的敌方阵地移动。moveToEnemyHeight移动到与敌人相同的身高(用于监护人)。moveOutOfRange [entity],[range]告诉演员离开指定实体至少范围单位。moveToAttackPosition [entity],
[animation]告诉演员移动到可以使用指定动画攻击实体的某个位置由于他必须进入他的“攻击姿势”,才能开始射击,才能使用。漫步告诉演员随便随地漫游,没有任何特定的方向。moveToEntity [实体]告诉演员尽可能靠近实体(8个单位内)。moveToPosition [pos]告诉演员尽可能靠近指定的位置(8个单位内)。slideTo [pos],[time]随着时间的推移,将演员滑动到该位置用于确保演员在触发某事之前处于确切的位置。时间通常很小(0.25),但不一定是。facingIdeal如果演员面对他的理想偏航角(由turnTo或类似功能设置),则返回true。faceEnemy告诉演员不断转向最后知道的敌人阵地。faceEntity [entity]告诉演员不断转向指定的实体。getCombatNode返回比当前演员位置更靠近敌人的战斗节点。enemyInCombatCone [combatCone],
[useCurrentEnemyPosition]如果敌人在指定的战斗锥体中,则返回true。如果useCurrentPosition为真,那么它将使用实际的敌人位置,否则将使用最后一个已知位置。waitMove直到当前的动作完成后才返回。Doom 3中没有使用。getJumpVelocity [pos],[speed],[maxHeight]返回将导致演员降落在该位置的速度向量。如果不可能跳转,则返回零向量。jumpHeight是允许跳转的最大高度。entityInAttackCone [entity]如果实体是我们的攻击锥体,则返回true。canSee [实体]如果实体在我们的视野而不是墙后面,则返回true。setTalkTarget [entity]将通话目标设置为指定的实体,并将AI_TALK设置为true(如果实体为空,则将AI_TALK设置为false)。getTalkTarget返回当前的通话目标。setTalkState [state]通话状态是:
TALK_NEVER,TALK_DEAD,TALK_OK,TALK_BUSYenemyRange返回到敌人的距离。enemyRange2D返回2d中与敌人的距离(忽略Z)。getEnemy返回当前的敌方实体。getEnemyPos返回当前敌人的最后一个已知位置。getEnemyEyePos返回当前敌人眼中最后一个已知的位置。预测EnemyPos [时间]从现在起返回当前敌方时间的预测位置canHitEnemy如果演员和他的敌人(或者演员和敌方队伍中的其他人)之间没有任何东西,则返回true。canHitEnemyFromAnim [动画]如果使用指定的动画发射的弹丸将击中敌人,则返回true。canHitEnemyFromJoint [联名]如果从指定的关节发射的弹丸将击中敌人,则返回true。enemyPositionValid如果演员知道敌人不在最后一个已知位置的事实,则返回false。chargeAttack [damageDef]调用attackBegin(damageDef)然后直接向敌方位置移动。testChargeAttack如果演员直奔,则返回击中敌人所需的时间。如果有问题,返回0。testMoveToPosition [position]如果演员和职位之间没有任何内容,则返回true。testAnimMoveTowardEnemy [动画]如果演员可以在运行指定的动画而没有任何妨碍的情况下击中敌人,则返回true。testAnimMove [动画]如果演员可以执行动画而没有阻碍某些动作,则返回true。testMeleeAttack如果近战攻击将击中敌人,则返回true。testAnimAttack [动画]如果执行指定的动画将触发播放器,则返回true。shrivel [时间]修改shaderparm 8从1.0到0.5以上的时间(多个帧之后将返回)。Doom 3中没有使用。烧伤导致演员焚烧和。开。clearBurn重置演员刻录时间(所以演员不再被烧)。预燃关闭阴影。setSmokeVisibility [smokeSystem],[state]打开或关闭指定的烟雾粒子系统(通过将状态设置为true或false)。numSmokeEmitters返回演员烟雾排放者的数量。waitAction [action]直到指定的操作完成后才返回。在这种情况下,动作通常是一个动画名称。别想了导致线程结束,演员休眠。getTurnDelta返回当前偏航和理想偏航之间的角度(以度为单位)。getMoveType获取当前的移动类型。移动类型是以下之一:
MOVETYPE_DEAD,MOVETYPE_ANIM,MOVETYPE_SLIDE,MOVETYPE_FLY,MOVETYPE_STATICsetMoveType设置当前的移动类型。saveMove将当前移动保存到内部变量。restoreMove恢复以前保存的动作。allowMovement [flag]传递真正让演员走动。enableClip启用演员碰撞几何。disableClip”禁用演员碰撞几何。enableGravity”使演员遵守物理学规律。disableGravity”让演员像重力一样漂浮在一起不存在。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 [实体],[持续时间]瞄准一个演员的头和眼睛在一个实体一段时间。lookAtEnemy [持续时间]瞄准一个演员的头和眼睛在他的敌人一段时间。setBoneMod [flag]启用或禁用头脑。杀死演员wakeOnFlashlight [flag]传递真实,当手电筒照亮时,演员激活。locateEnemy更新最后知道的敌方位置。kickObstacles [实体],[force]对演员前面的对象施加一些踢力,将重点放在实体上(可以为null)。getObstacle返回阻止演员运动的实体(可能被踢的候选人)。pushPointIntoAAS [pos]试图将职位推向有效的AAS区域。返回新位置。getTurnRate返回“turn_rate”setTurnRate [rate]设置“turn_rate”animTurn [maxAngle]启用或禁用动画控制车削。通过动画转换的最大度数,或0禁用。allowHiddenMovement [flag]即使演员被隐藏也可以通过真实的运行物理学。findActorsInBounds [mins],[maxs]返回指定范围内的actor。canReachPosition [pos]如果actor可以移动到指定的位置,则返回true。canReachEntity [entity]如果actor可以移动到指定的实体,则返回true。canReachEnemy如果演员有可能移动到他的敌人,则返回true。getReachableEntityPosition [entity]如果可能,返回AAS中的实体的位置,否则返回该位置。

0 0
原创粉丝点击