mirror of
https://github.com/fortressforever/fortressforever-scripts.git
synced 2024-11-25 05:50:58 +00:00
1934 lines
No EOL
65 KiB
Lua
1934 lines
No EOL
65 KiB
Lua
---------------------------------------------
|
|
-- FF_Training
|
|
---------------------------------------------
|
|
|
|
IncludeScript("base_ctf")
|
|
|
|
JUMP_TECHNIQUES = 1
|
|
MOVEMENT = 2
|
|
ALL_TOGETHER = 3
|
|
|
|
-- stage types
|
|
VERTICAL_JUMP = 1
|
|
HORIZONTAL_JUMP = 2
|
|
MISC_JUMP = 3
|
|
MOVEMENT_STAGE = 4
|
|
MOVEMENT_STAGE_START = 5
|
|
MOVEMENT_STAGE_OTHER = 6
|
|
ALL_TOGETHER_STAGE = 7
|
|
|
|
TIME_FOR_GOLD = 15
|
|
TIME_FOR_SILVER = 20
|
|
TIME_FOR_BRONZE = 25
|
|
|
|
stage_info = {
|
|
|
|
[JUMP_TECHNIQUES] = {
|
|
technique_name = "Jump Techniques",
|
|
stages = {
|
|
[1] = {
|
|
stage_type = VERTICAL_JUMP,
|
|
stage_name = "Drop Concussion Jump",
|
|
stage_specific = "Vertical",
|
|
stage_checklist = "Vertical Drop Conc Jump",
|
|
stage_code = "v_conc",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Prime concussion gren:",
|
|
stage_key = "%+gren2% or %toggletwo%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = true,
|
|
force_waterconc = true,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[2] = {
|
|
stage_type = HORIZONTAL_JUMP,
|
|
stage_name = "Drop Concussion Jump",
|
|
stage_specific = "Application",
|
|
stage_checklist = "Drop Conc Jump Application",
|
|
stage_code = "a_conc",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Prime concussion gren:",
|
|
stage_key = "%+gren2% or %toggletwo%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = true,
|
|
force_waterconc = false,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[3] = {
|
|
stage_type = MISC_JUMP,
|
|
stage_name = "Concussion Jump",
|
|
stage_specific = "Water",
|
|
stage_checklist = "Water Conc Jump",
|
|
stage_code = "m_waterconc",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Prime concussion gren:",
|
|
stage_key = "%+gren2% or %toggletwo%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = false,
|
|
force_waterconc = true,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[4] = {
|
|
stage_type = VERTICAL_JUMP,
|
|
stage_name = "Hand-Held Concussion Jump",
|
|
stage_specific = "Vertical",
|
|
stage_checklist = "Vertical HH Conc Jump",
|
|
stage_code = "v_hhconc",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Prime concussion gren:",
|
|
stage_key = "%+gren2% or %toggletwo%",
|
|
stage_limits = {
|
|
force_hhconc = true,
|
|
force_dropconc = false,
|
|
force_waterconc = false,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[5] = {
|
|
stage_type = HORIZONTAL_JUMP,
|
|
stage_name = "Hand-Held Concussion Jump",
|
|
stage_specific = "Application",
|
|
stage_checklist = "HH Conc Jump Application",
|
|
stage_code = "a_hhconc",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Prime concussion gren:",
|
|
stage_key = "%+gren2% or %toggletwo%",
|
|
stage_limits = {
|
|
force_hhconc = true,
|
|
force_dropconc = false,
|
|
force_waterconc = false,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[6] = {
|
|
stage_type = VERTICAL_JUMP,
|
|
stage_name = "Rocket Jump",
|
|
stage_specific = "Vertical",
|
|
stage_checklist = "Vertical Rocket Jump",
|
|
stage_code = "v_rj",
|
|
stage_complete = false,
|
|
stage_class = Player.kSoldier,
|
|
stage_key_text = "Shoot rocket:",
|
|
stage_key = "%+attack%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = false,
|
|
force_waterconc = false,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[7] = {
|
|
stage_type = HORIZONTAL_JUMP,
|
|
stage_name = "Rocket Jump",
|
|
stage_specific = "Application",
|
|
stage_checklist = "Rocket Jump Application",
|
|
stage_code = "a_rj",
|
|
stage_complete = false,
|
|
stage_class = Player.kSoldier,
|
|
stage_key_text = "Shoot rocket:",
|
|
stage_key = "%+attack%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = false,
|
|
force_waterconc = false,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[8] = {
|
|
stage_type = VERTICAL_JUMP,
|
|
stage_name = "Pipe Jump",
|
|
stage_specific = "Vertical",
|
|
stage_checklist = "Vertical Pipe Jump",
|
|
stage_code = "v_pipe",
|
|
stage_complete = false,
|
|
stage_class = Player.kDemoman,
|
|
stage_key_text = "Det pipes:",
|
|
stage_key = "%+attack2%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = false,
|
|
force_waterconc = false,
|
|
force_1pipe = false,
|
|
force_2pipe = true
|
|
}
|
|
},
|
|
[9] = {
|
|
stage_type = HORIZONTAL_JUMP,
|
|
stage_name = "Pipe Jump",
|
|
stage_specific = "Application",
|
|
stage_checklist = "Pipe Jump Application",
|
|
stage_code = "a_pipe",
|
|
stage_complete = false,
|
|
stage_class = Player.kDemoman,
|
|
stage_key_text = "Det pipes:",
|
|
stage_key = "%+attack2%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = false,
|
|
force_waterconc = false,
|
|
force_1pipe = true,
|
|
force_2pipe = false
|
|
}
|
|
},
|
|
[10] = {
|
|
stage_type = HORIZONTAL_JUMP,
|
|
stage_name = "Flamethrower",
|
|
stage_specific = "Application",
|
|
stage_checklist = "Flamethrower",
|
|
stage_code = "a_ft",
|
|
stage_complete = false,
|
|
stage_class = Player.kPyro,
|
|
stage_key_text = "Shoot flamethrower:",
|
|
stage_key = "%+attack%",
|
|
stage_limits = {
|
|
force_hhconc = false,
|
|
force_dropconc = false,
|
|
force_waterconc = false,
|
|
force_1pipe = false,
|
|
force_2pipe = false
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
[MOVEMENT] = {
|
|
technique_name = "Movement Techniques",
|
|
stages = {
|
|
[1] = {
|
|
stage_type = MOVEMENT_STAGE,
|
|
stage_name = "Double Jump",
|
|
stage_specific = "Basics",
|
|
stage_checklist = "Double Jump",
|
|
stage_code = "move_doublejump",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Jump:",
|
|
stage_key = "%+jump%"
|
|
},
|
|
[2] = {
|
|
stage_type = MOVEMENT_STAGE_START,
|
|
stage_name = "Air Control",
|
|
stage_specific = "Basics",
|
|
stage_checklist = "Air Control Basics",
|
|
stage_code = "move_aircontrol",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Strafe: %+moveleft% and %+moveright%",
|
|
stage_key = "Reset stage: %+use%"
|
|
},
|
|
[3] = {
|
|
stage_type = MOVEMENT_STAGE,
|
|
stage_name = "Air Control",
|
|
stage_specific = "Jump",
|
|
stage_checklist = "Air Control Jump",
|
|
stage_code = "move_aircontrolpush",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key = ""
|
|
},
|
|
[4] = {
|
|
stage_type = MOVEMENT_STAGE_START,
|
|
stage_name = "Air Control",
|
|
stage_specific = "Gaining Speed",
|
|
stage_checklist = "Gaining Speed with Strafe",
|
|
stage_code = "move_aircontrolspeed",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key = ""
|
|
},
|
|
[5] = {
|
|
stage_type = MOVEMENT_STAGE_START,
|
|
stage_name = "Air Control",
|
|
stage_specific = "Bunnyhop Primer",
|
|
stage_checklist = "Bunnyhop Air Control",
|
|
stage_code = "move_aircontrolbhop",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key = ""
|
|
},
|
|
[6] = {
|
|
stage_type = MOVEMENT_STAGE_MULTIPLE,
|
|
stage_name = "Bunnyhop",
|
|
stage_specific = "Stepping Stones",
|
|
stage_checklist = "Bunnyhop",
|
|
stage_num_steps = 3,
|
|
stage_code = "move_bhop",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key = ""
|
|
},
|
|
[7] = {
|
|
stage_type = MOVEMENT_STAGE_START,
|
|
stage_name = "Rampslide",
|
|
stage_specific = "",
|
|
stage_checklist = "Rampslide",
|
|
stage_code = "move_rampslide",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key = ""
|
|
},
|
|
[8] = {
|
|
stage_type = MOVEMENT_STAGE_START,
|
|
stage_name = "Trimp",
|
|
stage_specific = "",
|
|
stage_checklist = "Trimp",
|
|
stage_code = "move_trimp",
|
|
stage_complete = false,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Jump:",
|
|
stage_key = "%+jump%"
|
|
}
|
|
}
|
|
},
|
|
|
|
[ALL_TOGETHER] = {
|
|
technique_name = "Putting it All Together",
|
|
stages = {
|
|
[1] = {
|
|
stage_type = ALL_TOGETHER_STAGE,
|
|
stage_name = "Scout",
|
|
stage_specific = "Speed Run",
|
|
stage_checklist = "Scout Speed Run",
|
|
stage_code = "all_scout",
|
|
stage_complete = false,
|
|
stage_medal = 0,
|
|
stage_class = Player.kScout,
|
|
stage_key_text = "Reset:",
|
|
stage_key = "%+use%"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
VERTICAL_JUMP_TOUCHED = 0
|
|
VERTICAL_JUMP_BROADCASTED = 0
|
|
VERTICAL_JUMP_MESSAGE = "What?"
|
|
|
|
NUM_JUMP_QUEUES_NEEDED = 10
|
|
|
|
GIVE_GREN2 = false
|
|
GIVE_PIPES = false
|
|
GIVE_RPG = false
|
|
|
|
TIMEOUT_REPLAY_TIME = 45
|
|
|
|
current_technique = JUMP_TECHNIQUES
|
|
current_stage = 1
|
|
failed_attempts = 0
|
|
best_run = nil
|
|
show_timer = false
|
|
|
|
|
|
-- startup
|
|
function startup()
|
|
SetGameDescription( "Training" )
|
|
|
|
SetTeamName( Team.kBlue, "Trainee" )
|
|
|
|
SetPlayerLimit( Team.kBlue, 1 )
|
|
SetPlayerLimit( Team.kRed, -1 )
|
|
SetPlayerLimit( Team.kYellow, -1 )
|
|
SetPlayerLimit( Team.kGreen, -1 )
|
|
|
|
team = GetTeam( Team.kBlue )
|
|
team:SetClassLimit( Player.kCivilian, 0 )
|
|
|
|
setup()
|
|
|
|
end
|
|
|
|
function setup()
|
|
|
|
for i,v in ipairs(stage_info) do
|
|
for i2,v2 in ipairs(v.stages) do
|
|
_G[v2.stage_code.."_tele"] = base_tele:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_replay_btn"] = base_replay_btn:new({ technique_id = i, stage_number = i2 })
|
|
if v2.stage_type == VERTICAL_JUMP then
|
|
_G[v2.stage_code] = v_jump:new({ technique_id = i, stage_number = i2 })
|
|
elseif v2.stage_type == HORIZONTAL_JUMP then
|
|
_G[v2.stage_code] = a_jump:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_finish"] = a_finish:new({ technique_id = i, stage_number = i2 })
|
|
elseif v2.stage_type == MISC_JUMP then
|
|
_G[v2.stage_code.."_start"] = m_jump_start:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code] = m_jump:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_finish"] = a_finish:new({ technique_id = i, stage_number = i2 })
|
|
elseif v2.stage_type == MOVEMENT_STAGE then
|
|
_G[v2.stage_code] = move_room:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_init"] = move_init:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_finish"] = a_finish:new({ technique_id = i, stage_number = i2 })
|
|
elseif v2.stage_type == MOVEMENT_STAGE_START then
|
|
_G[v2.stage_code] = move_area:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_start"] = move_start:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_init"] = move_init:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_finish"] = a_finish:new({ technique_id = i, stage_number = i2 })
|
|
elseif v2.stage_type == MOVEMENT_STAGE_MULTIPLE then
|
|
for i3=1,v2.stage_num_steps do
|
|
_G[v2.stage_code..""..i3.."_replay_btn"] = base_replay_btn:new({ technique_id = i, stage_number = i2, step = i3 })
|
|
_G[v2.stage_code..""..i3.."_tele"] = base_tele:new({ technique_id = i, stage_number = i2, step = i3 })
|
|
_G[v2.stage_code..""..i3] = move_bhop_area:new({ technique_id = i, stage_number = i2, step = i3 })
|
|
_G[v2.stage_code..""..i3.."_start"] = move_bhop_start:new({ technique_id = i, stage_number = i2, step = i3 })
|
|
_G[v2.stage_code..""..i3.."_init"] = move_bhop_init:new({ technique_id = i, stage_number = i2, step = i3 })
|
|
_G[v2.stage_code..""..i3.."_finish"] = move_bhop_finish:new({ technique_id = i, stage_number = i2, step = i3 })
|
|
end
|
|
elseif v2.stage_type == ALL_TOGETHER_STAGE then
|
|
_G[v2.stage_code] = all_together_room:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_init"] = all_together_init:new({ technique_id = i, stage_number = i2 })
|
|
_G[v2.stage_code.."_start"] = all_together_start:new({ technique_id = i, stage_number = i2 })
|
|
else
|
|
--ChatToAll( "[SCRIPT] ERROR: no stage type defined for "..v2.stage_checklist )
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-- precache sounds
|
|
function precache()
|
|
for i,v in ipairs(stage_info) do
|
|
for i2,v2 in ipairs(v.stages) do
|
|
PrecacheSound("training."..v2.stage_code.."_start")
|
|
PrecacheSound("training."..v2.stage_code.."01")
|
|
PrecacheSound("training."..v2.stage_code.."02")
|
|
PrecacheSound("training."..v2.stage_code.."03")
|
|
PrecacheSound("training."..v2.stage_code.."04")
|
|
PrecacheSound("training."..v2.stage_code.."_timeout")
|
|
if v2.stage_num_steps ~= nil then
|
|
for i3=1,v2.stage_num_steps do
|
|
PrecacheSound("training."..v2.stage_code..i3.."_start")
|
|
end
|
|
end
|
|
if v2.stage_medal ~= nil then
|
|
PrecacheSound("training."..v2.stage_code.."_bronze")
|
|
PrecacheSound("training."..v2.stage_code.."_silver")
|
|
PrecacheSound("training."..v2.stage_code.."_gold")
|
|
end
|
|
end
|
|
end
|
|
|
|
PrecacheSound("training.stage_complete")
|
|
PrecacheSound("training.all_complete")
|
|
PrecacheSound("training.intro")
|
|
|
|
PrecacheSound("misc.bizwarn")
|
|
PrecacheSound("misc.bloop")
|
|
PrecacheSound("misc.buzwarn")
|
|
PrecacheSound("misc.dadeda")
|
|
PrecacheSound("misc.deeoo")
|
|
PrecacheSound("misc.doop")
|
|
PrecacheSound("misc.woop")
|
|
PrecacheSound("otherteam.flagstolen")
|
|
end
|
|
|
|
function set_ammo( player_entity, ammo_type, amount )
|
|
if IsPlayer( player_entity ) then
|
|
local player = CastToPlayer( player_entity )
|
|
player:RemoveAmmo( ammo_type, 300 )
|
|
player:AddAmmo( ammo_type, amount )
|
|
end
|
|
end
|
|
|
|
function reset_stock( player )
|
|
player:AddHealth( 100 )
|
|
player:AddArmor( 300 )
|
|
|
|
player:RemoveAmmo( Ammo.kNails, 400 )
|
|
player:RemoveAmmo( Ammo.kShells, 400 )
|
|
player:RemoveAmmo( Ammo.kRockets, 400 )
|
|
player:RemoveAmmo( Ammo.kCells, 400 )
|
|
|
|
player:RemoveAmmo( Ammo.kGren1, 4 )
|
|
player:RemoveAmmo( Ammo.kGren2, 4 )
|
|
end
|
|
|
|
function removeprimed( player_entity )
|
|
if IsPlayer( player_entity ) then
|
|
local player = CastToPlayer( player_entity )
|
|
|
|
ApplyToPlayer( player, {AT.kStopPrimedGrens} )
|
|
|
|
BroadCastMessage( "You must drop the grenade!" )
|
|
GIVE_GREN2 = true
|
|
end
|
|
end
|
|
|
|
function add_timeout()
|
|
--ChatToAll( "[script] adding timeout schedule (time: "..TIMEOUT_REPLAY_TIME..")" )
|
|
AddSchedule( "timeout", TIMEOUT_REPLAY_TIME, play_timeout )
|
|
end
|
|
|
|
function reset_timeout()
|
|
--ChatToAll( "[script] resetting timeout schedule (time: "..TIMEOUT_REPLAY_TIME..")" )
|
|
RemoveSchedule( "timeout" )
|
|
AddSchedule( "timeout", TIMEOUT_REPLAY_TIME, play_timeout )
|
|
end
|
|
|
|
function remove_timeout()
|
|
--ChatToAll( "[script] removing timeout schedule" )
|
|
RemoveSchedule( "timeout" )
|
|
end
|
|
|
|
function play_timeout()
|
|
--ChatToAll( "[script] playing timeout sound" )
|
|
BroadCastSound( "training."..stage_info[current_technique].stages[current_stage].stage_code.."_timeout" )
|
|
reset_timeout()
|
|
end
|
|
|
|
function increment_failed( player, inc )
|
|
failed_attempts = failed_attempts + inc
|
|
--ChatToAll( "[script] failed attempts: "..failed_attempts )
|
|
|
|
if failed_attempts >= 3 then
|
|
--ChatToAll( "[script] broadcasting failed sound" )
|
|
BroadCastSound( "training."..stage_info[current_technique].stages[current_stage].stage_code.."02" )
|
|
reset_failed()
|
|
end
|
|
end
|
|
|
|
function reset_failed()
|
|
failed_attempts = 0
|
|
--ChatToAll( "[script] reset failed attempts: "..failed_attempts )
|
|
end
|
|
|
|
function complete_stage( player )
|
|
--ChatToAll( "[script] technique #"..current_technique.." stage #"..current_stage.." complete" )
|
|
stage_info[current_technique].stages[current_stage].stage_complete = true
|
|
|
|
show_complete( player, stage_info[current_technique].stages[current_stage].stage_checklist )
|
|
|
|
if current_stage + 1 <= # stage_info[current_technique].stages then
|
|
current_stage = current_stage + 1
|
|
else
|
|
current_technique = current_technique + 1
|
|
current_stage = 1
|
|
end
|
|
|
|
flaginfo( player )
|
|
|
|
reset_failed()
|
|
|
|
hide_current( player )
|
|
AddSchedule( "hide_complete", 4, hide_complete, player )
|
|
AddSchedule( "show_current", 4, show_current, player )
|
|
|
|
hide_key( player )
|
|
hide_progressbar( player )
|
|
end
|
|
|
|
function award_medal( player, medal )
|
|
local medal_name = ""
|
|
local sound_delay = 0
|
|
if medal == 1 then medal_name = "Gold"; sound_delay = 6
|
|
elseif medal == 2 then medal_name = "Silver"; sound_delay = 5
|
|
elseif medal == 3 then medal_name = "Bronze"; sound_delay = 4 end
|
|
BroadCastSound( "training."..stage_info[current_technique].stages[current_stage].stage_code.."_"..string.lower(medal_name) )
|
|
|
|
hide_medal( player )
|
|
show_medal_won( player, medal )
|
|
AddSchedule( "hide_medal_won", 4, hide_medal_won, player )
|
|
AddSchedule( "show_medal", 4, show_medal, player, medal )
|
|
AddSchedule( "play_all_complete", sound_delay, play_all_complete, player )
|
|
|
|
stage_info[current_technique].stages[current_stage].stage_complete = true
|
|
stage_info[current_technique].stages[current_stage].stage_medal = medal
|
|
end
|
|
|
|
function show_medal( player, medal )
|
|
hide_medal(player)
|
|
if medal == 1 then
|
|
AddHudIcon( player, "ff_training_medal_gold.vtf", "Medal", 16, 64, 64, 64, 0 )
|
|
elseif medal == 2 then
|
|
AddHudIcon( player, "ff_training_medal_silver.vtf", "Medal", 16, 64, 64, 64, 0 )
|
|
elseif medal == 3 then
|
|
AddHudIcon( player, "ff_training_medal_bronze.vtf", "Medal", 16, 64, 64, 64, 0 )
|
|
end
|
|
end
|
|
|
|
function hide_medal( player )
|
|
RemoveHudItem( player, "Medal" )
|
|
end
|
|
|
|
function show_medal_won( player, medal )
|
|
local medal_name = ""
|
|
if medal == 1 then medal_name = "Gold"
|
|
elseif medal == 2 then medal_name = "Silver"
|
|
elseif medal == 3 then medal_name = "Bronze" end
|
|
hide_medal_won(player)
|
|
AddHudIcon( player, "hud_statusbar_256.vtf", "Medal_won_BG", -128, 180, 256, 16, 3 )
|
|
AddHudIcon( player, "ff_training_medal_"..string.lower(medal_name)..".vtf", "Medal_won", -112, 170, 32, 32, 3 )
|
|
AddHudText( player, "Medal_won_text", "You won the "..medal_name.." medal!", 0, 184, 4 )
|
|
end
|
|
|
|
function hide_medal_won( player )
|
|
RemoveHudItem( player, "Medal_won" )
|
|
RemoveHudItem( player, "Medal_won_text" )
|
|
RemoveHudItem( player, "Medal_won_BG" )
|
|
end
|
|
|
|
function play_all_complete( player )
|
|
BroadCastSound( "training.all_complete" )
|
|
end
|
|
|
|
function show_complete( player, technique )
|
|
RemoveHudItem( player, "Completed_BG" )
|
|
RemoveHudItem( player, "Completed_check" )
|
|
RemoveHudItem( player, "Completed_text" )
|
|
AddHudIcon( player, "hud_statusbar_256.vtf", "Completed_BG", -128, 180, 256, 16, 3 )
|
|
AddHudIcon( player, "hud_checkmark.vtf", "Completed_check", -112, 170, 32, 32, 3 )
|
|
AddHudText( player, "Completed_text", technique, 0, 184, 4 )
|
|
end
|
|
|
|
function hide_complete( player )
|
|
RemoveHudItem( player, "Completed_BG" )
|
|
RemoveHudItem( player, "Completed_check" )
|
|
RemoveHudItem( player, "Completed_text" )
|
|
end
|
|
|
|
function show_current( player )
|
|
RemoveHudItem( player, "Current_BG" )
|
|
RemoveHudItem( player, "Current_BG2" )
|
|
RemoveHudItem( player, "Current_arrow" )
|
|
RemoveHudItem( player, "Current_arrow_l" )
|
|
RemoveHudItem( player, "Current_text" )
|
|
RemoveHudItem( player, "Current_text2" )
|
|
AddHudIcon( player, "hud_statusbar_256.vtf", "Current_BG", -64, 40, 128, 16, 3 )
|
|
AddHudIcon( player, "hud_statusbar_256.vtf", "Current_BG2", -64, 58, 128, 16, 3 )
|
|
AddHudIcon( player, "hud_current_arrow.vtf", "Current_arrow", -90, 32, 32, 32, 3 )
|
|
AddHudIcon( player, "hud_current_arrow_l.vtf", "Current_arrow_l", 58, 32, 32, 32, 3 )
|
|
if current_technique == ALL_TOGETHER then
|
|
if show_timer then
|
|
AddHudTimer( player, "Current_text", "speedrun_timer", 0, 42, 4 )
|
|
else
|
|
AddHudText( player, "Current_text", "Timer not started", 0, 44, 4 )
|
|
end
|
|
if best_run ~= nil then
|
|
AddHudTextToAll( "Current_text2", string.format("Best Time: %.3f seconds", best_run), 0, 62, 4 )
|
|
else
|
|
AddHudTextToAll( "Current_text2", "No best time yet", 0, 62, 4 )
|
|
end
|
|
else
|
|
AddHudText( player, "Current_text", stage_info[current_technique].stages[current_stage].stage_name, 0, 44, 4 )
|
|
AddHudText( player, "Current_text2", stage_info[current_technique].stages[current_stage].stage_specific, 0, 62, 4 )
|
|
end
|
|
|
|
end
|
|
|
|
function hide_current( player )
|
|
RemoveHudItem( player, "Current_BG" )
|
|
RemoveHudItem( player, "Current_BG2" )
|
|
RemoveHudItem( player, "Current_arrow" )
|
|
RemoveHudItem( player, "Current_arrow_l" )
|
|
RemoveHudItem( player, "Current_text" )
|
|
RemoveHudItem( player, "Current_text2" )
|
|
end
|
|
|
|
function show_key( player )
|
|
if stage_info[current_technique].stages[current_stage].stage_key ~= "" then
|
|
RemoveHudItem( player, "Key_BG" )
|
|
RemoveHudItem( player, "Key_text" )
|
|
RemoveHudItem( player, "Key_text2" )
|
|
AddHudIcon( player, "hud_statusbar_256_128.vtf", "Key_BG", -64, 80, 128, 32, 3 )
|
|
AddHudText( player, "Key_text", stage_info[current_technique].stages[current_stage].stage_key_text, 0, 88, 4 )
|
|
AddHudText( player, "Key_text2", stage_info[current_technique].stages[current_stage].stage_key, 0, 96, 4 )
|
|
end
|
|
|
|
end
|
|
|
|
function hide_key( player )
|
|
RemoveHudItem( player, "Key_BG" )
|
|
RemoveHudItem( player, "Key_text" )
|
|
RemoveHudItem( player, "Key_text2" )
|
|
end
|
|
|
|
function show_progressbar( player )
|
|
if stage_info[current_technique].stages[current_stage].stage_code == "move_aircontrolspeed" then
|
|
hide_progressbar( player )
|
|
local bar_width = 1
|
|
AddHudIcon( player, "hud_statusbar_256.vtf", "Progress_BG", -64, 80, 128, 16, 3 )
|
|
AddHudIcon( player, "hud_statusbar_blue.vtf", "Progress_bar", -62, 80, bar_width, 16, 3 )
|
|
end
|
|
end
|
|
|
|
function update_progressbar( player, percent )
|
|
RemoveHudItem( player, "Progress_bar" )
|
|
RemoveHudItem( player, "Progress_text" )
|
|
local max_width = 124
|
|
local bar_width = percent * max_width
|
|
AddHudIcon( player, "hud_statusbar_blue_active.vtf", "Progress_bar", -62, 80, bar_width, 16, 3 )
|
|
AddHudText( player, "Progress_text", tostring(math.floor(percent * 100 + 0.5)).."% of target speed", 0, 84, 4 )
|
|
end
|
|
|
|
function hide_progressbar( player )
|
|
RemoveHudItem( player, "Progress_BG" )
|
|
RemoveHudItem( player, "Progress_bar" )
|
|
RemoveHudItem( player, "Progress_text" )
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Teleports
|
|
-------------------------------------
|
|
base_tele = trigger_ff_script:new({ technique_id = 0, stage_number = 0, step = 0 })
|
|
|
|
function base_tele:ontouch( touch_entity )
|
|
if IsPlayer(touch_entity) then
|
|
local player = CastToPlayer( touch_entity )
|
|
player:SetVelocity(Vector(0,0,0))
|
|
|
|
OutputEvent("steppingstone_*", "Enable")
|
|
|
|
increment_failed(player, 1)
|
|
reset_timeout()
|
|
end
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Teleports
|
|
-------------------------------------
|
|
base_replay_btn = trigger_ff_script:new({ technique_id = 0, stage_number = 0, step = 0 })
|
|
|
|
function base_replay_btn:ontrigger( touch_entity )
|
|
if IsPlayer(touch_entity) then
|
|
local player = CastToPlayer( touch_entity )
|
|
if player:IsInUse() then
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."_timeout" )
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Vertical Jump Rooms
|
|
-------------------------------------
|
|
v_jump = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function v_jump:ontouch( touch_entity )
|
|
if VERTICAL_JUMP_TOUCHED == 10 then
|
|
BroadCastSound( "training.stage_complete" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_door", "Open" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_door_trigger", "Enable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_light", "TurnOn" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_sprite", "ShowSprite" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_model", "Skin", "6" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_next", "Enable" )
|
|
|
|
remove_timeout()
|
|
end
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
--ChatToAll( "[script] technique: "..self.technique_id.." stage num: "..self.stage_number )
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if (VERTICAL_JUMP_TOUCHED > 0) then
|
|
------------------
|
|
----ChatToAll( "[training] "..VERTICAL_JUMP_TOUCHED.." marker touched")
|
|
------------------
|
|
-- first touch
|
|
else
|
|
if self.stage_number > 1 then
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_finish_door", "Close" )
|
|
else
|
|
OutputEvent( "start_door", "Close" )
|
|
end
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."01" )
|
|
add_timeout()
|
|
end
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
GIVE_GREN2 = true
|
|
end
|
|
if p:GetClass() ~= stage_info[self.technique_id].stages[self.stage_number].stage_class then
|
|
|
|
show_key( p )
|
|
|
|
------------------
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
ApplyToPlayer( p, {AT.kChangeClassScout} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
--ChatToAll( "[training] give the concs!" )
|
|
set_ammo( p, Ammo.kGren2, 1 )
|
|
--DisplayMessage( p, "Use {gren2} or {toggletwo} to throw a concussion grenade" )
|
|
elseif stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kSoldier then
|
|
ApplyToPlayer( p, {AT.kChangeClassSoldier} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
p:GiveWeapon( "ff_weapon_rpg", true )
|
|
p:SetAmmoInClip(1)
|
|
GIVE_GREN2 = false
|
|
elseif stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kDemoman then
|
|
ApplyToPlayer( p, {AT.kChangeClassDemoman} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
p:GiveWeapon( "ff_weapon_pipelauncher", true )
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_code == "v_pipe" then
|
|
p:SetAmmoInClip(2)
|
|
else
|
|
p:SetAmmoInClip(1)
|
|
end
|
|
GIVE_GREN2 = false
|
|
GIVE_PIPES = false
|
|
end
|
|
------------------
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
VERTICAL_JUMP_TOUCHED = 0
|
|
VERTICAL_JUMP_BROADCASTED = 0
|
|
|
|
end
|
|
|
|
function v_jump:ontrigger( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if p:IsOnGround() and GIVE_GREN2 then
|
|
------------------
|
|
set_ammo( p, Ammo.kGren2, 1 )
|
|
GIVE_GREN2 = false
|
|
------------------
|
|
end
|
|
if p:IsOnGround() and p:GetClass() == Player.kSoldier then
|
|
------------------
|
|
p:GiveWeapon( "ff_weapon_rpg", true )
|
|
set_ammo( p, Ammo.kRockets, 0 )
|
|
ApplyToPlayer( p, {AT.kReloadClips} )
|
|
p:SetAmmoInClip(1)
|
|
------------------
|
|
end
|
|
if p:IsOnGround() and p:GetClass() == Player.kDemoman and GIVE_PIPES then
|
|
------------------
|
|
p:GiveWeapon( "ff_weapon_pipelauncher", true )
|
|
set_ammo( p, Ammo.kRockets, 0 )
|
|
ApplyToPlayer( p, {AT.kReloadClips} )
|
|
p:SetAmmoInClip(2)
|
|
GIVE_PIPES = false
|
|
------------------
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function v_jump:onexplode( explode_entity )
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
function v_jump:onendtouch()
|
|
|
|
end
|
|
|
|
|
|
-------------------------------------
|
|
-- Jump Application Rooms
|
|
-------------------------------------
|
|
a_jump = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function a_jump:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if self.stage_number > 1 then
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_finish_door", "Close" )
|
|
end
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."01" )
|
|
reset_timeout()
|
|
|
|
show_current( p )
|
|
|
|
if p:GetClass() ~= stage_info[self.technique_id].stages[self.stage_number].stage_class then
|
|
|
|
show_key( p )
|
|
|
|
------------------
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
ApplyToPlayer( p, {AT.kChangeClassScout} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
set_ammo( p, Ammo.kGren2, 1 )
|
|
elseif stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kSoldier then
|
|
ApplyToPlayer( p, {AT.kChangeClassSoldier} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
p:GiveWeapon( "ff_weapon_rpg", true )
|
|
GIVE_GREN2 = false
|
|
elseif stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kDemoman then
|
|
ApplyToPlayer( p, {AT.kChangeClassDemoman} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
p:GiveWeapon( "ff_weapon_pipelauncher", true )
|
|
GIVE_GREN2 = false
|
|
elseif stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kPyro then
|
|
ApplyToPlayer( p, {AT.kChangeClassPyro} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
p:GiveWeapon( "ff_weapon_flamethrower", true )
|
|
set_ammo( p, Ammo.kCells, 200 )
|
|
GIVE_GREN2 = false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function a_jump:ontrigger( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if p:IsOnGround() and GIVE_GREN2 then
|
|
------------------
|
|
set_ammo( p, Ammo.kGren2, 1 )
|
|
GIVE_GREN2 = false
|
|
------------------
|
|
end
|
|
if p:IsOnGround() and p:GetClass() == Player.kSoldier then
|
|
------------------
|
|
p:GiveWeapon( "ff_weapon_rpg", true )
|
|
set_ammo( p, Ammo.kRockets, 0 )
|
|
ApplyToPlayer( p, {AT.kReloadClips} )
|
|
p:SetAmmoInClip(1)
|
|
------------------
|
|
end
|
|
if p:IsOnGround() and p:GetClass() == Player.kDemoman and GIVE_PIPES then
|
|
------------------
|
|
p:GiveWeapon( "ff_weapon_pipelauncher", true )
|
|
set_ammo( p, Ammo.kRockets, 0 )
|
|
ApplyToPlayer( p, {AT.kReloadClips} )
|
|
p:SetAmmoInClip(1)
|
|
GIVE_PIPES = false
|
|
------------------
|
|
end
|
|
if p:IsOnGround() and p:GetClass() == Player.kPyro then
|
|
------------------
|
|
set_ammo( p, Ammo.kCells, 200 )
|
|
------------------
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function a_jump:onexplode( explode_entity )
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
function a_jump:onendtouch()
|
|
|
|
end
|
|
|
|
|
|
-------------------------------------
|
|
-- Misc Jump Start
|
|
-------------------------------------
|
|
m_jump_start = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function m_jump_start:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if self.stage_number > 1 then
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_finish_door", "Close" )
|
|
end
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."_start" )
|
|
|
|
reset_timeout()
|
|
|
|
show_current( p )
|
|
|
|
if p:GetClass() ~= stage_info[self.technique_id].stages[self.stage_number].stage_class then
|
|
|
|
show_key( p )
|
|
|
|
------------------
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
ApplyToPlayer( p, {AT.kChangeClassScout} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
GIVE_GREN2 = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function m_jump_start:onexplode( explode_entity )
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
function m_jump_start:onendtouch()
|
|
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Misc Jump Rooms
|
|
-------------------------------------
|
|
m_jump = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function m_jump:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."01" )
|
|
reset_timeout()
|
|
end
|
|
end
|
|
end
|
|
|
|
function m_jump:ontrigger( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if (p:IsOnGround() or p:IsUnderWater()) and p:GetClass() == Player.kScout and GIVE_GREN2 then
|
|
------------------
|
|
set_ammo( p, Ammo.kGren2, 1 )
|
|
GIVE_GREN2 = false
|
|
------------------
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function m_jump:onexplode( explode_entity )
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
function m_jump:onendtouch()
|
|
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Movement Room
|
|
-------------------------------------
|
|
move_room = trigger_ff_script:new({ technique_id = 0, stage_number = 0, played_sound = false })
|
|
|
|
function move_room:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if not self.played_sound then
|
|
|
|
self.played_sound = true
|
|
|
|
if self.stage_number > 1 then
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_finish_door", "Close" )
|
|
elseif self.technique_id > 1 then
|
|
local num_stages_previous_technique = # stage_info[self.technique_id - 1].stages
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_finish_door", "Close" )
|
|
end
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."01" )
|
|
|
|
reset_timeout()
|
|
|
|
show_current( p )
|
|
end
|
|
|
|
if p:GetClass() ~= stage_info[self.technique_id].stages[self.stage_number].stage_class then
|
|
|
|
show_key( p )
|
|
|
|
------------------
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
ApplyToPlayer( p, {AT.kChangeClassScout} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-------------------------------------
|
|
-- Movement Start
|
|
-------------------------------------
|
|
move_start = trigger_ff_script:new({ technique_id = 0, stage_number = 0, played_sound = false })
|
|
|
|
function move_start:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if not self.played_sound then
|
|
|
|
self.played_sound = true
|
|
|
|
if self.stage_number > 1 then
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_finish_door", "Close" )
|
|
elseif self.technique_id > 1 then
|
|
local num_stages_previous_technique = # stage_info[self.technique_id - 1].stages
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_finish_door", "Close" )
|
|
end
|
|
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."_start" )
|
|
|
|
reset_timeout()
|
|
|
|
show_current( p )
|
|
end
|
|
|
|
if p:GetClass() ~= stage_info[self.technique_id].stages[self.stage_number].stage_class then
|
|
|
|
show_key( p )
|
|
show_progressbar( p )
|
|
|
|
------------------
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
ApplyToPlayer( p, {AT.kChangeClassScout} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-------------------------------------
|
|
-- Movement Area
|
|
-------------------------------------
|
|
move_area = trigger_ff_script:new({ technique_id = 0, stage_number = 0, disabled = false })
|
|
|
|
function move_area:ontrigger( touch_entity )
|
|
if self.disabled then return end
|
|
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
local l_stage_code = stage_info[self.technique_id].stages[self.stage_number].stage_code
|
|
|
|
if l_stage_code == "move_aircontrol" or l_stage_code == "move_aircontrolbhop" then
|
|
if p:IsInUse() then
|
|
local neworigin = GetEntityByName( l_stage_code.."_tele_dest" ):GetOrigin()
|
|
neworigin = Vector(neworigin.x,neworigin.y,neworigin.z+36)
|
|
local newangles = GetEntityByName( l_stage_code.."_tele_dest" ):GetAngles()
|
|
local newvelocity = Vector(0,0,0)
|
|
p:Teleport( neworigin, newangles, newvelocity )
|
|
p:SetGravity( 1 )
|
|
p:SpeedMod( 1 )
|
|
increment_failed(p, 1)
|
|
self:adddisable()
|
|
reset_timeout()
|
|
elseif p:IsInForward() then
|
|
BroadCastMessage( "Do not press forward while air controlling" )
|
|
else
|
|
local speed = p:GetSpeed()
|
|
if speed < 50 then
|
|
BroadCastMessage( "You seem to be stuck. Press your USE button to retry" )
|
|
end
|
|
end
|
|
end
|
|
|
|
if l_stage_code == "move_rampslide" then
|
|
|
|
local speed = p:GetSpeed()
|
|
|
|
if speed < 800 then
|
|
local neworigin = GetEntityByName( l_stage_code.."_tele_dest" ):GetOrigin()
|
|
neworigin = Vector(neworigin.x,neworigin.y,neworigin.z+36)
|
|
local newangles = GetEntityByName( l_stage_code.."_tele_dest" ):GetAngles()
|
|
local newvelocity = Vector(0,0,0)
|
|
p:Teleport( neworigin, newangles, newvelocity )
|
|
p:SetGravity( 1 )
|
|
p:SpeedMod( 1 )
|
|
increment_failed(p, 1)
|
|
self:adddisable()
|
|
reset_timeout()
|
|
end
|
|
end
|
|
|
|
if l_stage_code == "move_trimp" then
|
|
|
|
local speed = p:GetSpeed()
|
|
|
|
if speed <= 500 then
|
|
local neworigin = GetEntityByName( l_stage_code.."_tele_dest" ):GetOrigin()
|
|
neworigin = Vector(neworigin.x,neworigin.y,neworigin.z+36)
|
|
local newangles = GetEntityByName( l_stage_code.."_tele_dest" ):GetAngles()
|
|
local newvelocity = Vector(0,0,0)
|
|
p:Teleport( neworigin, newangles, newvelocity )
|
|
p:SetGravity( 1 )
|
|
p:SpeedMod( 1 )
|
|
increment_failed(p, 1)
|
|
self:adddisable()
|
|
reset_timeout()
|
|
end
|
|
end
|
|
|
|
if l_stage_code == "move_aircontrolspeed" then
|
|
--if p:IsInUse() then
|
|
-- local origin = GetEntityByName( l_stage_code.."_tele_dest" ):GetOrigin()
|
|
-- p:SetOrigin( Vector( origin.x, origin.y, origin.z + 64 ) )
|
|
-- p:SetVelocity( Vector( 0,0,0 ) )
|
|
-- p:SetGravity( 1 )
|
|
-- p:SpeedMod( 1 )
|
|
if p:IsInForward() then
|
|
BroadCastMessage( "Do not press forward while air controlling" )
|
|
else
|
|
local speed = p:GetSpeed()
|
|
update_progressbar( p, speed / 700 )
|
|
if speed > 700 then
|
|
update_progressbar( p, 1.0 )
|
|
BroadCastSound( "misc.doop" )
|
|
remove_timeout()
|
|
OutputEvent("move_aircontrolspeed_showfinishblock", "Enable")
|
|
OutputEvent("move_aircontrolspeed", "Disable")
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function move_area:adddisable()
|
|
self.disabled = true
|
|
AddSchedule(stage_info[self.technique_id].stages[self.stage_number].stage_code .. "-removedisable", 1, self.removedisable, self)
|
|
end
|
|
|
|
function move_area.removedisable(self)
|
|
self.disabled = false
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Movement Room
|
|
-------------------------------------
|
|
move_init = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function move_init:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
|
|
local l_stage_code = stage_info[self.technique_id].stages[self.stage_number].stage_code
|
|
|
|
if l_stage_code == "move_aircontrol" then
|
|
p:SetVelocity( Vector( 500, 0, 600 ) )
|
|
p:SetGravity( 0.000000001 )
|
|
elseif l_stage_code == "move_aircontrolpush" then
|
|
p:SetVelocity( Vector( -800, 0, 600 ) )
|
|
elseif l_stage_code == "move_aircontrolspeed" then
|
|
p:SetVelocity( Vector( 0, -300, 600 ) )
|
|
p:SetGravity( 0.000000001 )
|
|
elseif l_stage_code == "move_aircontrolbhop" then
|
|
p:SetVelocity( Vector( 0, -400, 600 ) )
|
|
p:SetGravity( 0.000000001 )
|
|
elseif l_stage_code == "move_rampslide" then
|
|
p:SetVelocity( Vector( 2000, 0, 0 ) )
|
|
elseif l_stage_code == "move_trimp" then
|
|
p:SetVelocity( Vector( 1500, 0, 0 ) )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Application finish
|
|
-------------------------------------
|
|
a_finish = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function a_finish:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
|
|
BroadCastSound( "misc.doop" )
|
|
BroadCastSound( "training.stage_complete" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_door", "Open" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_door_trigger", "Enable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_light", "TurnOn" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_sprite", "ShowSprite" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_model", "Skin", "6" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_next", "Enable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_block", "Enable" )
|
|
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_tesla", "DoSpark" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_beam", "TurnOff" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_arrow", "Disable" )
|
|
complete_stage( p )
|
|
p:RemoveAllWeapons()
|
|
p:SetGravity( 1.0 )
|
|
p:SpeedMod( 1.0 )
|
|
|
|
remove_timeout()
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Aircontrolspeed
|
|
-------------------------------------
|
|
|
|
move_aircontrolspeed_hidestartarrows = trigger_ff_script:new({ })
|
|
|
|
function move_aircontrolspeed_hidestartarrows:ontouch( touch_entity )
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
|
|
OutputEvent("move_aircontrolspeed_starthideblock", "Disable")
|
|
OutputEvent("move_aircontrolspeed_arrow_starthide", "TurnOff")
|
|
OutputEvent("move_aircontrolspeed_arrow_startshow", "TurnOn")
|
|
OutputEvent("move_aircontrolspeed_startblock", "Enable")
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
move_aircontrolspeed_showfinishblock = trigger_ff_script:new({ touched=false })
|
|
|
|
function move_aircontrolspeed_showfinishblock:ontouch( touch_entity )
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
|
|
if not self.touched then
|
|
OutputEvent("move_aircontrolspeed_finishshowblock", "Enable")
|
|
OutputEvent("move_aircontrolspeed_arrow_finishhide", "TurnOff")
|
|
OutputEvent("move_aircontrolspeed_arrow_finishshow", "TurnOn")
|
|
OutputEvent("move_aircontrolspeed_finishblock", "Disable")
|
|
self.touched = true
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-------------------------------------
|
|
-- Bhop
|
|
-------------------------------------
|
|
|
|
move_bhop_init = trigger_ff_script:new({ technique_id = 0, stage_number = 0, step = 0 })
|
|
|
|
move_bhop_area = trigger_ff_script:new({ technique_id = 0, stage_number = 0, step = 0 })
|
|
|
|
move_bhop_start = trigger_ff_script:new({ technique_id = 0, stage_number = 0, step = 0, played_sound = false })
|
|
|
|
function move_bhop_start:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if not self.played_sound then
|
|
|
|
self.played_sound = true
|
|
|
|
if self.stage_number > 1 then
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_finish_door", "Close" )
|
|
elseif self.technique_id > 1 then
|
|
local num_stages_previous_technique = # stage_info[self.technique_id - 1].stages
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_finish_door", "Close" )
|
|
end
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code..self.step.."_start" )
|
|
|
|
OutputEvent("steppingstone_*", "Enable")
|
|
|
|
reset_timeout()
|
|
|
|
show_current( p )
|
|
end
|
|
|
|
if p:GetClass() ~= stage_info[self.technique_id].stages[self.stage_number].stage_class then
|
|
------------------
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
ApplyToPlayer( p, {AT.kChangeClassScout} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
end
|
|
end
|
|
|
|
if self.step == 1 then
|
|
p:SpeedMod( .5 )
|
|
elseif self.step == 2 then
|
|
p:SpeedMod( .75 )
|
|
else
|
|
p:SpeedMod( 1.0 )
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
move_bhop_finish = trigger_ff_script:new({ technique_id = 0, stage_number = 0, step = 0 })
|
|
|
|
function move_bhop_finish:ontouch( touch_entity )
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
|
|
BroadCastSound( "misc.doop" )
|
|
|
|
p:RemoveAllWeapons()
|
|
p:SetGravity( 1.0 )
|
|
p:SpeedMod( 1.0 )
|
|
|
|
reset_timeout()
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code..self.step.."_block", "Enable" )
|
|
|
|
if self.step == stage_info[self.technique_id].stages[self.stage_number].stage_num_steps then
|
|
BroadCastSound( "training.stage_complete" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_door", "Open" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_door_trigger", "Enable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_light", "TurnOn" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_sprite", "ShowSprite" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_finish_model", "Skin", "6" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_next", "Enable" )
|
|
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_tesla", "DoSpark" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_beam", "TurnOff" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_arrow", "Disable" )
|
|
complete_stage( p )
|
|
|
|
remove_timeout()
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------
|
|
-- freeze
|
|
-------------------------------------
|
|
|
|
function player_freeze( p, bF )
|
|
p:Freeze( bF )
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Multipurpose remove
|
|
-------------------------------------
|
|
|
|
remove_all = trigger_ff_script:new({})
|
|
|
|
function remove_all:allowed( allowed_entity )
|
|
if not stage_info[current_technique].stages[current_stage].stage_complete and current_technique == JUMP_TECHNIQUES then
|
|
if stage_info[current_technique].stages[current_stage].stage_limits.force_hhconc then
|
|
----ChatToAll( "[training] trigger_remove force_hhconc" )
|
|
if IsGrenade( allowed_entity ) then
|
|
GIVE_GREN2 = true
|
|
return EVENT_ALLOWED
|
|
end
|
|
end
|
|
if stage_info[current_technique].stages[current_stage].stage_limits.force_waterconc then
|
|
----ChatToAll( "[training] trigger_remove force_waterconc" )
|
|
if IsGrenade( allowed_entity ) then
|
|
GIVE_GREN2 = true
|
|
BroadCastMessage( "Throw the conc in the water!" )
|
|
--ApplyToPlayer( player, {AT.kStopPrimedGrens} )
|
|
return EVENT_ALLOWED
|
|
end
|
|
end
|
|
end
|
|
return EVENT_DISALLOWED
|
|
end
|
|
|
|
--- TEMPORARY
|
|
v_hhconc_remove = remove_all:new({})
|
|
a_hhconc_remove = remove_all:new({})
|
|
m_waterconc_remove = remove_all:new({})
|
|
a_pipe_remove = remove_all:new({})
|
|
v_pipe_remove = remove_all:new({})
|
|
|
|
-------------------------------------
|
|
-- Multipurpose catch
|
|
-------------------------------------
|
|
|
|
catch_all = trigger_ff_script:new({})
|
|
|
|
function catch_all:ontouch( touch_entity )
|
|
if IsPlayer(touch_entity) then return end
|
|
end
|
|
|
|
function catch_all:ontrigger( touch_entity )
|
|
return
|
|
end
|
|
|
|
function catch_all:onexplode( explode_entity )
|
|
if explode_entity:GetClassName() == "ff_projectile_pl" then
|
|
GIVE_PIPES = true
|
|
elseif explode_entity:GetClassName() == "ff_grenade_concussion" then
|
|
GIVE_GREN2 = true
|
|
end
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
-------------------------------------
|
|
-- speedrun
|
|
-------------------------------------
|
|
all_together_start = trigger_ff_script:new({ technique_id = 0, stage_number = 0, sound_played = false })
|
|
|
|
function all_together_start:ontouch( touch_entity )
|
|
if show_timer then return end
|
|
if not stage_info[self.technique_id].stages[self.stage_number].stage_complete then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if not self.sound_played then
|
|
|
|
self.sound_played = true
|
|
|
|
if self.stage_number > 1 then
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number - 1].stage_code.."_finish_door", "Close" )
|
|
elseif self.technique_id > 1 then
|
|
local num_stages_previous_technique = # stage_info[self.technique_id - 1].stages
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_next", "Disable" )
|
|
OutputEvent( stage_info[self.technique_id - 1].stages[num_stages_previous_technique].stage_code.."_finish_door", "Close" )
|
|
end
|
|
BroadCastSound( "training."..stage_info[self.technique_id].stages[self.stage_number].stage_code.."_start" )
|
|
|
|
reset_timeout()
|
|
|
|
show_current( p )
|
|
end
|
|
|
|
if p:GetClass() ~= stage_info[self.technique_id].stages[self.stage_number].stage_class then
|
|
|
|
show_key( p )
|
|
|
|
------------------
|
|
if stage_info[self.technique_id].stages[self.stage_number].stage_class == Player.kScout then
|
|
ApplyToPlayer( p, {AT.kChangeClassScout} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
all_together_init = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function all_together_init:ontouch( touch_entity )
|
|
if IsPlayer( touch_entity ) then
|
|
local player = CastToPlayer( touch_entity )
|
|
RemoveTimer( "speedrun_timer" )
|
|
AddTimer( "speedrun_timer", 0, 1 )
|
|
show_timer = true
|
|
OutputEvent( stage_info[self.technique_id].stages[self.stage_number].stage_code.."_init", "Disable" )
|
|
|
|
player:GiveWeapon( "ff_weapon_crowbar", true )
|
|
player:AddAmmo( Ammo.kGren1, 4 )
|
|
player:AddAmmo( Ammo.kGren2, 4 )
|
|
|
|
show_current( player )
|
|
|
|
UpdateObjectiveIcon( player, GetEntityByName( "red_flag" ) )
|
|
end
|
|
end
|
|
|
|
all_together_room = trigger_ff_script:new({ technique_id = 0, stage_number = 0 })
|
|
|
|
function all_together_room:ontouch( touch_entity )
|
|
if IsPlayer( touch_entity ) then
|
|
local player = CastToPlayer( touch_entity )
|
|
end
|
|
end
|
|
|
|
function all_together_room:ontrigger( touch_entity )
|
|
if IsPlayer( touch_entity ) then
|
|
local player = CastToPlayer( touch_entity )
|
|
if show_timer and player:IsInUse() then
|
|
RemoveTimer( "speedrun_timer" )
|
|
OutputEvent( "all_scout_init", "Enable" )
|
|
|
|
show_timer = false
|
|
|
|
player:RemoveAllWeapons()
|
|
player:RemoveAmmo( Ammo.kGren1, 4 )
|
|
player:RemoveAmmo( Ammo.kGren2, 4 )
|
|
|
|
show_current( player )
|
|
|
|
local stage_code = stage_info[current_technique].stages[current_stage].stage_code
|
|
TeleportToEntity( player, stage_code.."_tele_dest" )
|
|
player:SetGravity( 1 )
|
|
player:SpeedMod( 1 )
|
|
ApplyToPlayer( player, { AT.kStopPrimedGrens } )
|
|
ApplyToAll({AT.kRemoveProjectiles})
|
|
local flag = CastToInfoScript(GetEntityByName("red_flag"))
|
|
RemoveHudItem( player, flag:GetName() )
|
|
flag:Return()
|
|
UpdateObjectiveIcon( player, nil )
|
|
end
|
|
end
|
|
end
|
|
|
|
function OutputTime( timername )
|
|
local timerval = GetTimerTime( timername )
|
|
--ChatToAll("["..timername.."] "..timerval.."s")
|
|
BroadCastMessage( string.format("Time: %.3f seconds", timerval), 10, Color.kBlue )
|
|
return timerval
|
|
end
|
|
|
|
function blue_cap:oncapture(player, item)
|
|
|
|
local timerval = OutputTime( "speedrun_timer" )
|
|
|
|
RemoveTimer( "speedrun_timer" )
|
|
OutputEvent( "all_scout_init", "Enable" )
|
|
|
|
show_timer = false
|
|
|
|
player:RemoveAllWeapons()
|
|
player:RemoveAmmo( Ammo.kGren1, 4 )
|
|
player:RemoveAmmo( Ammo.kGren2, 4 )
|
|
|
|
if timerval > 0 then
|
|
if best_run == nil then
|
|
best_run = timerval
|
|
else
|
|
if timerval < best_run then
|
|
best_run = timerval
|
|
end
|
|
end
|
|
end
|
|
|
|
local medal_won = nil
|
|
if timerval <= TIME_FOR_GOLD then
|
|
medal_won = 1
|
|
elseif timerval <= TIME_FOR_SILVER then
|
|
medal_won = 2
|
|
elseif timerval <= TIME_FOR_BRONZE then
|
|
medal_won = 3
|
|
else
|
|
-- only play the capture sound if no medal was won
|
|
SmartSpeak(player, "CTF_YOUCAP", "CTF_TEAMCAP", "CTF_THEYCAP")
|
|
end
|
|
|
|
if medal_won ~= nil then
|
|
if stage_info[current_technique].stages[current_stage].stage_medal == 0 or stage_info[current_technique].stages[current_stage].stage_medal > medal_won then
|
|
award_medal( player, medal_won )
|
|
end
|
|
end
|
|
|
|
show_current( player )
|
|
|
|
local stage_code = stage_info[current_technique].stages[current_stage].stage_code
|
|
TeleportToEntity( player, stage_code.."_tele_dest" )
|
|
player:SetGravity( 1 )
|
|
player:SpeedMod( 1 )
|
|
ApplyToPlayer( player, { AT.kStopPrimedGrens } )
|
|
|
|
-- let the teams know that a capture occured
|
|
SmartSound(player, "yourteam.flagcap", "yourteam.flagcap", "otherteam.flagcap")
|
|
end
|
|
|
|
function TeleportToEntity( player, entity_name )
|
|
if GetEntityByName( entity_name ) ~= nil then
|
|
local neworigin = GetEntityByName( entity_name ):GetOrigin()
|
|
neworigin = Vector(neworigin.x,neworigin.y,neworigin.z+36+16)
|
|
local newangles = GetEntityByName( entity_name ):GetAngles()
|
|
local newvelocity = Vector(0,0,0)
|
|
player:Teleport( neworigin, newangles, newvelocity )
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Change class triggers
|
|
-------------------------------------
|
|
ChangeClass = trigger_ff_script:new({ class=Player.kScout, changeclass=AT.kChangeClassScout })
|
|
|
|
function ChangeClass:ontouch( touch_entity )
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
------------------
|
|
ApplyToPlayer( p, {self.changeclass} )
|
|
p:RemoveAllWeapons()
|
|
reset_stock( p )
|
|
------------------
|
|
end
|
|
end
|
|
end
|
|
|
|
ChangeClass_Scout = ChangeClass:new({ class=Player.kScout, changeclass=AT.kChangeClassScout })
|
|
ChangeClass_Medic = ChangeClass:new({ class=Player.kMedic, changeclass=AT.kChangeClassMedic })
|
|
ChangeClass_Civilian = ChangeClass:new({ class=Player.kCivilian, changeclass=AT.kChangeClassCivilian })
|
|
|
|
-------------------------------------
|
|
-- OnPrime
|
|
-------------------------------------
|
|
|
|
function player_spawn( player )
|
|
if IsPlayer( player ) then
|
|
BroadCastSound( "training.intro" )
|
|
end
|
|
end
|
|
|
|
function player_onprimegren1( player_id )
|
|
----ChatToAll( "[training] gren1 primed" )
|
|
local player = GetPlayer(player_id)
|
|
if stage_info[current_technique].stages[current_stage].stage_code == "v_frag" then
|
|
AddSchedule("gren2prime3", .85, message, "3")
|
|
AddSchedule("gren2prime2", 1.85, message, "2")
|
|
AddSchedule("gren2prime1", 2.85, message, "1")
|
|
AddSchedule("gren2prime", 3.85, message, "Jump!")
|
|
end
|
|
end
|
|
|
|
function player_onprimegren2( player_id )
|
|
----ChatToAll( "[training] gren2 primed" )
|
|
local player = GetPlayer(player_id)
|
|
|
|
if stage_info[current_technique].stages[current_stage].stage_type == VERTICAL_JUMP or stage_info[current_technique].stages[current_stage].stage_type == MISC_JUMP then
|
|
increment_failed(player, 1)
|
|
reset_timeout()
|
|
end
|
|
|
|
if stage_info[current_technique].stages[current_stage].stage_code == "v_conc" then
|
|
AddSchedule("gren2prime3", .5, message, "3")
|
|
AddSchedule("gren2prime2", 1.5, message, "2")
|
|
AddSchedule("gren2prime1", 2.5, message, "1")
|
|
AddSchedule("gren2prime", 3.5, message, "Jump!")
|
|
AddSchedule("gren2primeremove", 3.6, removeprimed, player)
|
|
elseif stage_info[current_technique].stages[current_stage].stage_code == "a_conc" then
|
|
AddSchedule("gren2prime3", .5, message, "3")
|
|
AddSchedule("gren2prime2", 1.5, message, "2")
|
|
AddSchedule("gren2prime1", 2.5, message, "1")
|
|
AddSchedule("gren2prime", 3.5, message, "Jump!")
|
|
AddSchedule("gren2primeremove", 3.6, removeprimed, player)
|
|
elseif stage_info[current_technique].stages[current_stage].stage_code == "v_hhconc" then
|
|
AddSchedule("gren2prime3", .85, message, "3")
|
|
AddSchedule("gren2prime2", 1.85, message, "2")
|
|
AddSchedule("gren2prime1", 2.85, message, "1")
|
|
AddSchedule("gren2prime", 3.85, message, "Jump!")
|
|
elseif stage_info[current_technique].stages[current_stage].stage_code == "a_hhconc" then
|
|
AddSchedule("gren2prime3", .5, message, "3")
|
|
AddSchedule("gren2prime2", 1.5, message, "2")
|
|
AddSchedule("gren2prime1", 2.5, message, "1")
|
|
AddSchedule("gren2prime", 3.5, message, "Jump!")
|
|
end
|
|
end
|
|
|
|
function player_onthrowgren1( player, primed )
|
|
----ChatToAll( "[training] gren1 thrown" )
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
function player_onthrowgren2( player, primed )
|
|
----ChatToAll( "[training] gren2 thrown" )
|
|
if stage_info[current_technique].stages[current_stage].stage_code == "v_hhconc" or stage_info[current_technique].stages[current_stage].stage_code == "a_hhconc" then
|
|
BroadCastMessage( "Do not throw the conc when Hand-Held Conc Jumping!" )
|
|
GIVE_GREN2 = true
|
|
RemoveSchedule("gren2prime3")
|
|
RemoveSchedule("gren2prime2")
|
|
RemoveSchedule("gren2prime1")
|
|
RemoveSchedule("gren2prime")
|
|
--ApplyToPlayer( player, {AT.kStopPrimedGrens} )
|
|
return EVENT_DISALLOWED
|
|
end
|
|
|
|
if stage_info[current_technique].stages[current_stage].stage_code == "v_conc" or stage_info[current_technique].stages[current_stage].stage_code == "a_conc" then
|
|
RemoveSchedule("gren2primeremove")
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
return EVENT_ALLOWED
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- On damage
|
|
-----------------------------------------------------------------------------
|
|
function player_ondamage( player, damageinfo )
|
|
----ChatToAll( "[training] player ondamage" )
|
|
if not damageinfo then
|
|
return
|
|
end
|
|
|
|
damageinfo:SetDamage(0)
|
|
|
|
local weapon = damageinfo:GetInflictor():GetClassName()
|
|
|
|
if weapon == "ff_projectile_rocket" then
|
|
player:RemoveAllWeapons()
|
|
if stage_info[current_technique].stages[current_stage].stage_type == VERTICAL_JUMP then
|
|
increment_failed(player, 1)
|
|
reset_timeout()
|
|
end
|
|
end
|
|
|
|
if weapon == "ff_projectile_pl" then
|
|
player:RemoveAllWeapons()
|
|
if stage_info[current_technique].stages[current_stage].stage_type == VERTICAL_JUMP then
|
|
increment_failed(player, .5)
|
|
reset_timeout()
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Vertical Jump Markers
|
|
-------------------------------------
|
|
VerticalJumpMarker = trigger_ff_script:new({ message = "Touched", number = 0 })
|
|
|
|
function VerticalJumpMarker:ontouch( touch_entity )
|
|
if VERTICAL_JUMP_BROADCASTED == 0 then
|
|
if IsPlayer( touch_entity ) then
|
|
local p = CastToPlayer( touch_entity )
|
|
if not p:IsBot() then
|
|
if self.number > VERTICAL_JUMP_TOUCHED then
|
|
-------------
|
|
----ChatToAll( "[training] Upped to: " .. self.number )
|
|
--------------
|
|
VERTICAL_JUMP_TOUCHED = self.number
|
|
VERTICAL_JUMP_MESSAGE = self.message
|
|
if self.number == 10 then
|
|
BroadCastSound ( "misc.doop" )
|
|
OutputEvent( stage_info[current_technique].stages[current_stage].stage_code.."_tesla", "DoSpark" )
|
|
OutputEvent( stage_info[current_technique].stages[current_stage].stage_code.."_beam", "TurnOff" )
|
|
OutputEvent( stage_info[current_technique].stages[current_stage].stage_code.."_arrow", "Disable" )
|
|
complete_stage( p )
|
|
end
|
|
else
|
|
BroadCastMessage( VERTICAL_JUMP_MESSAGE )
|
|
VERTICAL_JUMP_BROADCASTED = 1
|
|
reset_timeout()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function VerticalJumpMarker:onendtouch()
|
|
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Declare Veritical Jump Markers
|
|
-------------------------------------
|
|
Jump1 = VerticalJumpMarker:new({ message="Not Quite", number=1 })
|
|
Jump2 = VerticalJumpMarker:new({ message="Nice Try", number=2 })
|
|
Jump3 = VerticalJumpMarker:new({ message="Keep it up", number=3 })
|
|
Jump4 = VerticalJumpMarker:new({ message="Good Effort", number=4 })
|
|
Jump5 = VerticalJumpMarker:new({ message="You're Getting It", number=5 })
|
|
Jump6 = VerticalJumpMarker:new({ message="Good, but still a ways to go", number=6 })
|
|
Jump7 = VerticalJumpMarker:new({ message="Great, but not quite", number=7 })
|
|
Jump8 = VerticalJumpMarker:new({ message="Almost There", number=8 })
|
|
Jump9 = VerticalJumpMarker:new({ message="So Close...", number=9 })
|
|
Jump10 = VerticalJumpMarker:new({ message="Complete!", number=10 })
|
|
|
|
|
|
function flaginfo( player_entity )
|
|
local player = CastToPlayer( player_entity )
|
|
|
|
current_y = 0
|
|
|
|
for i,v in ipairs(stage_info) do
|
|
|
|
heading_complete = true
|
|
for i2,v2 in ipairs(v.stages) do
|
|
if not v2.stage_complete then
|
|
heading_complete = false
|
|
break
|
|
end
|
|
end
|
|
|
|
RemoveHudItem( player, "Checklist_Header"..i )
|
|
RemoveHudItem( player, "Checklist_Header_text"..i )
|
|
RemoveHudItem( player, "Checklist_Header"..i.."_check" )
|
|
|
|
AddHudIcon( player, "hud_statusbar_256.vtf", "Checklist_Header"..i, 10, current_y + 10, 136, 16, 1 )
|
|
if heading_complete then
|
|
AddHudText( player, "Checklist_Header_text"..i, v.technique_name, 127, current_y + 14, 5 )
|
|
AddHudIcon( player, "hud_checkmark.vtf", "Checklist_Header"..i.."_check", 124, current_y + 6, 20, 20, 1 )
|
|
else
|
|
AddHudText( player, "Checklist_Header_text"..i, v.technique_name, 140, current_y + 14, 5 )
|
|
end
|
|
|
|
RemoveHudItem( player, "Checklist_BG"..i )
|
|
|
|
if i == current_technique then
|
|
if # v.stages > 2 then
|
|
AddHudIcon( player, "hud_statusbar_256_128.vtf", "Checklist_BG"..i, 10, current_y + 28, 136, 10 + # v.stages * 10, 1 )
|
|
else
|
|
AddHudIcon( player, "hud_statusbar_256.vtf", "Checklist_BG"..i, 10, current_y + 28, 136, 10 + # v.stages * 10, 1 )
|
|
end
|
|
end
|
|
for i2,v2 in ipairs(v.stages) do
|
|
RemoveHudItem( player, "Checklist_Item"..i.."-"..i2 )
|
|
RemoveHudItem( player, "Checklist_Item"..i.."-"..i2.."_check" )
|
|
|
|
if i == current_technique then
|
|
if v2.stage_complete then
|
|
AddHudIcon( player, "hud_checkmark.vtf", "Checklist_Item"..i.."-"..i2.."_check", 132, current_y + 22 + i2 * 10, 10, 10, 1 )
|
|
elseif i2 == current_stage and i == current_technique then
|
|
AddHudIcon( player, "hud_current_arrow.vtf", "Checklist_Item"..i.."-"..i2.."_check", 132, current_y + 23 + i2 * 10, 10, 10, 1 )
|
|
end
|
|
AddHudText( player, "Checklist_Item"..i.."-"..i2, v2.stage_checklist, 130, current_y + 24 + i2 * 10, 5 )
|
|
end
|
|
end
|
|
|
|
if i == current_technique then
|
|
current_y = current_y + 32 + # v.stages * 10
|
|
else
|
|
current_y = current_y + 20
|
|
end
|
|
|
|
end
|
|
|
|
show_current( player )
|
|
end
|
|
|
|
|
|
function message( text )
|
|
BroadCastMessage( text )
|
|
end
|
|
|
|
function disable( entity )
|
|
ConsoleToAll( entity.." you are nuts" )
|
|
OutputEvent( entity, "Disable" )
|
|
end |