ETF 映射/参考资料
本质上,每个实体都有一个“状态”,如下所示
不可见 | 此实体不可触发,也不可见(尽管这有一些奇怪的副作用,例如不可见的门仍然阻止人们穿过它们)。 |
禁用 | 此实体不可触发。 |
不活跃 | 此实体处于闲置状态(可以认为是“可触摸”)。对于目标物品,这意味着“回到基地”。 |
活跃 | 此实体处于活动状态,并且(取决于其设置),将在设定的时间后恢复到不活动状态。对于目标物品,这意味着“躺在地上”。 |
携带 | 此状态仅适用于目标物品。 |
当玩家触碰实体并满足条件时,它将被触发为携带(如果它是一个可携带的实体)或激活。
除非强制(参见目标),否则只允许某些状态更改(注意,你不能将状态更改为当前状态(什么都不会发生)
不可见 | 禁用 | 不活跃 | 活跃 | 携带 | |
不可见 | * | * | |||
禁用 | * | * | |||
不活跃 | * | * | * | * | |
活跃 | * | * | |||
携带 | * | * |
当实体更改状态时,它将触发该状态的任何消息或声音,以及执行给予(仅当处于携带/激活状态时,取决于它是否可以携带)、团队得分(同样,仅当处于携带/激活状态时)和<state>target(参见目标)。
一个实体每帧最多可以改变 5 次状态(目前)——这是为了防止无限循环挂起服务器——但你最好避免任何这种情况(因为你不能总是确定实体最终会处于什么状态,尤其是如果限制发生变化)。
当实体更改状态时,消息和声音可以发送给各种玩家,可以选择使用“强制”标志(在字符串前面加上 ~ 符号)。强制标志导致消息被居中打印,声音变为全局(即无衰减)。消息可以发送给四个不同的组:激活者、激活者的团队(不包括激活者)、所有不在激活者团队中的玩家,或者所有玩家。
<state>_message | 向激活者发送一条消息。 |
<state>_team_message | 向激活者的队友发送一条消息。 |
<state>_nonteam_message | 向所有不在激活者团队中的玩家发送一条消息。 |
<state>_all_message | 向所有玩家发送一条消息。 |
<state>_sound | 向激活者播放一个声音(目前,像指定 ~ 一样全局播放)。 |
<state>_team_sound | 向激活者的队友播放一个声音(目前,像指定 ~ 一样全局播放)。 |
<state>_nonteam_sound | 向所有不在激活者团队中的玩家播放一个声音(目前,像指定 ~ 一样全局播放)。 |
<state>_all_sound | 向所有玩家播放一个声音。 |
上面字符串中的 <state> 指的是要播放的状态,例如 active_message。对于声音,目前只有所有人都能听到的声音(<state>_all_sound)可以“非强制”播放(即随距离实体的距离而衰减)。
此外,还有一个不是状态的前缀。这是 kill 前缀。它就像其他消息一样使用,但对于 o.a. trigger_hurt 实体很有用。例如:“kill_all_message” “%n 不应该在这里。”作为 trigger_hurt 上的一个键值对,当名为 Dummy 的玩家被 trigger_hurt 杀死时,将显示“Dummy 不应该在这里。”作为死亡信息。
消息还可以包含根据需要展开的标记。大写的标记代表激活者(如果存在)。小写标记代表实体本身
%H | 生命值 |
%A | 护甲 |
%L | 位置(如果无法计算出,则返回“未知位置”) |
%D | 上次死亡位置。 |
%R | 上次报告位置(即与上次 %L 相同) |
%T | 团队名称(例如,“红色团队”、“蓝色团队”等) |
%C | 团队颜色(例如,红色、蓝色等) |
%G | 伪装(如果没有戴伪装,则返回“未伪装”) |
%N | 名称(玩家名称/实体组名(或其中一个) |
%E | 状态(例如,“激活”、“携带”等) |
%S | 职业(例如,“士兵”、“医疗兵”等) |
例如,你可以说
"active_flaginfo" "The ^1RED^* flag has been dropped at $l." // $l is used for locations of the goalitem entity dunno why but it is.
顺便说一下,你也可以在通信中使用这些标记(大小写无关),保存你需要的 $ 而不是 %。如果你想惹恼服务器上的所有人,只需说“你好 $r,我是 $t 的 $n。”(不过我并不推荐这样做)。$r 现在是阅读者的名称,而不是 $n。
Flaginfo 发送给执行 \flaginfo 命令的玩家。所有具有 <state>_flaginfo 的实体都会将其信息发送到客户端。通常情况下,是标志之类的东西保留了 flaginfo,因此命令名称如此。对于标志,你期望一个携带、激活和不活动 flaginfo 字符串,例如
carried_flaginfo | "%N 拿着红旗在 %L(而且只有 %H 生命值了)" |
active_flaginfo | "红旗躺在 $l 的田野里"(注意小写和 $,没有携带者!) |
inactive_flaginfo | "红旗在基地里是安全的" |
当实体设置为携带(如果是一个可携带的实体)或激活(如果不是)时,实体可以“给予”受影响的玩家奖励。给予字符串的形式为“give” “stat=value,stat=value,stat=value”。以下统计数据可用
生命值 | 生命值 |
护甲 | 护甲 |
伤害 | 对目标造成伤害 |
ammo_shells | 弹壳 |
ammo_nails | 钉子 |
ammo_rockets | 火箭 |
ammo_cells | 电池 |
ammo_medikit | 医疗包弹药 |
ammo_charge | 高爆弹 |
分数 | 玩家分数(不是团队分数) |
gren1 | 手榴弹类型 1 |
gren2 | 手榴弹类型 2 |
quad | 四倍伤害持续时间(秒) |
regen | 再生持续时间(秒) |
flight | 飞行持续时间(秒) |
battlesuit | 动力装甲持续时间(秒) |
invis | 隐形持续时间(秒)(闪烁隐形,不是特工隐形) |
haste | 加速持续时间(秒) |
invuln | 无敌持续时间(秒) |
aqualung | 水肺持续时间(秒) |
ceasefire | 玩家无法射击的持续时间(秒) |
gas | 毒气持续时间(秒) |
stun | 眩晕持续时间(秒) |
flash | 闪光持续时间(秒) |
tranq | 麻醉持续时间(秒) |
fire | 火焰计数器数量,每个计数器每隔几秒钟就会造成一定量的灼伤伤害 |
armortype | 护甲类型(以 0-100 的数字表示)。这是护甲为你节省的伤害量* |
aclass_shell | 如果为真,则对弹壳提供额外 15% 的防护(否则移除) |
aclass_bullet | 如果为真,则对钉枪/狙击步枪提供额外 15% 的防护(否则移除) |
aclass_explosive | 如果为真,则对爆炸提供额外 15% 的防护(否则移除) |
aclass_shock | 如果为真,则对 EMP/电击提供额外 15% 的防护(否则移除) |
aclass_fire | 如果为真,则对火焰提供额外 15% 的防护并防止灼伤(否则移除) |
aclass_all | 如果为真,则设置所有护甲等级(否则,移除所有护甲等级) |
如果未强制(带 ~ 前缀),这些值将限制为玩家最大值。如果在前面加上 + 或 -,则它们将加到现有值上或从现有值中减去,而不是设置,例如
"give" "health=~500,armor=+50,score=+3,quad=10,haste=10,aclass_fire=1"
将给玩家 500 生命值(无论其职业最大值如何)、50 点护甲(最多达到职业最大值)、3 分、10 秒四倍伤害和加速(无论之前有多少),以及耐火的护甲。
如果未指定 armortype 并且给予护甲(即玩家在命令执行前比之前获得更多护甲),则自动假设其护甲类型应该设置为最大值。为了使他们的护甲类型保持不变,请输入一个像“armortype=+0”这样的键。
还有一些影响命令的实体键
affectteams | 影响指定的团队(例如,“red,blue”),无论哪个团队激活了这个实体 |
effectradius | 仅影响在指定半径内的玩家 |
holding | 仅影响持有这些目标物品的玩家 |
notholding | 仅影响没有持有这些目标物品的玩家 |
clientstats | 仅影响匹配这些客户端统计数据的玩家 |
请注意,条件的工作方式是首先检查 affectteams 以及影响团队/影响非团队标志以影响玩家,然后根据视线/环境标志限制此范围。
实体的键“flags”可用于指定影响实体在多个区域的行为的以逗号分隔的布尔标志列表,如下所示。这些可以归类为条件/效果/命令标志
hideactive (cmd) | 使实体在激活时不可见(例如,用于补充目标信息)。 |
affectteam (eff) | 使“give”命令影响激活者的整个队伍。 |
affectnonteam (eff) | 使“give”命令影响所有不在激活者队伍的人。 |
dropoff (eff) | “give”的值会随距离而下降(要求实体中有一个“range”键)。 |
lineofsight (eff) | 只有视线范围内的实体才会受到影响。 |
environment (eff) | 只有同一环境中的实体才会受到影响。 |
shootable (cmd) | 允许射击实体相当于接触实体(仅适用于func_doors)。 |
reversecriteria (cri) | 导致实体只有在不满足条件时才会触发。 |
orclientstats (cri) | 导致clientstats条件是“或”而不是“与”。 |
revealagent (cmd) | 如果触发,激活者将失去伪装。 |
showcarry (cmd) | 在可携带实体上,使其显示在玩家上方,就像CTF旗帜一样。 |
chargeable (cmd) | 允许HE给实体充电相当于接触实体。 |
rotating (cmd) | 导致模型像物品一样旋转和摆动(仅适用于goalinfo/goalitems)。 |
noshrink (cmd) | 目标在出现/消失时不会放大或缩小。 |
nodrop (cmd) | 在可携带实体上,阻止“dropflag”命令影响它。 |
keepondeath (cmd) | 在可携带实体上,死后不会掉落。 |
usegauntlet (cmd) | 实体必须被斧头砍而不是被触摸。 |
allowdead (cmd) | 允许死去的玩家在target_cycle使用中被选中。 |
allowsame (cmd) | 允许同一个玩家在target_cycle使用中被选中。 |
faildirection (cmd) | 力场方向字段适用于那些不满足条件的人。 |
allowsentrylock (cmd) | 哨兵允许通过力场锁定目标(不好的主意:)。 |
disguisecriteria (cri) | 条件适用于特工的表面队伍/职业,而不是实际的。 |
目标系统是将所有实体捆绑在一起形成更复杂事物的关键。当一个实体的状态发生变化时,它会检查<state>target,然后尝试将每个命名的目标设置为指定的状态(如果未指定,默认状态始终为“active”)。如果通过在状态前加一个~字符来强制,则会忽略条件(以及“give”/“teamscore”),例如
"carriedtarget" "redalarms,escapedoors=~disabled"
将导致警报变为活动状态(如果未指定,则为默认状态),并强制所有逃生门禁用,即使它们目前处于活动状态(即打开)。
要可被目标化,实体必须有一个targetname或groupname键,区别如下
targetname | 只能包含一个名称,影响一些实体 - 例如,targetname将阻止玩家接触门时门打开,传送器将只查看目标的名称来确定目的地等。 |
groupname | 可以包含任意数量的名称,用逗号分隔,并将响应对其中任何一个的触发 - 这允许更复杂的实体交互。它不会影响具有targetname的实体。 |
只要可能,请使用groupname而不是targetname - 它更加灵活,并且不容易产生副作用。
请注意,未强制的触发器(即没有~)将把相同的激活者传递给触发的实体(即玩家,而不是传递触发器的实体)。此外,条件仍然针对激活者进行检查)。
如果你发现这方面有问题,请尝试在控制台中将g_mapentDebug设置为1 - 请注意,你将从这里获得很多垃圾信息,而且它可能没有多大帮助。
有关更多信息,请参见实体状态部分。
条件是对激活者是否能够真正触发此实体的检查。以下字段适用,以及一些标志
allowteams | 只允许指定的队伍(例如“red,blue”)。 |
allowclasses | 只允许指定的职业(例如“recon,grenadier,agent”)。 |
holding | 只有持有所有指定实体的玩家才能使用(例如“redkey1,redkey2”)。 |
notholding | 只有没有持有所有指定实体的玩家才能使用(例如“redkey1,redkey2”)。 |
clientstats | 只有与指定clientstats匹配的玩家才能使用(例如“health<50,gren1=0,armour<!”)(见下文)。 |
checkstate | 只有当每个命名实体中至少有一个处于指定状态时,触发器才有效,例如“redalarms=inactive,redflag=carried”)。如果你想要确保所有命名的实体都处于某个状态,只需给每个实体一个唯一的组,然后检查这些组。 |
disguisecriteria | 条件适用于特工的表面队伍/职业,而不是实际的。 |
clientstats值是按照以下方式构建的评估器列表:[关键字][评估器][值],其中评估器是“=”、“<”、“>”、“<=”或“>=”。值是整数或“!”(表示激活者的职业最大值),键可以是以下内容:health、armor、ammo_shells、ammo_nails、ammo_rockets、ammo_cells、score、gren1、gren2、quad、regen、flight、battlesuit、invis、haste、ammo_medikit、ammo_charge、invuln、aqualung、gas、stun、flash、tranq、fire、skill。
如果条件失败(在应用reversecriteria标志后),将执行“failtarget”键 - 请注意,失败没有“等待”,所以不要做任何处理器密集型操作。
每个地图都应该附带一个“mapinfo”文件,该文件位于与地图相同的目录下,例如maps/etf_map.bsp应该附带一个maps/etf_map.mapinfo文件。
mapinfo定义了描述地图的各种属性,以及覆盖世界生成属性。文件格式类似于
mapinfo { map "etf_map"; // BSP name longname "Mapname"; // Long name for map, general description of it type "etf"; // Game it is for (all etf maps are marked with "etf") gameindices "1,2,3"; // Available gameindices atmosphere "T=RAIN,B=5 10,C=0.5,G=0.5 2,BV=0,GV=0 100,W=1 2,D=300"; // Atmospheric effects gameindexDef 1 { // Gameindex Definition longname "Mapname CTF"; // Long name for this gameindex // Map info (former .mpi) mapinfo "Blablabladebladebla"; // Class limits etc green_limit "0"; yellow_limit "0"; sniper_limit "2"; grenadier_limit "3"; red_soldier_limit "5"; blue_soldier_limit "6"; atmosphere "T=SNOW"; } gameindexDef 2 { longname "Mapname 1-flag CTF"; mapinfo "Blablabladebladebla"; green_limit "0"; yellow_limit "0"; } }
gameIndexDef块中的条目会覆盖默认条目(这些条目没有与任何特定游戏索引关联,并适用于所有条目)。注意,gameindices字段是必需的,如果没有指定,将默认为“1”(无论有多少个gameIndexDef块)。
map | 与它关联的地图的名称(未使用,仅为完整性)。 |
longname | 地图的“人类”名称。 |
mapinfo | 对地图及其玩法的简要描述。 |
type | 始终应为“etf”。 |
gameindices | 应指示所有有效的索引。 |
minplayers | 地图上推荐的最小玩家数量。 |
maxplayers | 地图上推荐的最大玩家数量。 |
每个地图+游戏索引组合在投票列表中被视为完全独立的地图。游戏索引应为 1 到 9 之间的单个数字。
这里未提及的任何字段将覆盖 worldspawn 键(例如 atmosphere)。
游戏索引使在地图中拥有多个场景成为可能。基本上,所有具有“gameindex”键的实体只会在服务器的g_gameindex设置为相同值时才会生成。
例如,当一个实体具有“gameindex”为“1,2”时,它只有在服务器上的g_gameindex(默认值为1)为1或2时才会生成。
此外,为了让服务器知道哪些游戏索引允许用于此地图,.arena文件有一个新的键。该键名为“gameindices”,其值为允许的游戏索引数组。例如“1,2,3”,这将导致g_gameindex 1、2 和 3 对此地图有效。如果在加载地图时它的值为其他值,则默认值为 1。
Q3F 使用随 GtkRadiant 一起分发的 q3map 1.1-TA-beta 及更高版本的 -custinfoparms 参数来扩展 Quake3 的着色器语言。
当前的自定义信息参数
particleclip 粒子与该表面发生碰撞。forcefield 与 func_forcefield 实体结合使用以创建力场。footprints 如果客户端走在设置了 footprints 参数的着色器上,他会留下脚印。stone 石头脚步声和反弹声。wood 木头脚步声和反弹声。seethrough 即使是固体表面,哨兵也可以透过半透明表面进行追踪。
要使用这些参数,你需要将一个“custinfoparms.txt”文件添加到你的脚本目录(你的着色器所在的位置),并使用额外的 -custinfoparms 命令行参数执行编译过程中的 bsp 阶段。
与 Q3F 一起使用的文本文件的内容
// Custom Surfaceparms file // Custom Contentsflags { particleclip 0x2000 forcefield 0x4000 } // Custom Surfaceflags { footprints 0x80000 stone 0x100000 wood 0x200000 seethrough 0x400000 }