跳轉到內容

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
}
華夏公益教科書