fortressforever-scripts/maps/includes/base_push.lua

351 lines
11 KiB
Lua

-- base_push.lua
-----------------------------------------------------------------------------
-- includes
-----------------------------------------------------------------------------
IncludeScript("base_teamplay");
IncludeScript("base_location");
IncludeScript("base_respawnturret");
BALL_THROW_SPEED = 512;
BALL_RETURN_TIME = 120;
-----------------------------------------------------------------------------
-- Some Global Stuff!
-----------------------------------------------------------------------------
function startup()
SetGameDescription( "Push" )
-- set up team limits on each team
SetPlayerLimit(Team.kBlue, 0)
SetPlayerLimit(Team.kRed, 0)
SetPlayerLimit(Team.kYellow, -1)
SetPlayerLimit(Team.kGreen, -1)
-- push maps generally don't have civilians, so override in map LUA file if you want 'em
local team = GetTeam( Team.kBlue )
team:SetClassLimit( Player.kCivilian, -1 )
team:SetClassLimit( Player.kEngineer, -1 )
local team = GetTeam( Team.kRed )
team:SetClassLimit( Player.kCivilian, -1 )
team:SetClassLimit( Player.kEngineer, -1 )
end
-- Give everyone a full resupply, but strip grenades
function player_spawn( player_entity )
local player = CastToPlayer( player_entity )
player:AddHealth( 100 )
player:AddArmor( 300 )
player:AddAmmo( Ammo.kNails, 400 )
player:AddAmmo( Ammo.kShells, 400 )
player:AddAmmo( Ammo.kRockets, 400 )
player:AddAmmo( Ammo.kCells, 400 )
player:AddAmmo( Ammo.kDetpack, 1 )
player:AddAmmo( Ammo.kManCannon, 1 )
player:RemoveAmmo( Ammo.kGren1, 4 )
player:RemoveAmmo( Ammo.kGren2, 4 )
end
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- backpacks
-----------------------------------------------------------------------------
push_backpack = genericbackpack:new({
health = 25,
armor = 50,
touchsound = "ArmorKit.Touch",
respawntime = 10,
model = "models/items/backpack/backpack.mdl",
botgoaltype = Bot.kBackPack_Health
})
function push_backpack:dropatspawn() return false end
-----------------------------------------------------------------------------
-- base_ball
-----------------------------------------------------------------------------
base_ball = info_ff_script:new({
name = "base ball",
team = Team.kUnassigned,
model = "models/items/ball/ball.mdl",
modelskin = 0,
tosssound = "Flag.Toss",
dropnotouchtime = 2,
capnotouchtime = 2,
hudicon = "hud_ball",
hudx = 5,
hudy = 210,
hudwidth = 48,
hudheight = 48,
hudalign = 1,
hudstatusiconbluex = 60,
hudstatusiconbluey = 5,
hudstatusiconredx = 60,
hudstatusiconredy = 5,
hudstatusiconblue = "hud_ball.vtf",
hudstatusiconred = "hud_ball.vtf",
hudstatusiconw = 15,
hudstatusiconh = 15,
hudstatusiconbluealign = 2,
hudstatusiconredalign = 3,
touchflags = {AllowFlags.kOnlyPlayers, AllowFlags.kBlue, AllowFlags.kRed, AllowFlags.kYellow, AllowFlags.kGreen},
botgoaltype = Bot.kFlag
})
function base_ball:hasanimation() return true end
-- For when this object is carried, these offsets are used to place
-- the info_ff_script relative to the players feet
function base_ball:attachoffset()
-- x = forward/backward
-- y = left/right
-- z = up/down
local offset = Vector( 32, 0, 0 )
return offset
end
function base_ball:precache()
PrecacheSound(self.tosssound)
PrecacheSound("yourteam.flagstolen")
PrecacheSound("otherteam.flagstolen")
PrecacheSound("yourteam.drop")
PrecacheSound("otherteam.drop")
PrecacheSound("yourteam.flagreturn")
PrecacheSound("otherteam.flagreturn")
PrecacheSound("yourteam.flagcap")
PrecacheSound("otherteam.flagcap")
info_ff_script.precache(self)
end
function base_ball:spawn()
self.notouch = { }
info_ff_script.spawn(self)
end
function base_ball:addnotouch(player_id, duration)
self.notouch[player_id] = duration
AddSchedule(self.name .. "-" .. player_id, duration, self.removenotouch, self, player_id)
end
function base_ball.removenotouch(self, player_id)
self.notouch[player_id] = nil
end
function base_ball:touch( touch_entity )
if IsPlayer( touch_entity ) then
local player = CastToPlayer( touch_entity )
-- pickup if they can
if self.notouch[player:GetId()] then return; end
if player:GetTeamId() ~= self.team then
-- let the teams know that the ball was picked up
SmartSound(player, "yourteam.flagstolen", "yourteam.flagstolen", "otherteam.flagstolen")
SmartSpeak(player, "CTF_YOUHAVEBALL", "CTF_TEAMHASBALL", "CTF_ENEMYHASBALL")
SmartMessage(player, "#FF_YOUHAVEBALL", "#FF_TEAMHASBALL", "#FF_ENEMYHASBALL", Color.kGreen, Color.kGreen, Color.kRed)
-- if the player is a spy, then force him to lose his disguise
player:SetDisguisable( false )
-- if the player is a spy, then force him to lose his cloak
player:SetCloakable( false )
-- note: this seems a bit backwards (Pickup verb fits Player better)
local ball = CastToInfoScript(entity)
ball:Pickup(player)
AddHudIcon( player, self.hudicon, ball:GetName(), self.hudx, self.hudy, self.hudwidth, self.hudheight, self.hudalign )
RemoveHudItemFromAll( "ball-icon-dropped" )
local team = player:GetTeamId()
if (team == Team.kBlue) then
AddHudIconToAll( self.hudstatusiconblue, "ball-icon-blue", self.hudstatusiconbluex, self.hudstatusiconbluey, self.hudstatusiconw, self.hudstatusiconh, self.hudstatusiconbluealign )
elseif (team == Team.kRed) then
AddHudIconToAll( self.hudstatusiconred, "ball-icon-red", self.hudstatusiconredx, self.hudstatusiconredy, self.hudstatusiconw, self.hudstatusiconh, self.hudstatusiconredalign )
end
end
end
end
function base_ball:onownerdie( owner_entity )
-- drop the ball
local ball = CastToInfoScript(entity)
ball:Drop(BALL_RETURN_TIME, 0.0)
if IsPlayer( owner_entity ) then
local player = CastToPlayer( owner_entity )
RemoveHudItem( player, ball:GetName() )
local team = player:GetTeamId()
if (team == Team.kBlue) then
RemoveHudItemFromAll( "ball-icon-blue" )
elseif (team == Team.kRed) then
RemoveHudItemFromAll( "ball-icon-red" )
end
end
end
function base_ball:ownerfeign( owner_entity )
-- drop the ball
local ball = CastToInfoScript(entity)
ball:Drop(BALL_RETURN_TIME, 0.0)
if IsPlayer( owner_entity ) then
local player = CastToPlayer( owner_entity )
RemoveHudItem( player, ball:GetName() )
local team = player:GetTeamId()
if (team == Team.kBlue) then
RemoveHudItemFromAll( "ball-icon-blue" )
elseif (team == Team.kRed) then
RemoveHudItemFromAll( "ball-icon-red" )
end
end
end
function base_ball:dropitemcmd( owner_entity )
-- throw the ball
local ball = CastToInfoScript(entity)
ball:Drop(BALL_RETURN_TIME, BALL_THROW_SPEED)
if IsPlayer( owner_entity ) then
local player = CastToPlayer( owner_entity )
RemoveHudItem( player, ball:GetName() )
local team = player:GetTeamId()
if (team == Team.kBlue) then
RemoveHudItemFromAll( "ball-icon-blue" )
elseif (team == Team.kRed) then
RemoveHudItemFromAll( "ball-icon-red" )
end
end
end
function base_ball:ondrop( owner_entity )
if IsPlayer( owner_entity ) then
local player = CastToPlayer( owner_entity )
-- let the teams know that the flag was dropped
SmartSound(player, "yourteam.drop", "yourteam.drop", "otherteam.drop")
SmartMessage(player, "#FF_YOUBALLDROP", "#FF_TEAMBALLDROP", "#FF_ENEMYBALLDROP", Color.kYellow, Color.kYellow, Color.kYellow)
end
local ball = CastToInfoScript(entity)
ball:EmitSound(self.tosssound)
end
function base_ball:onloseitem( owner_entity )
if IsPlayer( owner_entity ) then
-- let the player that lost the ball put on a disguise
local player = CastToPlayer( owner_entity )
player:SetDisguisable(true)
player:SetCloakable( true )
self:addnotouch(player:GetId(), self.capnotouchtime)
end
end
function base_ball:onreturn( )
-- let the teams know that the ball was returned
BroadCastMessage("#FF_BALLRETURN", Color.kYellow)
BroadCastSound ( "yourteam.flagreturn" )
SpeakAll( "CTF_BALLRETURN" )
end
-- Define the ball
ball = base_ball:new({})
-----------------------------------------------------------------------------
-- Capture Points
-----------------------------------------------------------------------------
pushcap = trigger_ff_script:new({
health = 100,
armor = 300,
grenades = 200,
nails = 200,
shells = 200,
rockets = 200,
cells = 200,
detpacks = 1,
mancannons = 1,
gren1 = 0,
gren2 = 0,
item = "",
team = Team.kUnassigned,
botgoaltype = Bot.kFlagCap
})
function pushcap:allowed ( allowed_entity )
if IsPlayer( allowed_entity ) then
-- get the player and his team
local player = CastToPlayer( allowed_entity )
-- check if the player is on our team
if player:GetTeamId() ~= self.team then
return EVENT_DISALLOWED
end
if player:HasItem( self.item ) then
return EVENT_ALLOWED
end
end
return EVENT_DISALLOWED
end
function pushcap:ontrigger( trigger_entity )
if IsPlayer( trigger_entity ) then
local player = CastToPlayer( trigger_entity )
-- check if the player is carrying the ball
if player:HasItem( self.item ) then
-- reward player for goal
player:AddFortPoints(FORTPOINTS_PER_CAPTURE, "#FF_FORTPOINTS_GOAL")
-- reward player's team for capture
local team = player:GetTeam()
team:AddScore(POINTS_PER_CAPTURE)
local ball = GetInfoScriptByName( "ball" )
-- return the ball
ball:Return()
-- Remove any hud icons
RemoveHudItem( player, ball:GetName() )
local team = player:GetTeamId()
if (team == Team.kBlue) then
RemoveHudItemFromAll( "ball-icon-blue" )
elseif (team == Team.kRed) then
RemoveHudItemFromAll( "ball-icon-red" )
end
-- let the teams know that a capture occured
SmartSound(player, "yourteam.flagcap", "yourteam.flagcap", "otherteam.flagcap")
SmartSpeak(player, "CTF_YOUSCORE", "CTF_TEAMSCORE", "CTF_THEYSCORE")
SmartMessage(player, "#FF_YOUSCORE", "#FF_TEAMSCORE", "#FF_ENEMYSCORE", Color.kGreen, Color.kGreen, Color.kRed)
ApplyToAll({ AT.kRemovePacks, AT.kRemoveProjectiles, AT.kRespawnPlayers, AT.kRemoveBuildables, AT.kRemoveRagdolls, AT.kStopPrimedGrens, AT.kReloadClips })
end
end
end
-- declare the elements
red_cap = pushcap:new({ team = Team.kRed, item = "ball" })
blue_cap = pushcap:new({ team = Team.kBlue, item = "ball" })
-----------------------------------------------------------------------------
-- Hurts
-----------------------------------------------------------------------------
hurt = trigger_ff_script:new({ team = Team.kUnassigned })
function hurt:allowed( allowed_entity )
if IsPlayer( allowed_entity ) then
local player = CastToPlayer( allowed_entity )
if player:GetTeamId() == self.team then
return EVENT_ALLOWED
end
end
return EVENT_DISALLOWED
end
hurt_blue = hurt:new({ team = Team.kBlue })
hurt_red = hurt:new({ team = Team.kRed })