<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://bf2tech.uturista.pt/index.php?action=history&amp;feed=atom&amp;title=Scripts%3AAircraft_Only</id>
	<title>Scripts:Aircraft Only - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://bf2tech.uturista.pt/index.php?action=history&amp;feed=atom&amp;title=Scripts%3AAircraft_Only"/>
	<link rel="alternate" type="text/html" href="https://bf2tech.uturista.pt/index.php?title=Scripts:Aircraft_Only&amp;action=history"/>
	<updated>2026-08-06T01:10:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://bf2tech.uturista.pt/index.php?title=Scripts:Aircraft_Only&amp;diff=122&amp;oldid=prev</id>
		<title>Pireax: Created page with &quot;__TOC__  == Purpose ==  Makes playing outside of an aircraft rather pointless, as you only get 25 seconds before you start to take damage. This was needed as an admin script o...&quot;</title>
		<link rel="alternate" type="text/html" href="https://bf2tech.uturista.pt/index.php?title=Scripts:Aircraft_Only&amp;diff=122&amp;oldid=prev"/>
		<updated>2018-06-22T15:34:39Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;__TOC__  == Purpose ==  Makes playing outside of an aircraft rather pointless, as you only get 25 seconds before you start to take damage. This was needed as an admin script o...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Makes playing outside of an aircraft rather pointless, as you only get 25 seconds before you start to take damage. This was needed as an admin script on the Coop Flight School server, as there are limited slots, and players on the ground treating it like a normal server were using slots intended for learner pilots.&lt;br /&gt;
&lt;br /&gt;
Could be adapted for use with other vehicles, if for example you wanted to have tank battles or DPV races.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Requires Modmanager.&lt;br /&gt;
&lt;br /&gt;
Save the following to a file named mm_aironly.py in the [bf2server]/admin/modules/ folder, and add a line to enable it in modmanager.con (usually found in [bf2server]/mods/bf2/settings/).&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;Aircraft Only module.&lt;br /&gt;
&lt;br /&gt;
===== About =====&lt;br /&gt;
This ModManager script prevents players from playing as infantry or in ground vehicles,&lt;br /&gt;
by causing damage to players who exit the vehicles they&amp;#039;re spawned in.  Players are given&lt;br /&gt;
a warning on exiting, then 25 seconds later they start to receive damage on a 5 second&lt;br /&gt;
interval, with further warnings.  If they get back into the vehicle then the damage stops.&lt;br /&gt;
If they try to get round it by standing near a resupply/crate/medic then the damage rate&lt;br /&gt;
will increase to counter the healing.&lt;br /&gt;
&lt;br /&gt;
===== Config =====&lt;br /&gt;
 Enter the allowed classes in the RequiredTypes list below&lt;br /&gt;
&lt;br /&gt;
===== History =====&lt;br /&gt;
&lt;br /&gt;
 v2.1 - 20080507:&lt;br /&gt;
 v2 bugfix&lt;br /&gt;
&lt;br /&gt;
 timers are per player to fix bug from sharing that would punish at wrong time/crash server (no OOP experience before this script)&lt;br /&gt;
&lt;br /&gt;
 vehicle parent added to allow gunners/copilots/passengers (still gives warning when switching seats though)&lt;br /&gt;
&lt;br /&gt;
 damage switched from 10/2s to 25/5s and delay upped to 20s from 25s&lt;br /&gt;
&lt;br /&gt;
 everything reset correctly at round end&lt;br /&gt;
&lt;br /&gt;
===== Credit =====&lt;br /&gt;
&lt;br /&gt;
By polarity, loosely based on vehicle class limit&lt;br /&gt;
module by graag42, and other scripts from bf2tech.org&lt;br /&gt;
&lt;br /&gt;
Available from bf2tech.org and flightschool.polar-lights.org.uk&lt;br /&gt;
You&amp;#039;re free to use and modify this script&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import bf2&lt;br /&gt;
import host&lt;br /&gt;
import mm_utils&lt;br /&gt;
from bf2.stats.constants import *&lt;br /&gt;
&lt;br /&gt;
# Set the version of your module here&lt;br /&gt;
__version__ = 2.1&lt;br /&gt;
&lt;br /&gt;
# Set the required module versions here&lt;br /&gt;
__required_modules__ = {&lt;br /&gt;
    &amp;#039;modmanager&amp;#039;: 1.0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Does this module support reload ( are all its reference closed on shutdown? )&lt;br /&gt;
__supports_reload__ = True&lt;br /&gt;
&lt;br /&gt;
# Set the description of your module here&lt;br /&gt;
__description__ = &amp;quot;VehicleClassOnly v%s&amp;quot; % __version__&lt;br /&gt;
&lt;br /&gt;
#Required types are safe to be in&lt;br /&gt;
RequiredTypes = [VEHICLE_TYPE_HELICOPTER, VEHICLE_TYPE_AVIATOR]       &lt;br /&gt;
&lt;br /&gt;
class NoWalk( object ):&lt;br /&gt;
&lt;br /&gt;
    def __init__( self, modManager ):&lt;br /&gt;
&lt;br /&gt;
        self.mm = modManager&lt;br /&gt;
        self.__state = 0&lt;br /&gt;
       &lt;br /&gt;
    def onExitVehicle( self, player, vehicle):&lt;br /&gt;
        if self.__state == 1:&lt;br /&gt;
            if ( (not player.isAIPlayer()) &amp;amp; player.isAlive()): #exited vehicle intentionally&lt;br /&gt;
                if not player.updateTimer:&lt;br /&gt;
                    self.StartTimer( player )&lt;br /&gt;
               &lt;br /&gt;
    def onEnterVehicle( self, player, vehicle, freeSoldier):&lt;br /&gt;
        if self.__state == 1:&lt;br /&gt;
            if (not player.isAIPlayer()):&lt;br /&gt;
                vehicleType = getVehicleType(vehicle.templateName)&lt;br /&gt;
                try:&lt;br /&gt;
                    parentVehicle = vehicle.getParent()&lt;br /&gt;
                    parentType = getVehicleType(parentVehicle.templateName)&lt;br /&gt;
                except:&lt;br /&gt;
                    parentType = 12&lt;br /&gt;
                if ( vehicleType in RequiredTypes ) | ( parentType in RequiredTypes ):&lt;br /&gt;
                    if player.updateTimer:&lt;br /&gt;
                        self.ResetPlayer( player )&lt;br /&gt;
                else:&lt;br /&gt;
                    if not player.updateTimer:&lt;br /&gt;
                        self.StartTimer( player )&lt;br /&gt;
&lt;br /&gt;
    def onPlayerConnect(self, player ):&lt;br /&gt;
        if self.__state == 1:&lt;br /&gt;
            if (not player.isAIPlayer()):&lt;br /&gt;
                player.updateTimer = None&lt;br /&gt;
                self.ResetPlayer( player )&lt;br /&gt;
&lt;br /&gt;
    def onPlayerSpawn(self, player, body):&lt;br /&gt;
        if self.__state == 1:&lt;br /&gt;
            if (not player.isAIPlayer()):&lt;br /&gt;
                self.ResetPlayer( player )&lt;br /&gt;
                bf2.Timer(self.PostSpawnTest, 1, 1, player )&lt;br /&gt;
&lt;br /&gt;
    def PostSpawnTest(self, player):&lt;br /&gt;
        if 1 != self.__state:&lt;br /&gt;
            return 0&lt;br /&gt;
        if (not player.isAIPlayer()):&lt;br /&gt;
            vehicle = player.getVehicle()&lt;br /&gt;
            vehicleType = getVehicleType(vehicle.templateName)&lt;br /&gt;
            try:&lt;br /&gt;
                parentVehicle = vehicle.getParent()&lt;br /&gt;
                parentType = getVehicleType(parentVehicle.templateName)&lt;br /&gt;
            except:&lt;br /&gt;
                parentType = 12&lt;br /&gt;
            if ( vehicleType in RequiredTypes ) | ( parentType in RequiredTypes ):           &lt;br /&gt;
                if player.updateTimer:&lt;br /&gt;
                    self.ResetPlayer( player )&lt;br /&gt;
            else:&lt;br /&gt;
                if not player.updateTimer:&lt;br /&gt;
                    self.StartTimer( player )&lt;br /&gt;
&lt;br /&gt;
    def onPlayerDeath(self, player, body):&lt;br /&gt;
        if self.__state == 1:&lt;br /&gt;
            if (not player.isAIPlayer()):&lt;br /&gt;
                self.ResetPlayer( player )&lt;br /&gt;
&lt;br /&gt;
    def StartTimer( self, player ):&lt;br /&gt;
        if 1 != self.__state:&lt;br /&gt;
            return 0&lt;br /&gt;
        mm_utils.msg_player( player.index, &amp;quot;Fighting on the ground is not permitted in this server.&amp;quot; )&lt;br /&gt;
        mm_utils.msg_player( player.index, &amp;quot;You must enter an aircraft within 25 seconds to avoid punishment.&amp;quot; )&lt;br /&gt;
        player.updateTimer = bf2.Timer(self.onUpdate, 25, 1, player )&lt;br /&gt;
        player.updateTimer.setRecurring(5)&lt;br /&gt;
&lt;br /&gt;
    def StopTimer( self, player ):&lt;br /&gt;
        if 1 != self.__state:&lt;br /&gt;
            return 0&lt;br /&gt;
        if player.updateTimer:&lt;br /&gt;
            player.updateTimer.destroy()&lt;br /&gt;
            player.updateTimer = None&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    def onUpdate( self, player ):&lt;br /&gt;
        if 1 != self.__state:&lt;br /&gt;
            return 0&lt;br /&gt;
        body = player.getDefaultVehicle()&lt;br /&gt;
        damage = body.getDamage()&lt;br /&gt;
        if damage &amp;gt; 0:    #If you&amp;#039;re not dead...&lt;br /&gt;
            if ((player.lastDamage &amp;lt;= damage) &amp;amp; (player.lastDamage != None) &amp;amp; (player.damageRate &amp;lt; 3000)):  #if you&amp;#039;ve been getting healed&lt;br /&gt;
                player.damageRate += 25&lt;br /&gt;
                mm_utils.msg_player( player.index, &amp;quot;You can&amp;#039;t avoid punishment by healing.  Increasing damage rate.&amp;quot; )&lt;br /&gt;
            elif (player.lastDamage &amp;gt;= damage):&lt;br /&gt;
                player.damageRate = 25&lt;br /&gt;
                mm_utils.msg_player( player.index, &amp;quot;Pilots must use aircraft to avoid punishment for being AWOL.&amp;quot; )&lt;br /&gt;
            else:&lt;br /&gt;
                mm_utils.msg_player( player.index, &amp;quot;Pilots must use aircraft to avoid punishment for being AWOL.&amp;quot; )&lt;br /&gt;
            player.lastDamage = damage&lt;br /&gt;
            body.setDamage(damage-player.damageRate)&lt;br /&gt;
            if body.getDamage() &amp;lt; 0:&lt;br /&gt;
                mm_utils.msg_server( &amp;quot;Pilot %s was killed for going AWOL.&amp;quot; % player.getName() )&lt;br /&gt;
&lt;br /&gt;
    def ResetPlayer( self, player ):&lt;br /&gt;
        player.damageRate = 25&lt;br /&gt;
        player.lastDamage = None&lt;br /&gt;
        self.StopTimer( player )&lt;br /&gt;
&lt;br /&gt;
    def ResetAll( self ):&lt;br /&gt;
        for player in bf2.playerManager.getPlayers():&lt;br /&gt;
            if (not player.isAIPlayer()):&lt;br /&gt;
                self.ResetPlayer( player )&lt;br /&gt;
               &lt;br /&gt;
    def onGameStatusChanged( self, status ):&lt;br /&gt;
    # Enables the idle check timer&lt;br /&gt;
    # Import variables, and update the game status:&lt;br /&gt;
        global gamestatus&lt;br /&gt;
        gamestatus = status&lt;br /&gt;
        if gamestatus == bf2.GameStatus.EndGame:&lt;br /&gt;
            self.ResetAll()&lt;br /&gt;
&lt;br /&gt;
    def init( self ):&lt;br /&gt;
        if 0 == self.__state:&lt;br /&gt;
            host.registerHandler( &amp;#039;ExitVehicle&amp;#039;, self.onExitVehicle, 1 )&lt;br /&gt;
            host.registerHandler( &amp;#039;EnterVehicle&amp;#039;, self.onEnterVehicle, 1 )&lt;br /&gt;
            host.registerHandler( &amp;#039;PlayerConnect&amp;#039;, self.onPlayerConnect, 1 )&lt;br /&gt;
            host.registerHandler( &amp;#039;PlayerSpawn&amp;#039;, self.onPlayerSpawn, 1 )&lt;br /&gt;
            host.registerHandler( &amp;#039;PlayerDeath&amp;#039;, self.onPlayerDeath, 1 )&lt;br /&gt;
            host.registerGameStatusHandler(self.onGameStatusChanged)&lt;br /&gt;
           &lt;br /&gt;
           &lt;br /&gt;
        # Update to the running state&lt;br /&gt;
        self.__state = 1&lt;br /&gt;
&lt;br /&gt;
    def shutdown( self ):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Shutdown and stop processing.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        # Unregister game handlers and do any other&lt;br /&gt;
        # other actions to ensure your module no longer affects&lt;br /&gt;
        # the game in anyway&lt;br /&gt;
&lt;br /&gt;
        self.ResetAll()&lt;br /&gt;
&lt;br /&gt;
        # Flag as shutdown as there is currently way to:&lt;br /&gt;
        # host.unregisterHandler&lt;br /&gt;
        self.__state = 2&lt;br /&gt;
&lt;br /&gt;
    def update( self ):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Process and update.&lt;br /&gt;
        Note: This is called VERY often processing in here should&lt;br /&gt;
        be kept to an absolute minimum.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
def mm_load( modManager ):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Creates and returns your object.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return NoWalk( modManager )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
Mainly to Graag, as his class limit script was my main reference for this, my first attempt at BF2 python coding.&lt;/div&gt;</summary>
		<author><name>Pireax</name></author>
	</entry>
</feed>