fortressforever-scripts/maps/ff_training.lua

1934 lines
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