Fortress Forever

Fortress Forever (https://forums.fortress-forever.com/index.php)
-   Mapping (https://forums.fortress-forever.com/forumdisplay.php?f=13)
-   -   Slay on Flag touch (https://forums.fortress-forever.com/showthread.php?t=22496)

Hammock 02-01-2011 03:05 PM

Slay on Flag touch
 
I'm looking for a lua that would make it so, until a certain number of players on the server is reached if the red team touched the blue flag they will be slain.

Once the server has like 10 people playing, the blue flag becomes available to touch again.

If the player count drops below 10 anyone who touches the blue flag will again be slain.

These are just arbitrary numbers but I imagine it would be simple enough to just modify the given number in the script.

I would also like to send a message to the player's screen that was just slain by touching the flag. And a message to all players when the specified player count is reached, or fallen below

Also since i'm not too familiar with lua's I was wondering if it's possible to set this up for all maps without edititing each individual lua file (like some sort of master lua file?), if not, it wouldn't be too tough to write a program that would inject it into every lua, so i'm not really too worried about this part.

Elmo 02-01-2011 04:07 PM

or to disallow item pickup and just display the message. Don't like killing people for no reason. Alternatively prompt those that are offensive classes to change also. Nice idea

Bridget 02-01-2011 04:35 PM

Code:

-- Assuming this overrides the base_flag functions.
-- Also assuming the blue flag is named 'blue flag'.
-- Also assuming info_ff_script has an allowed() return function.

function GetNumAllPlayers() return GetTeam(Team.kRed):GetNumPlayers() + GetTeam(Team.kBlue):GetNumPlayers() end

function baseflag:allowed() if GetNumAllPlayers() >= 10 then return true else return false end

function player_ondisconnect()
        -- Game still counts the player during this function's execution, I think?
        if (GetNumAllPlayers() - 1) < 10 then
                GetInfoScriptByName('blue flag'):Return()
                BroadCastMessage('The Blue Flag has returned due to player limit being under ten.')
        end
end

dunno

Hammock 02-01-2011 04:56 PM

Ya elmo dissallowing flag touch with a message to the user would be fine too.

I'll have to test the script out later as I am at work atm, thanks bridget

Hammock 02-01-2011 06:34 PM

Quote:

Originally Posted by Bridget (Post 482250)
Code:

-- Assuming this overrides the base_flag functions.
-- Also assuming the blue flag is named 'blue flag'.
-- Also assuming info_ff_script has an allowed() return function.

function GetNumAllPlayers() return GetTeam(Team.kRed):GetNumPlayers() + GetTeam(Team.kBlue):GetNumPlayers() end

function baseflag:allowed() if GetNumAllPlayers() >= 10 then return true else return false end

function player_ondisconnect()
        -- Game still counts the player during this function's execution, I think?
        if (GetNumAllPlayers() - 1) < 10 then
                GetInfoScriptByName('blue flag'):Return()
                BroadCastMessage('The Blue Flag has returned due to player limit being under ten.')
        end
end

dunno

Did a quick test on this at lunch, and it messed up team/class selection, all 4 teams became available, and no classes were available

Bridget 02-02-2011 01:01 PM

Change

Code:

function baseflag:allowed() if GetNumAllPlayers() >= 10 then return true else return false end
To:

Code:

function baseflag:allowed() if GetNumAllPlayers() >= 10 then return true else return false end end
Also, check the console for any LUA errors. Report them here.

Hammock 02-02-2011 06:31 PM

Okay, no more errors, map starts fine, can select team and classes.

But I'm still capable of being able to touch the blue flag, so it's not quite accomplishing what's intended.

As the only person in the server I should not be able to touch the blue flag until the player count reaches 10.

Bridget 02-02-2011 06:47 PM

The flag probably has no allowed() function. You probably have to override baseflag's touch function. Try this:

Code:

function baseflag:touch( touch_entity )
        if self.name == 'Blue Flag' and GetNumAllPlayers() < 10 then return false end
       
        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 flag was picked up
                SmartSound(player, "yourteam.flagstolen", "yourteam.flagstolen", "otherteam.flagstolen")
                RandomFlagTouchSpeak( player )
                SmartMessage(player, "#FF_YOUPICKUP", "#FF_TEAMPICKUP", "#FF_OTHERTEAMPICKUP", 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 flag = CastToInfoScript(entity)
                flag:Pickup(player)
                AddHudIcon( player, self.hudicon, flag:GetName(), self.hudx, self.hudy, self.hudwidth, self.hudheight, self.hudalign )

                -- log action in stats
                LogLuaEvent(player:GetId(), 0, "flag_touch", "flag_name", flag:GetName(), "player_origin", (string.format("%0.2f",player:GetOrigin().x) .. ", " .. string.format("%0.2f",player:GetOrigin().y) .. ", " .. string.format("%0.1f",player:GetOrigin().z) ), "player_health", "" .. player:GetHealth());       

                local team = nil
                -- get team as a lowercase string
                if player:GetTeamId() == Team.kBlue then team = "blue" end
                if player:GetTeamId() == Team.kRed then team = "red" end
                if player:GetTeamId() == Team.kGreen then team = "green" end 
                if player:GetTeamId() == Team.kYellow then team = "yellow" end
               
                -- objective icon pointing to the cap
                UpdateObjectiveIcon( player, GetEntityByName( team.."_cap" ) )

                -- 100 points for initial touch on flag
                if self.status == 0 then player:AddFortPoints(FORTPOINTS_PER_INITIALTOUCH, "#FF_FORTPOINTS_INITIALTOUCH") end
                self.status = 1
                self.carriedby = player:GetName()
                self:refreshStatusIcons(flag:GetName())

        end
end


Hammock 02-03-2011 03:29 AM

Thanks, that worked

zE 02-04-2011 07:22 PM

So im kinda interested on this to my server, but what to edit base_ctf lua ? and can someone post full workinfg lua plz : D

Hammock 02-04-2011 07:30 PM

This is what I ended up using, and I put it into my base_ctf.lua

The number 10 near the top is what you change to suit your needs for your server, say if you want a full game to be enabled at 18 players you'd change it to 18

Code:

function GetNumAllPlayers() return GetTeam(Team.kRed):GetNumPlayers() + GetTeam(Team.kBlue):GetNumPlayers() end

function baseflag:touch( touch_entity )
        if self.name == 'Blue Flag' and GetNumAllPlayers() < 10 then return false end
       
        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 flag was picked up
                SmartSound(player, "yourteam.flagstolen", "yourteam.flagstolen", "otherteam.flagstolen")
                RandomFlagTouchSpeak( player )
                SmartMessage(player, "#FF_YOUPICKUP", "#FF_TEAMPICKUP", "#FF_OTHERTEAMPICKUP", 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 flag = CastToInfoScript(entity)
                flag:Pickup(player)
                AddHudIcon( player, self.hudicon, flag:GetName(), self.hudx, self.hudy, self.hudwidth, self.hudheight, self.hudalign )

                -- log action in stats
                LogLuaEvent(player:GetId(), 0, "flag_touch", "flag_name", flag:GetName(), "player_origin", (string.format("%0.2f",player:GetOrigin().x) .. ", " .. string.format("%0.2f",player:GetOrigin().y) .. ", " .. string.format("%0.1f",player:GetOrigin().z) ), "player_health", "" .. player:GetHealth());       

                local team = nil
                -- get team as a lowercase string
                if player:GetTeamId() == Team.kBlue then team = "blue" end
                if player:GetTeamId() == Team.kRed then team = "red" end
                if player:GetTeamId() == Team.kGreen then team = "green" end 
                if player:GetTeamId() == Team.kYellow then team = "yellow" end
               
                -- objective icon pointing to the cap
                UpdateObjectiveIcon( player, GetEntityByName( team.."_cap" ) )

                -- 100 points for initial touch on flag
                if self.status == 0 then player:AddFortPoints(FORTPOINTS_PER_INITIALTOUCH, "#FF_FORTPOINTS_INITIALTOUCH") end
                self.status = 1
                self.carriedby = player:GetName()
                self:refreshStatusIcons(flag:GetName())

        end
end


zE 02-05-2011 05:19 PM

yo bri is it possible with this lua limit certain classes, when theres <= 10 players and display message when theres 11 players to warn that blue flag is avaible D: that would be leet


All times are GMT. The time now is 03:22 AM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.