mirror of
https://github.com/fortressforever/fortressforever-scripts.git
synced 2024-11-24 21:41:06 +00:00
Merge branch 'master' into features/disabling-security-rewards
Conflicts: resource/FortressForever_english.txt
This commit is contained in:
commit
25009c6367
39 changed files with 540 additions and 388 deletions
|
@ -1,4 +1,4 @@
|
|||
exec userconfig.cfg
|
||||
|
||||
// This config will be executed every time you spawn as this class
|
||||
// For more information, see our tutorials on the Fortress-Forever Wiki. http://www.fortress-forever.com/wiki/Main_Page
|
||||
// For more information, see our tutorials on the Fortress-Forever Wiki. http://www.fortress-forever.com/wiki/
|
||||
|
|
|
@ -66,5 +66,4 @@ cl_updaterate "66"
|
|||
con_enable 1
|
||||
//cl_interp "0.03"
|
||||
|
||||
name "WhenFFwillOut"
|
||||
|
||||
|
|
|
@ -4,4 +4,4 @@
|
|||
// IMPORTANT: This file DOES NOT auto-execute.
|
||||
// It must be executed in the developer console with "exec userconfig.cfg" OR in the <classname>.cfg files.
|
||||
// The first line of each <classname>.cfg should be "exec userconfig.cfg".
|
||||
// For more information, see our tutorials on the Fortress-Forever Wiki. http://www.fortress-forever.com/wiki/Main_Page
|
||||
// For more information, see our tutorials on the Fortress-Forever Wiki. http://www.fortress-forever.com/wiki/
|
||||
|
|
|
@ -42,8 +42,8 @@
|
|||
SearchPaths
|
||||
{
|
||||
Game |gameinfo_path|.
|
||||
Game hl2
|
||||
Game FortressForever
|
||||
Game |gameinfo_path|..\hl2
|
||||
Game |gameinfo_path|..\platform
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
83
maps/ff_cornfield.lua
Normal file
83
maps/ff_cornfield.lua
Normal file
|
@ -0,0 +1,83 @@
|
|||
IncludeScript("base_id");
|
||||
IncludeScript("base_respawnturret");
|
||||
IncludeScript("base_location");
|
||||
|
||||
respawnturret_attackers = base_respawnturret:new({ team = attackers })
|
||||
respawnturret_defenders = base_respawnturret:new({ team = defenders })
|
||||
|
||||
cornhealthkit = genericbackpack:new({
|
||||
health = 50,
|
||||
model = "models/items/healthkit.mdl",
|
||||
materializesound = "Item.Materialize",
|
||||
touchsound = "HealthKit.Touch"
|
||||
})
|
||||
cornarmorkit = genericbackpack:new({
|
||||
armor = 200,
|
||||
model = "models/items/armour/armour.mdl",
|
||||
materializesound = "Item.Materialize",
|
||||
touchsound = "ArmorKit.Touch"
|
||||
})
|
||||
cornammopack = genericbackpack:new({
|
||||
health = 35,
|
||||
armor = 50,
|
||||
grenades = 20,
|
||||
nails = 50,
|
||||
shells = 100,
|
||||
rockets = 15,
|
||||
cells = 70,
|
||||
model = "models/items/backpack/backpack.mdl",
|
||||
materializesound = "Item.Materialize",
|
||||
touchsound = "Backpack.Touch"
|
||||
})
|
||||
|
||||
function cornammopack:dropatspawn() return false
|
||||
end
|
||||
|
||||
corngrenadepack = genericbackpack:new({
|
||||
health = 35,
|
||||
armor = 50,
|
||||
grenades = 20,
|
||||
nails = 50,
|
||||
shells = 100,
|
||||
rockets = 15,
|
||||
cells = 70,
|
||||
mancannons = 1,
|
||||
gren1 = 2,
|
||||
gren2 = 1,
|
||||
respawntime = 30,
|
||||
model = "models/items/backpack/backpack.mdl",
|
||||
materializesound = "Item.Materialize",
|
||||
touchsound = "Backpack.Touch"
|
||||
})
|
||||
|
||||
function corngrenadepack:dropatspawn() return false
|
||||
end
|
||||
|
||||
detpack_wall_open = nil
|
||||
|
||||
function onroundreset()
|
||||
-- close the door
|
||||
if detpack_wall_open then
|
||||
-- there's no "close".. wtf
|
||||
OutputEvent("detpack_hole", "Toggle")
|
||||
detpack_wall_open = nil
|
||||
end
|
||||
-- Reset The Turrets
|
||||
respawnturret_attackers = base_respawnturret:new({ team = attackers })
|
||||
respawnturret_defenders = base_respawnturret:new({ team = defenders })
|
||||
end
|
||||
|
||||
detpack_trigger = trigger_ff_script:new({})
|
||||
function detpack_trigger:onexplode( trigger_entity )
|
||||
if IsDetpack( trigger_entity ) then
|
||||
ConsoleToAll("The door has been blown open!")
|
||||
OutputEvent("detpack_hole", "Toggle")
|
||||
detpack_wall_open = true
|
||||
end
|
||||
return EVENT_ALLOWED
|
||||
end
|
||||
|
||||
-- Don't want any body touching/triggering it except the detpack
|
||||
function trigger_detpackable_door:allowed( trigger_entity ) return EVENT_DISALLOWED
|
||||
end
|
||||
|
21
maps/ff_cornfield.txt
Normal file
21
maps/ff_cornfield.txt
Normal file
|
@ -0,0 +1,21 @@
|
|||
INVADE AND DEFEND
|
||||
|
||||
Objective:
|
||||
|
||||
Blue team starts as the attacker. Red team
|
||||
starts as the defender.
|
||||
|
||||
The attacking team must take control of the
|
||||
town by pushing through and capping the four
|
||||
Command Points sequentially. The defending
|
||||
team simply tries to hold out as long as they
|
||||
can. Once the attackers succeed, teams swap,
|
||||
and play begins again.
|
||||
|
||||
Command Points are captured by taking the flag
|
||||
from the previous point and carrying it to the
|
||||
next. When a Command Point is secured, the flag
|
||||
required to capture the next Command Point
|
||||
appears on top of it. For example, the flag
|
||||
needed to capture Command Point 3 will always
|
||||
spawn at Command Point 2.
|
|
@ -14,7 +14,8 @@ function startup()
|
|||
SetPlayerLimit( Team.kYellow, -1 )
|
||||
SetPlayerLimit( Team.kGreen, -1 )
|
||||
|
||||
SetTeamName( Team.kRed, "Destroyers" )
|
||||
SetTeamName( Team.kBlue, "Blue Orcas" )
|
||||
SetTeamName( Team.kRed, "Red Gazelles" )
|
||||
end
|
||||
|
||||
function precache()
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
-- ff_push.lua
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- includes
|
||||
-----------------------------------------------------------------------------
|
||||
IncludeScript("base_push");
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- global overrides
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
local orig_startup = startup
|
||||
|
||||
function startup()
|
||||
-- set up team names. Localisation?
|
||||
SetTeamName( Team.kBlue, "Ball Locks" )
|
||||
SetTeamName( Team.kRed, "Rocket Expediting" )
|
||||
|
||||
orig_startup()
|
||||
end
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- triggers for doors
|
||||
-----------------------------------------------------------------------------
|
||||
red_respawn_triggerA = respawndoor:new({ team = Team.kRed })
|
||||
red_respawn_triggerB = respawndoor:new({ team = Team.kRed })
|
||||
|
||||
blue_respawn_triggerA = respawndoor:new({ team = Team.kBlue })
|
||||
blue_respawn_triggerB = respawndoor:new({ team = Team.kBlue })
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- unique push locations
|
||||
-----------------------------------------------------------------------------
|
||||
location_blue_corridor = location_info:new({ text = "Corridor", team = Team.kBlue })
|
||||
location_red_corridor = location_info:new({ text = "Corridor", team = Team.kRed })
|
||||
|
||||
location_blue_lasers = location_info:new({ text = "Lasers", team = Team.kBlue })
|
||||
location_red_lasers = location_info:new({ text = "Lasers", team = Team.kRed })
|
||||
|
||||
location_blue_side_warehouse = location_info:new({ text = "Side Warehouse", team = Team.kBlue })
|
||||
location_red_side_warehouse = location_info:new({ text = "Side Warehouse", team = Team.kRed })
|
||||
|
||||
location_blue_loading_bay = location_info:new({ text = "Loading Bay", team = Team.kBlue })
|
||||
location_red_loading_bay = location_info:new({ text = "Loading Bay", team = Team.kRed })
|
||||
|
||||
location_middle_warehouse = location_info:new({ text = "Middle Warehouse", team = Team.kUnassigned })
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
PUSH SCORING
|
||||
|
||||
Objective: Grab the ball from the centre warehouse and then run it to the enemy company's loading zone! Capture it on the raised platform.
|
||||
The team with the most captures at the end of the game wins!
|
|
@ -1,211 +0,0 @@
|
|||
// Push soundscape file
|
||||
// Author: Defrag
|
||||
// Some sections based on existing valve soundscapes but modified
|
||||
|
||||
// generic outside sound
|
||||
"ff.outside"
|
||||
{
|
||||
// constant wind base
|
||||
"playlooping"
|
||||
{
|
||||
"volume" "0.2"
|
||||
"pitch" "100"
|
||||
"wave" "ambient/wind/ff_wasteland_wind.wav"
|
||||
}
|
||||
|
||||
// Wind gusts (based on cliffe's cs_assault settings)
|
||||
"playrandom"
|
||||
{
|
||||
"time" "20,30"
|
||||
"volume" "0.3,0.4"
|
||||
"pitch" "90,110"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "ambient/wind/wind_snippet1.wav"
|
||||
"wave" "ambient/wind/wind_snippet2.wav"
|
||||
"wave" "ambient/wind/wind_snippet3.wav"
|
||||
"wave" "ambient/wind/wind_snippet4.wav"
|
||||
"wave" "ambient/wind/wind_snippet5.wav"
|
||||
}
|
||||
}
|
||||
}
|
||||
// Rats. Ach, gash!
|
||||
"push.rats"
|
||||
{
|
||||
"playrandom"
|
||||
{
|
||||
"time" "20,30"
|
||||
"volume" "0.3,0.5"
|
||||
"pitch" "90,100"
|
||||
"position" "random"
|
||||
"soundlevel" "SNDLVL_140db"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "ambient/creatures/rats1.wav"
|
||||
"wave" "ambient/creatures/rats2.wav"
|
||||
"wave" "ambient/creatures/rats3.wav"
|
||||
"wave" "ambient/creatures/rats4.wav"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// workshop noises
|
||||
"push.workshop"
|
||||
{
|
||||
"playrandom"
|
||||
{
|
||||
"time" "30,60"
|
||||
"volume" "0.1,0.2"
|
||||
"pitch" "90,110"
|
||||
"position" "random"
|
||||
"soundlevel" "SNDLVL_140db"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "ambient/push/airhose.wav"
|
||||
"wave" "ambient/push/airwrench1.wav"
|
||||
"wave" "ambient/push/airwrench2.wav"
|
||||
}
|
||||
}
|
||||
}
|
||||
// outside area between the central warehouse and the base corridor
|
||||
"push.outside"
|
||||
{
|
||||
"dsp" "1"
|
||||
"dsp_volume" "0.5"
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "ff.outside"
|
||||
"volume" "1.0"
|
||||
}
|
||||
}
|
||||
|
||||
// capture point area
|
||||
"push.capturepoint"
|
||||
{
|
||||
"dsp" "1"
|
||||
"dsp_volume" "0.5"
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "ff.outside"
|
||||
"volume" "1.0"
|
||||
}
|
||||
|
||||
// train going past
|
||||
"playrandom"
|
||||
{
|
||||
"time" "120,180"
|
||||
"volume" "0.3"
|
||||
"pitch" "100"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "ambient/machines/train_rumble.wav"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// side warehouse with no roof
|
||||
"push.sidewarehouse"
|
||||
{
|
||||
"dsp" "1"
|
||||
"dsp_volume" "0.5"
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "ff.outside"
|
||||
"volume" "1.0"
|
||||
}
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "push.rats"
|
||||
"volume" "1.0"
|
||||
}
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "push.workshop"
|
||||
"volume" "1.0"
|
||||
}
|
||||
}
|
||||
|
||||
// respawn
|
||||
"push.respawn"
|
||||
{
|
||||
"dsp" "1"
|
||||
"dsp_volume" "0.5"
|
||||
|
||||
// General ambient noise
|
||||
"playlooping"
|
||||
{
|
||||
"volume" "0.3"
|
||||
"pitch" "100"
|
||||
"wave" "ambient/push/inside_amb1.wav"
|
||||
}
|
||||
|
||||
"playrandom"
|
||||
{
|
||||
"time" "30,60"
|
||||
"volume" "0.3,0.5"
|
||||
"pitch" "90,100"
|
||||
"position" "random"
|
||||
"soundlevel" "SNDLVL_140db"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "ambient/materials/metal4.wav"
|
||||
"wave" "ambient/materials/rustypipes1.wav"
|
||||
"wave" "ambient/materials/rustypipes2.wav"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// main warehouse in centre
|
||||
"push.centralwarehouse"
|
||||
{
|
||||
"dsp" "1"
|
||||
"dsp_volume" "0.5"
|
||||
|
||||
// General ambient noise
|
||||
"playlooping"
|
||||
{
|
||||
"volume" "0.5"
|
||||
"pitch" "100"
|
||||
"wave" "ambient/push/inside_amb1.wav"
|
||||
}
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "push.workshop"
|
||||
"volume" "1.0"
|
||||
}
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "ff.outside"
|
||||
"volume" "0.6"
|
||||
}
|
||||
}
|
||||
|
||||
// doughnut shaped hallway that connects the respawn, cap point, side warehouse etc.
|
||||
"push.doughnut"
|
||||
{
|
||||
"dsp" "1"
|
||||
"dsp_volume" "0.5"
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "push.respawn"
|
||||
"volume" "1.0"
|
||||
}
|
||||
|
||||
"playsoundscape"
|
||||
{
|
||||
"name" "ff.outside"
|
||||
"volume" "0.6"
|
||||
}
|
||||
}
|
|
@ -124,6 +124,14 @@ blue_dspawn = { validspawn = blue_d_only }
|
|||
-- AND THEN, SOME MORE STUFF...
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
red_window_clip = trigger_ff_clip:new({ clipflags = {
|
||||
ClipFlags.kClipAllPlayers, ClipFlags.kClipAllProjectiles,
|
||||
ClipFlags.kClipAllBullets,ClipFlags.kClipAllGrenades } })
|
||||
|
||||
blue_window_clip = trigger_ff_clip:new({ clipflags = {
|
||||
ClipFlags.kClipAllPlayers, ClipFlags.kClipAllProjectiles,
|
||||
ClipFlags.kClipAllBullets,ClipFlags.kClipAllGrenades } })
|
||||
|
||||
red_sec = red_security_trigger:new()
|
||||
blue_sec = blue_security_trigger:new()
|
||||
|
||||
|
|
|
@ -6,8 +6,10 @@
|
|||
-- This file is loaded automatically whenever a map is loaded.
|
||||
-- Do not change this file.
|
||||
-----------------------------------------------------------------------------
|
||||
local _G = getfenv(0)
|
||||
|
||||
require "util.utils"
|
||||
Class = require "util.class"
|
||||
Collection = require "util.collection"
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- defines
|
||||
|
@ -48,6 +50,61 @@ function baseclass:new (o)
|
|||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- set up pairs and ipairs for iterating the global entity list
|
||||
--
|
||||
-- Example usage:
|
||||
--
|
||||
-- for ent_id, ent in pairs(GlobalEntityList) do
|
||||
-- print(ent_id, ent)
|
||||
-- end
|
||||
--
|
||||
-- Note: The order of iteration is always arbitrary
|
||||
-----------------------------------------------------------------------------
|
||||
local GlobalEntityListIterator = function()
|
||||
local entity = GlobalEntityList:FirstEntity()
|
||||
return function()
|
||||
local cur_ent = entity
|
||||
entity = GlobalEntityList:NextEntity(cur_ent)
|
||||
if cur_ent then
|
||||
return cur_ent:GetId(), cur_ent
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local ipairs_base = ipairs
|
||||
ipairs = function(t)
|
||||
if t == GlobalEntityList then
|
||||
return GlobalEntityListIterator()
|
||||
end
|
||||
return ipairs_base(t)
|
||||
end
|
||||
|
||||
local pairs_base = pairs
|
||||
pairs = function(t)
|
||||
if t == GlobalEntityList then
|
||||
return GlobalEntityListIterator()
|
||||
end
|
||||
return pairs_base(t)
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- make luabind's class_info function safer
|
||||
-- (don't crash if class_info() is called on non-luabind objects)
|
||||
-----------------------------------------------------------------------------
|
||||
local class_info_base = class_info
|
||||
class_info = function(obj)
|
||||
local obj_type = type(obj)
|
||||
if obj_type == "userdata" and getmetatable(obj).__luabind_class then
|
||||
return class_info_base(obj)
|
||||
end
|
||||
return {}
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- reset everything
|
||||
-----------------------------------------------------------------------------
|
||||
|
|
|
@ -568,7 +568,7 @@ function update_zone_text( player )
|
|||
if not zone_status then
|
||||
AddHudText( player, "defender_points_text", "#FF_Defenders", text_x, text_line1y, text_align )
|
||||
AddHudText( player, "defender_points_text2", "#ADZ_ScoreNotice", text_x, text_line2y, text_align )
|
||||
AddHudTimer( player, "defender_points_timer", current_timer +1, -1, text_x, text_line3y, text_align )
|
||||
AddHudTimer( player, "defender_points_timer", current_timer, -1, text_x, text_line3y, text_align )
|
||||
else
|
||||
AddHudText( player, "attackers_in_text", "#FF_Attackers", text_x, text_line1y, text_align )
|
||||
AddHudText( player, "attackers_in_text2", "#ADZ_AreIn", text_x, text_line2y, text_align )
|
||||
|
@ -596,7 +596,7 @@ function update_zone_text( player )
|
|||
if not zone_status then
|
||||
AddHudTextToAll( "defender_points_text", "#FF_Defenders", text_x, text_line1y, text_align )
|
||||
AddHudTextToAll( "defender_points_text2", "#ADZ_ScoreNotice", text_x, text_line2y, text_align )
|
||||
AddHudTimerToAll( "defender_points_timer", current_timer +1, -1, text_x, text_line3y, text_align )
|
||||
AddHudTimerToAll( "defender_points_timer", current_timer, -1, text_x, text_line3y, text_align )
|
||||
else
|
||||
AddHudTextToAll( "attackers_in_text", "#FF_Attackers", text_x, text_line1y, text_align )
|
||||
AddHudTextToAll( "attackers_in_text2", "#ADZ_AreIn", text_x, text_line2y, text_align )
|
||||
|
|
|
@ -375,7 +375,7 @@ function player_onchat( player, chatstring )
|
|||
func(unpack(params))
|
||||
else
|
||||
ChatToPlayer(player, "^"..CHAT_COMMAND_COLOR_ERROR.."Unexpected error while executing command")
|
||||
chat_error("Command function find error for "..command.."("..paramstring.."):".. finderror)
|
||||
chatbase_error("Command function find error for "..command.."("..paramstring.."):".. finderror)
|
||||
return true
|
||||
end
|
||||
|
||||
|
|
|
@ -785,7 +785,7 @@ function flaginfo( player_entity )
|
|||
else
|
||||
AddHudTextToAll("flag_return_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
||||
end
|
||||
AddHudTimer(player, "flag_return_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudTimer(player, "flag_return_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudIcon(player, hudstatusicondropped, ( "cp_flag_d" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
elseif _G[flagname].status == 0 then
|
||||
AddHudText(player, "flag_athome", "#AD_FlagIsAt", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
||||
|
@ -802,7 +802,7 @@ function flaginfo( player_entity )
|
|||
else
|
||||
AddHudText(player, "flag_tobase_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
||||
end
|
||||
AddHudTimer(player, "flag_tobase_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudTimer(player, "flag_tobase_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudIcon(player, hudstatusicontobase, ( "cp_flag_h" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
end
|
||||
|
||||
|
@ -891,7 +891,7 @@ function update_hud()
|
|||
else
|
||||
AddHudTextToAll("flag_return_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
||||
end
|
||||
AddHudTimerToAll("flag_return_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudTimerToAll("flag_return_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudIconToAll( hudstatusicondropped, ( "cp_flag_d" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
elseif _G[flagname].status == 0 then
|
||||
AddHudTextToAll("flag_athome", "#AD_FlagIsAt", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
||||
|
@ -908,7 +908,7 @@ function update_hud()
|
|||
else
|
||||
AddHudTextToAll("flag_tobase_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
||||
end
|
||||
AddHudTimerToAll("flag_tobase_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudTimerToAll("flag_tobase_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
||||
AddHudIconToAll(hudstatusicontobase, ( "cp_flag_h" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
end
|
||||
|
||||
|
|
|
@ -1026,7 +1026,7 @@ function flaginfo( player_entity )
|
|||
else
|
||||
AddHudTextToAll("flag_return_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0, 2)
|
||||
end
|
||||
AddHudTimer(player, "flag_return_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudTimer(player, "flag_return_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudIcon(player, hudstatusicondropped, ( "cp_flag_d" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
elseif _G[flagname].status == 0 then
|
||||
AddHudText(player, "flag_athome", "#AD_FlagIsAt", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0, 2)
|
||||
|
@ -1043,7 +1043,7 @@ function flaginfo( player_entity )
|
|||
else
|
||||
AddHudText(player, "flag_tobase_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0, 2)
|
||||
end
|
||||
AddHudTimer(player, "flag_tobase_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudTimer(player, "flag_tobase_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudIcon(player, hudstatusicontobase, ( "cp_flag_h" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
end
|
||||
|
||||
|
@ -1140,7 +1140,7 @@ function update_hud()
|
|||
else
|
||||
AddHudTextToAll("flag_return_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0, 2)
|
||||
end
|
||||
AddHudTimerToAll("flag_return_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudTimerToAll("flag_return_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudIconToAll( hudstatusicondropped, ( "cp_flag_d" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
elseif _G[flagname].status == 0 then
|
||||
AddHudTextToAll("flag_athome", "#AD_FlagIsAt", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0, 2)
|
||||
|
@ -1157,7 +1157,7 @@ function update_hud()
|
|||
else
|
||||
AddHudTextToAll("flag_tobase_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0, 2)
|
||||
end
|
||||
AddHudTimerToAll("flag_tobase_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudTimerToAll("flag_tobase_timer", current_timer, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0, 3)
|
||||
AddHudIconToAll(hudstatusicontobase, ( "cp_flag_h" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
||||
end
|
||||
|
||||
|
|
|
@ -54,6 +54,13 @@ function security_off( team )
|
|||
clip:SetClipFlags({ClipFlags.kClipTeamBlue})
|
||||
end
|
||||
end
|
||||
|
||||
-- add a timer for the security on HUD
|
||||
if team == "red" then
|
||||
AddHudTimerToAll( "red_sec_timer", SECURITY_LENGTH, -1, button_red.iconx, button_red.icony + 15, button_red.iconalign )
|
||||
else
|
||||
AddHudTimerToAll( "blue_sec_timer", SECURITY_LENGTH, -1, button_blue.iconx, button_blue.icony + 15, button_blue.iconalign )
|
||||
end
|
||||
end
|
||||
|
||||
-- called when security gets turned on (team is a string prefix, like "red")
|
||||
|
@ -76,6 +83,9 @@ function security_on( team )
|
|||
clip:SetClipFlags(_G[clipname].clipflags)
|
||||
end
|
||||
end
|
||||
|
||||
-- remove security timer
|
||||
RemoveHudItemFromAll( team.."_sec_timer" )
|
||||
end
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
@ -241,6 +251,8 @@ blue_security_trigger = base_security_trigger:new( { team = Team.kBlue, button =
|
|||
-- Hurts
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
-- backwards compatibility
|
||||
hurt = team_only_trigger:new({})
|
||||
-- red lasers hurt blue and vice-versa
|
||||
red_security_hurt = not_red_trigger:new({})
|
||||
blue_security_hurt = not_blue_trigger:new({})
|
||||
|
|
|
@ -537,6 +537,7 @@ function baseflag:spawn()
|
|||
LogLuaEvent(0, 0, "flag_spawn","flag_name",flag:GetName())
|
||||
self.status = 0
|
||||
self:refreshStatusIcons(flag:GetName())
|
||||
flag:StartTrail(self.team)
|
||||
end
|
||||
|
||||
function baseflag:addnotouch(player_id, duration)
|
||||
|
@ -723,12 +724,12 @@ end
|
|||
function baseflag:hasanimation() return true end
|
||||
|
||||
function baseflag:gettouchsize( mins, maxs )
|
||||
mins.x = mins.x
|
||||
mins.y = mins.y
|
||||
maxs.x = maxs.x
|
||||
maxs.y = maxs.y
|
||||
mins.x = mins.x * 1.50
|
||||
mins.y = mins.y * 1.50
|
||||
maxs.x = maxs.x * 1.50
|
||||
maxs.y = maxs.y * 1.50
|
||||
mins.z = 0
|
||||
maxs.z = maxs.z * 0.65
|
||||
maxs.z = maxs.z * 0.80
|
||||
end
|
||||
|
||||
function baseflag:getphysicssize( mins, maxs )
|
||||
|
@ -756,7 +757,7 @@ function baseflag:refreshStatusIcons(flagname)
|
|||
AddHudIconToAll( self.hudstatusiconcarried, ( flagname .. "_status" ), self.hudstatusiconx, self.hudstatusicony, self.hudstatusiconw, self.hudstatusiconh, self.hudstatusiconalign )
|
||||
elseif self.status == 2 then
|
||||
AddHudTextToAll( flagname .. "location", self.droppedlocation, self.hudstatusiconx + 24, (self.hudstatusicony + self.hudstatusiconh), self.hudstatusiconalign )
|
||||
AddHudTimerToAll( flagname .. "timer", FLAG_RETURN_TIME+1, -1, self.hudstatusiconx, (self.hudstatusicony + self.hudstatusiconh), self.hudstatusiconalign )
|
||||
AddHudTimerToAll( flagname .. "timer", FLAG_RETURN_TIME, -1, self.hudstatusiconx, (self.hudstatusicony + self.hudstatusiconh), self.hudstatusiconalign )
|
||||
AddHudIconToAll( self.hudstatusicondropped, ( flagname .. "_status" ), self.hudstatusiconx, self.hudstatusicony, self.hudstatusiconw, self.hudstatusiconh, self.hudstatusiconalign )
|
||||
else
|
||||
AddHudIconToAll( self.hudstatusiconhome, ( flagname .. "_status" ), self.hudstatusiconx, self.hudstatusicony, self.hudstatusiconw, self.hudstatusiconh, self.hudstatusiconalign )
|
||||
|
|
46
maps/includes/util/class.lua
Normal file
46
maps/includes/util/class.lua
Normal file
|
@ -0,0 +1,46 @@
|
|||
-- from http://lua-users.org/wiki/SimpleLuaClasses
|
||||
|
||||
function Class(base, _ctor)
|
||||
local c = {} -- a new class instance
|
||||
if not _ctor and type(base) == 'function' then
|
||||
_ctor = base
|
||||
base = nil
|
||||
elseif type(base) == 'table' then
|
||||
-- our new class is a shallow copy of the base class!
|
||||
for i,v in pairs(base) do
|
||||
c[i] = v
|
||||
end
|
||||
c._base = base
|
||||
end
|
||||
|
||||
-- the class will be the metatable for all its objects,
|
||||
-- and they will look up their methods in it.
|
||||
c.__index = c
|
||||
|
||||
-- expose a constructor which can be called by <classname>(<args>)
|
||||
local mt = {}
|
||||
|
||||
mt.__call = function(class_tbl, ...)
|
||||
local obj = {}
|
||||
setmetatable(obj,c)
|
||||
|
||||
if c._ctor then
|
||||
c._ctor(obj,...)
|
||||
end
|
||||
return obj
|
||||
end
|
||||
|
||||
c._ctor = _ctor
|
||||
c.is_a = function(self, klass)
|
||||
local m = getmetatable(self)
|
||||
while m do
|
||||
if m == klass then return true end
|
||||
m = m._base
|
||||
end
|
||||
return false
|
||||
end
|
||||
setmetatable(c, mt)
|
||||
return c
|
||||
end
|
||||
|
||||
return Class
|
222
maps/includes/util/collection.lua
Normal file
222
maps/includes/util/collection.lua
Normal file
|
@ -0,0 +1,222 @@
|
|||
-- backwards compatibility for the Collection class
|
||||
|
||||
local Class = require "util.class"
|
||||
require "util.utils"
|
||||
|
||||
local Collection = Class(function(self, entity_or_entities)
|
||||
self.entities = totable(entity_or_entities)
|
||||
self:SetupItemsKey()
|
||||
end)
|
||||
|
||||
Collection.filters = {
|
||||
[CF.kNone] = function(entity) return true end,
|
||||
[CF.kPlayers] = function(entity) return IsPlayer(entity) end,
|
||||
[CF.kHumanPlayers] = function(entity) return IsPlayer(entity) and not CastToPlayer(entity):IsBot() end,
|
||||
[CF.kBotPlayers] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):IsBot() end,
|
||||
[CF.kPlayerScout] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kScout end,
|
||||
[CF.kPlayerSniper] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kSniper end,
|
||||
[CF.kPlayerSoldier] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kSoldier end,
|
||||
[CF.kPlayerDemoman] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kDemoman end,
|
||||
[CF.kPlayerMedic] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kMedic end,
|
||||
[CF.kPlayerHWGuy] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kHwguy end,
|
||||
[CF.kPlayerPyro] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kPyro end,
|
||||
[CF.kPlayerSpy] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kSpy end,
|
||||
[CF.kPlayerEngineer] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kEngineer end,
|
||||
[CF.kPlayerCivilian] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kCivilian end,
|
||||
[CF.kPlayerScout] = function(entity) return IsPlayer(entity) and CastToPlayer(entity):GetClass() == Player.kScout end,
|
||||
[CF.kTeams] = function(entity) return IsEntity(entity) and entity:GetTeamId() >= Team.kSpectator and entity:GetTeamId() <= Team.kGreen end,
|
||||
[CF.kTeamSpec] = function(entity) return IsEntity(entity) and entity:GetTeamId() == Team.kSpectator end,
|
||||
[CF.kTeamBlue] = function(entity) return IsEntity(entity) and entity:GetTeamId() == Team.kBlue end,
|
||||
[CF.kTeamRed] = function(entity) return IsEntity(entity) and entity:GetTeamId() == Team.kRed end,
|
||||
[CF.kTeamYellow] = function(entity) return IsEntity(entity) and entity:GetTeamId() == Team.kYellow end,
|
||||
[CF.kTeamGreen] = function(entity) return IsEntity(entity) and entity:GetTeamId() == Team.kGreen end,
|
||||
[CF.kProjectiles] = function(entity) return IsProjectile(entity) end,
|
||||
[CF.kGrenades] = function(entity) return IsGrenade(entity) end,
|
||||
[CF.kInfoScipts] = function(entity) return IsInfoScript(entity) end,
|
||||
[CF.kInfoScript_Carried] = function(entity) return IsInfoScript(entity) and CastToInfoScript(entity):IsCarried() end,
|
||||
[CF.kInfoScript_Dropped] = function(entity) return IsInfoScript(entity) and CastToInfoScript(entity):IsDropped() end,
|
||||
[CF.kInfoScript_Returned] = function(entity) return IsInfoScript(entity) and CastToInfoScript(entity):IsReturned() end,
|
||||
[CF.kInfoScript_Active] = function(entity) return IsInfoScript(entity) and CastToInfoScript(entity):IsActive() end,
|
||||
[CF.kInfoScript_Inactive] = function(entity) return IsInfoScript(entity) and CastToInfoScript(entity):IsInactive() end,
|
||||
[CF.kInfoScript_Removed] = function(entity) return IsInfoScript(entity) and CastToInfoScript(entity):IsRemoved() end,
|
||||
[CF.kTraceBlockWalls] = function(entity) return true end, -- not applicable for this type of filtering
|
||||
[CF.kBuildables] = function(entity) return IsBuildable(entity) end,
|
||||
[CF.kDispenser] = function(entity) return IsDispenser(entity) end,
|
||||
[CF.kSentrygun] = function(entity) return IsSentrygun(entity) end,
|
||||
[CF.kDetpack] = function(entity) return IsDetpack(entity) end,
|
||||
[CF.kJumpPad] = function(entity) return IsJumpPad(entity) end,
|
||||
}
|
||||
|
||||
function Collection.PassesFilter(entity, filter)
|
||||
if not filter then filter = CF.kNone end
|
||||
assert(Collection.filters[filter], "Unknown filter: "..tostring(filter))
|
||||
return Collection.filters[filter](entity)
|
||||
end
|
||||
|
||||
function Collection.PassesFilters(entity, filters)
|
||||
if not filters then return true end
|
||||
filters = totable(filters)
|
||||
for _,filter in ipairs(filters) do
|
||||
if not Collection.PassesFilter(entity, filter) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function Collection:SetupItemsKey()
|
||||
-- keep a usable reference to the base metatable
|
||||
local real_obj = setmetatable({}, getmetatable(self))
|
||||
-- add special handling of the items key
|
||||
setmetatable(self, {
|
||||
-- the items key returns an iterator
|
||||
__index = function(t, k)
|
||||
if k == "items" then
|
||||
local i = 0
|
||||
local n = self:Count()
|
||||
return function()
|
||||
i = i + 1
|
||||
if i <= n then return self.entities[i] end
|
||||
end
|
||||
end
|
||||
return real_obj[k]
|
||||
end,
|
||||
-- protect the items key from being assigned
|
||||
__newindex = function(t, k, v)
|
||||
if k == "items" then
|
||||
return
|
||||
end
|
||||
real_obj[k] = v
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
-- lua tables start at index 1
|
||||
function Collection.ToLuaIndex(collection_index)
|
||||
return collection_index+1
|
||||
end
|
||||
|
||||
-- Collection started at index 0
|
||||
function Collection.ToCollectionIndex(lua_index)
|
||||
return lua_index-1
|
||||
end
|
||||
|
||||
function Collection:AddItem(entity_or_entities)
|
||||
local entities_to_add = totable(entity_or_entities)
|
||||
|
||||
for i,entity_to_add in ipairs(entities_to_add) do
|
||||
table.insert(self.entities, entity_to_add)
|
||||
end
|
||||
end
|
||||
|
||||
function Collection:AddFiltered(entity_or_entities, filters)
|
||||
local entities_to_add = totable(entity_or_entities)
|
||||
|
||||
for i,entity_to_add in ipairs(entities_to_add) do
|
||||
if Collection.PassesFilters(entity_to_add, filters) then
|
||||
table.insert(self.entities, entity_to_add)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Collection:RemoveItem(entity_or_entities)
|
||||
local entities_to_find = totable(entity_or_entities)
|
||||
|
||||
for i,entity_to_find in ipairs(entities_to_find) do
|
||||
local i = self:FindItemIndex(entity_to_find)
|
||||
if i then
|
||||
table.remove(self.entities, Collection.ToLuaIndex(i))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Collection:RemoveAllItems()
|
||||
table.clear(self.entities)
|
||||
end
|
||||
|
||||
function Collection:Count()
|
||||
return #self.entities
|
||||
end
|
||||
|
||||
function Collection:NumItems()
|
||||
return self:Count()
|
||||
end
|
||||
|
||||
function Collection:IsEmpty()
|
||||
return self:Count() == 0
|
||||
end
|
||||
|
||||
function Collection:HasItem(entity_or_entities)
|
||||
local entities_to_find = totable(entity_or_entities)
|
||||
|
||||
for i,entity_to_find in ipairs(entities_to_find) do
|
||||
if self:FindItemIndex(entity_to_find) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- this is a strange function
|
||||
function Collection:GetItem(entity_or_entities)
|
||||
local entities_to_find = totable(entity_or_entities)
|
||||
|
||||
for i,entity_to_find in ipairs(entities_to_find) do
|
||||
local i = self:FindItemIndex(entity_to_find)
|
||||
if i then
|
||||
return self:Element(i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Collection:FindItemIndex(entity_to_find)
|
||||
for i,entity in ipairs(self.entities) do
|
||||
if entity:GetId() == entity_to_find:GetId() then
|
||||
return Collection.ToCollectionIndex(i)
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function Collection:Element(i)
|
||||
return self.entities[Collection.ToLuaIndex(i)]
|
||||
end
|
||||
|
||||
function Collection:GetByFilter(filters)
|
||||
filters = totable(filters)
|
||||
|
||||
-- optimization for players
|
||||
local players_only = false
|
||||
for _,filter in ipairs(filters) do
|
||||
if filter >= CF.kPlayers and filter <= CF.kPlayerScout then
|
||||
players_only = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if players_only then
|
||||
self:AddFiltered(GetPlayers(), filters)
|
||||
else
|
||||
for ent_id, entity in ipairs(GlobalEntityList) do
|
||||
self:AddFiltered(entity, filters)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Collection:GetByName(name_or_names, filters)
|
||||
local names_to_find = totable(name_or_names)
|
||||
filters = totable(filters)
|
||||
|
||||
for i,name_to_find in ipairs(names_to_find) do
|
||||
self:AddFiltered(GetEntitiesByName(name_to_find), filters)
|
||||
end
|
||||
end
|
||||
|
||||
function Collection:GetInSphere(entity_or_origin, radius, filters)
|
||||
filters = totable(filters)
|
||||
local origin = IsEntity(entity_or_origin) and entity_or_origin:GetOrigin() or entity_or_origin
|
||||
local ignore_walls = not table.contains(filters, CF.kTraceBlockWalls)
|
||||
self:AddFiltered(GetEntitiesInSphere(origin, radius, ignore_walls), filters)
|
||||
end
|
||||
|
||||
return Collection
|
34
maps/includes/util/utils.lua
Normal file
34
maps/includes/util/utils.lua
Normal file
|
@ -0,0 +1,34 @@
|
|||
|
||||
function table.clear(tbl)
|
||||
for k in pairs(tbl) do
|
||||
tbl[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function table.contains(tbl, element)
|
||||
if tbl == nil then return false end
|
||||
for _, value in pairs(tbl) do
|
||||
if value == element then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function table.contains_any(tbl, elements)
|
||||
if tbl == nil or elements == nil then return false end
|
||||
for _, value in pairs(tbl) do
|
||||
for _, element in pairs(elements) do
|
||||
if value == element then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function totable(obj)
|
||||
if obj == nil then return {} end
|
||||
if type(obj) == "table" then return obj end
|
||||
return {obj}
|
||||
end
|
|
@ -462,7 +462,6 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"custom" "1"
|
||||
"tall" "16"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -471,7 +470,6 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"custom" "1"
|
||||
"tall" "18"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -480,7 +478,6 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"custom" "1"
|
||||
"tall" "24"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -489,7 +486,6 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"custom" "1"
|
||||
"tall" "32"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -498,7 +494,6 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"custom" "1"
|
||||
"tall" "40"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -510,7 +505,6 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "32"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -519,7 +513,6 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "35"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -528,7 +521,6 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "37"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -537,7 +529,6 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "43"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -546,7 +537,6 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "47"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
|
@ -802,7 +792,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "0"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
"yres" "1 10000"
|
||||
}
|
||||
}
|
||||
|
@ -815,7 +804,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
HudNumbers
|
||||
|
@ -827,7 +815,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
HudNumbersGlow
|
||||
|
@ -841,7 +828,6 @@ Scheme
|
|||
"scanlines" "2"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
HudNumbersSmall
|
||||
|
@ -853,7 +839,6 @@ Scheme
|
|||
"weight" "1000"
|
||||
"additive" "1"
|
||||
"antialias" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
HudSelectionNumbers
|
||||
|
@ -877,7 +862,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -892,7 +876,6 @@ Scheme
|
|||
"scanlines" "2"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -914,7 +897,7 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "14"
|
||||
"tall" "15"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "0"
|
||||
|
@ -1121,8 +1104,7 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "24"
|
||||
"tall" "32"
|
||||
"weight" "0"
|
||||
"additive" "0"
|
||||
"antialias" "1"
|
||||
|
@ -1132,8 +1114,7 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "40"
|
||||
"tall" "48"
|
||||
"weight" "0"
|
||||
"additive" "0"
|
||||
"antialias" "1"
|
||||
|
@ -1142,8 +1123,7 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "48"
|
||||
"tall" "64"
|
||||
"weight" "0"
|
||||
"additive" "0"
|
||||
"antialias" "1"
|
||||
|
@ -1152,7 +1132,6 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "80"
|
||||
"weight" "0"
|
||||
"yres" "1024 1199"
|
||||
|
@ -1161,7 +1140,6 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "96"
|
||||
"weight" "0"
|
||||
"yres" "1200 6000"
|
||||
|
@ -1177,7 +1155,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
CreditsText
|
||||
|
@ -1200,7 +1177,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
CreditsOutroText
|
||||
|
@ -1277,7 +1253,6 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "9"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
|
@ -1286,7 +1261,6 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "11"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
|
@ -1295,7 +1269,6 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "13"
|
||||
"weight" "600"
|
||||
"antialias" "1"
|
||||
|
@ -1304,7 +1277,6 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "16"
|
||||
"weight" "900"
|
||||
"antialias" "1"
|
||||
|
@ -1313,7 +1285,6 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "17"
|
||||
"weight" "1000"
|
||||
"antialias" "1"
|
||||
|
@ -1326,7 +1297,6 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "18"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
|
@ -1335,7 +1305,6 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "18"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
|
@ -1344,7 +1313,6 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "24"
|
||||
"weight" "600"
|
||||
"antialias" "1"
|
||||
|
@ -1353,7 +1321,6 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "36"
|
||||
"weight" "900"
|
||||
"antialias" "1"
|
||||
|
@ -1362,7 +1329,6 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "48"
|
||||
"weight" "1000"
|
||||
"antialias" "1"
|
||||
|
@ -1374,8 +1340,7 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "10"
|
||||
"tall" "12"
|
||||
"weight" "300"
|
||||
"antialias" "1"
|
||||
"yres" "1 599"
|
||||
|
@ -1383,8 +1348,7 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "12"
|
||||
"tall" "14"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
"yres" "600 767"
|
||||
|
@ -1392,8 +1356,7 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "14"
|
||||
"tall" "16"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
"yres" "768 1023"
|
||||
|
@ -1401,8 +1364,7 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "20"
|
||||
"tall" "24"
|
||||
"weight" "1000"
|
||||
"antialias" "1"
|
||||
"yres" "1024 1199"
|
||||
|
@ -1410,8 +1372,7 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "24"
|
||||
"tall" "30"
|
||||
"weight" "1000"
|
||||
"antialias" "1"
|
||||
"yres" "1200 10000"
|
||||
|
@ -1423,7 +1384,6 @@ Scheme
|
|||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"tall" "31"
|
||||
"custom" "1"
|
||||
"antialias" "1"
|
||||
}
|
||||
}
|
||||
|
@ -1433,7 +1393,6 @@ Scheme
|
|||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"tall" "31"
|
||||
"custom" "1"
|
||||
"antialias" "1"
|
||||
}
|
||||
}
|
||||
|
@ -1443,7 +1402,6 @@ Scheme
|
|||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"tall" "10"
|
||||
"custom" "1"
|
||||
"antialias" "1"
|
||||
|
||||
}
|
||||
|
@ -1454,7 +1412,6 @@ Scheme
|
|||
{
|
||||
"name" "FortressForever - HUD Glyphs"
|
||||
"tall" "20"
|
||||
"custom" "1"
|
||||
"antialias" "1"
|
||||
|
||||
}
|
||||
|
@ -1483,8 +1440,7 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "12"
|
||||
"custom" "1"
|
||||
"tall" "13"
|
||||
"antialias" "1"
|
||||
"additive" "0"
|
||||
}
|
||||
|
@ -1498,7 +1454,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"WeaponIconsSelected"
|
||||
|
@ -1512,7 +1467,6 @@ Scheme
|
|||
"blur" "5"
|
||||
"scanlines" "2"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"WeaponIconsClassSelect"
|
||||
|
@ -1524,7 +1478,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"WeaponIconsHUD"
|
||||
|
@ -1536,7 +1489,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"WeaponIconsSmall"
|
||||
|
@ -1548,7 +1500,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"AmmoIconsSmall"
|
||||
|
@ -1560,7 +1511,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"StatusGlyphs"
|
||||
|
@ -1572,7 +1522,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"StatusGlyphsSmall"
|
||||
|
@ -1584,7 +1533,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"GrenadeIcons"
|
||||
|
@ -1607,7 +1555,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"ClassGlyphs" // icons on hud when you disguise and such
|
||||
|
@ -1619,7 +1566,6 @@ Scheme
|
|||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"additive" "0"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1702,7 +1648,7 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "10"
|
||||
"tall" "12"
|
||||
"weight" "0"
|
||||
"dropshadow" "1"
|
||||
"antialias" "1"
|
||||
|
@ -1712,7 +1658,7 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "12"
|
||||
"tall" "14"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"dropshadow" "1"
|
||||
|
@ -1721,7 +1667,7 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "14"
|
||||
"tall" "16"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"dropshadow" "1"
|
||||
|
@ -1730,7 +1676,7 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "20"
|
||||
"tall" "24"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"dropshadow" "1"
|
||||
|
@ -1739,7 +1685,7 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "24"
|
||||
"tall" "30"
|
||||
"weight" "0"
|
||||
"antialias" "1"
|
||||
"dropshadow" "1"
|
||||
|
|
BIN
resource/FortressForever_brazilian.txt
Normal file
BIN
resource/FortressForever_brazilian.txt
Normal file
Binary file not shown.
BIN
resource/FortressForever_russian.txt
Normal file
BIN
resource/FortressForever_russian.txt
Normal file
Binary file not shown.
BIN
resource/FortressForever_spanish.txt
Normal file
BIN
resource/FortressForever_spanish.txt
Normal file
Binary file not shown.
Binary file not shown.
|
@ -252,9 +252,8 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"tall" "14"
|
||||
"tall" "16"
|
||||
"antialias" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
"DefaultBold" //doesn't appear to be used
|
||||
|
@ -263,7 +262,6 @@ Scheme
|
|||
{
|
||||
|
||||
"name" "Tahoma"
|
||||
"custom" "1"
|
||||
"tall" "16"
|
||||
"weight" "500"
|
||||
}
|
||||
|
@ -284,7 +282,6 @@ Scheme
|
|||
{
|
||||
|
||||
"name" "Verdana"
|
||||
"custom" "1"
|
||||
"tall" "12"
|
||||
"weight" "0"
|
||||
}
|
||||
|
@ -295,7 +292,6 @@ Scheme
|
|||
{
|
||||
|
||||
"name" "Verdana"
|
||||
"custom" "1"
|
||||
"tall" "13"
|
||||
"weight" "0"
|
||||
"dropshadow" "1"
|
||||
|
@ -307,7 +303,6 @@ Scheme
|
|||
{
|
||||
|
||||
"name" "Tahoma"
|
||||
"custom" "1"
|
||||
"tall" "14"
|
||||
"weight" "0"
|
||||
}
|
||||
|
@ -319,7 +314,6 @@ Scheme
|
|||
{
|
||||
|
||||
"name" "Verdana"
|
||||
"custom" "1"
|
||||
"tall" "18"
|
||||
"weight" "0"
|
||||
}
|
||||
|
@ -330,8 +324,7 @@ Scheme
|
|||
{
|
||||
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "16"
|
||||
"tall" "18"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
}
|
||||
|
@ -342,8 +335,7 @@ Scheme
|
|||
"1"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "16"
|
||||
"tall" "18"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
|
||||
|
@ -352,8 +344,7 @@ Scheme
|
|||
"2"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "18"
|
||||
"tall" "20"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
"yres" "600 767"
|
||||
|
@ -361,8 +352,7 @@ Scheme
|
|||
"3"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "22"
|
||||
"tall" "24"
|
||||
"weight" "500"
|
||||
"antialias" "1"
|
||||
"yres" "768 1023"
|
||||
|
@ -370,8 +360,7 @@ Scheme
|
|||
"4"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "24"
|
||||
"tall" "26"
|
||||
"weight" "600"
|
||||
"antialias" "1"
|
||||
"yres" "1024 1199"
|
||||
|
@ -379,7 +368,6 @@ Scheme
|
|||
"5"
|
||||
{
|
||||
"name" "FortressForever - HUD Font"
|
||||
"custom" "1"
|
||||
"tall" "32"
|
||||
"weight" "600"
|
||||
"antialias" "1"
|
||||
|
@ -581,7 +569,6 @@ Scheme
|
|||
"tall" "72"
|
||||
"weight" "400"
|
||||
"antialias" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -593,7 +580,6 @@ Scheme
|
|||
"tall" "120"
|
||||
"weight" "400"
|
||||
"antialias" "1"
|
||||
"custom" "1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
2.46.1
|
||||
2.5.0
|
||||
|
||||
CLIENT version:
|
||||
- only the first line of this file matters
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
2.46
|
||||
2.5.0
|
||||
|
||||
SERVER version:
|
||||
- only the first line of this file matters
|
||||
|
|
BIN
resource/gameui_brazilian.txt
Normal file
BIN
resource/gameui_brazilian.txt
Normal file
Binary file not shown.
BIN
resource/gameui_russian.txt
Normal file
BIN
resource/gameui_russian.txt
Normal file
Binary file not shown.
BIN
resource/gameui_spanish.txt
Normal file
BIN
resource/gameui_spanish.txt
Normal file
Binary file not shown.
|
@ -429,7 +429,7 @@
|
|||
"xpos" "275"
|
||||
"ypos" "49"
|
||||
"wide" "185"
|
||||
"tall" "24"
|
||||
"tall" "32"
|
||||
"autoResize" "0"
|
||||
"pinCorner" "0"
|
||||
"visible" "1"
|
||||
|
@ -439,7 +439,7 @@
|
|||
"textAlignment" "west"
|
||||
"dulltext" "0"
|
||||
"brighttext" "0"
|
||||
"wrap" "0"
|
||||
"wrap" "1"
|
||||
"Default" "0"
|
||||
}
|
||||
"innerDisplay"
|
||||
|
@ -500,10 +500,10 @@
|
|||
"border" "DepressedBorder"
|
||||
"scaleImage" "1"
|
||||
}
|
||||
"weapon"
|
||||
"Crosshair"
|
||||
{
|
||||
"ControlName" "ComboBox"
|
||||
"fieldName" "Weapon"
|
||||
"fieldName" "Crosshair"
|
||||
"xpos" "292"
|
||||
"ypos" "23"
|
||||
"wide" "150"
|
||||
|
|
|
@ -43,7 +43,7 @@ PlayerClassData
|
|||
AmmoData
|
||||
{
|
||||
"AMMO_SHELLS" "60"
|
||||
"AMMO_NAILS" "50"
|
||||
"AMMO_NAILS" "60"
|
||||
"AMMO_CELLS" "0"
|
||||
"AMMO_ROCKETS" "0"
|
||||
"AMMO_DETPACK" "0"
|
||||
|
@ -53,7 +53,7 @@ PlayerClassData
|
|||
MaxAmmoData
|
||||
{
|
||||
"AMMO_SHELLS" "75"
|
||||
"AMMO_NAILS" "100"
|
||||
"AMMO_NAILS" "75"
|
||||
"AMMO_CELLS" "30"
|
||||
"AMMO_ROCKETS" "25"
|
||||
"AMMO_DETPACK" "0"
|
||||
|
|
|
@ -27,6 +27,7 @@ PlayerClassData
|
|||
ArmamentsData
|
||||
{
|
||||
"weapon" "ff_weapon_crowbar"
|
||||
"weapon" "ff_weapon_shotgun"
|
||||
"weapon" "ff_weapon_supershotgun"
|
||||
"weapon" "ff_weapon_rpg"
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ WeaponData
|
|||
"CycleDecrement" "1" // Number of bullets fired per cycle
|
||||
|
||||
"Damage" "108" // Damage per burst
|
||||
"DamageRadius" "150" // Radius of damage
|
||||
|
||||
"RecoilAmount" "1" // Amount of recoil
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ WeaponData
|
|||
"CycleDecrement" "1" // Number of bullets fired per cycle
|
||||
|
||||
"Damage" "102" // Damage per burst
|
||||
"DamageRadius" "125" // Radius of damage
|
||||
|
||||
"RecoilAmount" "1" // Amount of recoil
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ WeaponData
|
|||
"default_clip" "60"
|
||||
"default_clip2" "-1"
|
||||
|
||||
"primary_ammo" "AMMO_SHELLS"
|
||||
"primary_ammo" "AMMO_NAILS"
|
||||
"secondary_ammo" "None"
|
||||
|
||||
"ffencrypted" "1" // required for the script to load
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
PatchVersion=1.0.0.1
|
||||
PatchVersion=1.2.5.0
|
||||
ProductName=FortressForever
|
||||
appID=253530
|
||||
|
|
Loading…
Reference in a new issue