From 4e1e840432730d3d78068716a2737b866879be44 Mon Sep 17 00:00:00 2001 From: Leonard Jonathan Oh Date: Sun, 21 Jan 2024 15:27:37 +0000 Subject: [PATCH] Enhancement: Bump bf2stats 2.7 variants to 2.7.2 --- .github/workflows/ci-master-pr.yml | 60 +- README.md | 4 +- docs/usage.md | 12 +- generate/definitions/VARIANTS.ps1 | 9 +- .../Dockerfile | 101 +++ .../ESAI-Standard-v4.2.zip | Bin 0 -> 37801 bytes .../aibehaviours-fixlookatwrapper.ai | 822 ++++++++++++++++++ .../esai-helper | 412 +++++++++ .../esai-optimized-strategies-bf2.txt | 142 +++ .../esai-optimized-strategies-bf2all64.txt | 187 ++++ .../esai-optimized-strategies-xpack.txt | 42 + .../healthcheck | 24 + .../lowercase-helper | 70 ++ .../v1.5.3153.0-bf2stats-2.7.2/Dockerfile | 85 ++ .../ESAI-Standard-v4.2.zip | Bin 0 -> 37801 bytes .../aibehaviours-fixlookatwrapper.ai | 822 ++++++++++++++++++ .../v1.5.3153.0-bf2stats-2.7.2/esai-helper | 412 +++++++++ .../esai-optimized-strategies-bf2.txt | 142 +++ .../esai-optimized-strategies-xpack.txt | 42 + .../v1.5.3153.0-bf2stats-2.7.2/healthcheck | 24 + .../lowercase-helper | 70 ++ 21 files changed, 3440 insertions(+), 42 deletions(-) create mode 100644 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/Dockerfile create mode 100644 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/ESAI-Standard-v4.2.zip create mode 100644 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai create mode 100755 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-helper create mode 100644 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt create mode 100644 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2all64.txt create mode 100644 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt create mode 100755 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/healthcheck create mode 100755 variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/lowercase-helper create mode 100644 variants/v1.5.3153.0-bf2stats-2.7.2/Dockerfile create mode 100644 variants/v1.5.3153.0-bf2stats-2.7.2/ESAI-Standard-v4.2.zip create mode 100644 variants/v1.5.3153.0-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai create mode 100755 variants/v1.5.3153.0-bf2stats-2.7.2/esai-helper create mode 100644 variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt create mode 100644 variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt create mode 100755 variants/v1.5.3153.0-bf2stats-2.7.2/healthcheck create mode 100755 variants/v1.5.3153.0-bf2stats-2.7.2/lowercase-helper diff --git a/.github/workflows/ci-master-pr.yml b/.github/workflows/ci-master-pr.yml index a1d1a37..0c412ef 100644 --- a/.github/workflows/ci-master-pr.yml +++ b/.github/workflows/ci-master-pr.yml @@ -616,7 +616,7 @@ jobs: # This step generates the docker tags - name: Prepare - id: prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1 + id: prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2 run: | set -e @@ -629,7 +629,7 @@ jobs: # Generate docker image tags # E.g. 'v0.0.0-' and 'v0.0.0-abc0123-' # E.g. 'master-' and 'master-abc0123-' - VARIANT="v1.5.3153.0-bf2all64-bf2stats-2.7.1" + VARIANT="v1.5.3153.0-bf2all64-bf2stats-2.7.2" REF_VARIANT="${REF}-${VARIANT}" REF_SHA_VARIANT="${REF}-${SHA}-${VARIANT}" @@ -639,45 +639,45 @@ jobs: echo "REF_VARIANT=$REF_VARIANT" >> $GITHUB_OUTPUT echo "REF_SHA_VARIANT=$REF_SHA_VARIANT" >> $GITHUB_OUTPUT - - name: v1.5.3153.0-bf2all64-bf2stats-2.7.1 - Build (PRs) + - name: v1.5.3153.0-bf2all64-bf2stats-2.7.2 - Build (PRs) # Run only on pull requests if: github.event_name == 'pull_request' uses: docker/build-push-action@v3 with: - context: variants/v1.5.3153.0-bf2all64-bf2stats-2.7.1 + context: variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2 platforms: linux/386,linux/amd64 push: false tags: | - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1.outputs.REF_VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1.outputs.REF_SHA_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2.outputs.REF_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2.outputs.REF_SHA_VARIANT }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - - name: v1.5.3153.0-bf2all64-bf2stats-2.7.1 - Build and push (master) + - name: v1.5.3153.0-bf2all64-bf2stats-2.7.2 - Build and push (master) # Run only on master if: github.ref == 'refs/heads/master' uses: docker/build-push-action@v3 with: - context: variants/v1.5.3153.0-bf2all64-bf2stats-2.7.1 + context: variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2 platforms: linux/386,linux/amd64 push: true tags: | - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1.outputs.REF_VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1.outputs.REF_SHA_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2.outputs.REF_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2.outputs.REF_SHA_VARIANT }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - - name: v1.5.3153.0-bf2all64-bf2stats-2.7.1 - Build and push (release) + - name: v1.5.3153.0-bf2all64-bf2stats-2.7.2 - Build and push (release) if: startsWith(github.ref, 'refs/tags/') uses: docker/build-push-action@v3 with: - context: variants/v1.5.3153.0-bf2all64-bf2stats-2.7.1 + context: variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2 platforms: linux/386,linux/amd64 push: true tags: | - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1.outputs.VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1.outputs.REF_VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-1.outputs.REF_SHA_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2.outputs.VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2.outputs.REF_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2all64-bf2stats-2-7-2.outputs.REF_SHA_VARIANT }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max @@ -1353,7 +1353,7 @@ jobs: # This step generates the docker tags - name: Prepare - id: prep-v1-5-3153-0-bf2stats-2-7-1 + id: prep-v1-5-3153-0-bf2stats-2-7-2 run: | set -e @@ -1366,7 +1366,7 @@ jobs: # Generate docker image tags # E.g. 'v0.0.0-' and 'v0.0.0-abc0123-' # E.g. 'master-' and 'master-abc0123-' - VARIANT="v1.5.3153.0-bf2stats-2.7.1" + VARIANT="v1.5.3153.0-bf2stats-2.7.2" REF_VARIANT="${REF}-${VARIANT}" REF_SHA_VARIANT="${REF}-${SHA}-${VARIANT}" @@ -1376,45 +1376,45 @@ jobs: echo "REF_VARIANT=$REF_VARIANT" >> $GITHUB_OUTPUT echo "REF_SHA_VARIANT=$REF_SHA_VARIANT" >> $GITHUB_OUTPUT - - name: v1.5.3153.0-bf2stats-2.7.1 - Build (PRs) + - name: v1.5.3153.0-bf2stats-2.7.2 - Build (PRs) # Run only on pull requests if: github.event_name == 'pull_request' uses: docker/build-push-action@v3 with: - context: variants/v1.5.3153.0-bf2stats-2.7.1 + context: variants/v1.5.3153.0-bf2stats-2.7.2 platforms: linux/386,linux/amd64 push: false tags: | - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-1.outputs.REF_VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-1.outputs.REF_SHA_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-2.outputs.REF_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-2.outputs.REF_SHA_VARIANT }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - - name: v1.5.3153.0-bf2stats-2.7.1 - Build and push (master) + - name: v1.5.3153.0-bf2stats-2.7.2 - Build and push (master) # Run only on master if: github.ref == 'refs/heads/master' uses: docker/build-push-action@v3 with: - context: variants/v1.5.3153.0-bf2stats-2.7.1 + context: variants/v1.5.3153.0-bf2stats-2.7.2 platforms: linux/386,linux/amd64 push: true tags: | - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-1.outputs.REF_VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-1.outputs.REF_SHA_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-2.outputs.REF_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-2.outputs.REF_SHA_VARIANT }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - - name: v1.5.3153.0-bf2stats-2.7.1 - Build and push (release) + - name: v1.5.3153.0-bf2stats-2.7.2 - Build and push (release) if: startsWith(github.ref, 'refs/tags/') uses: docker/build-push-action@v3 with: - context: variants/v1.5.3153.0-bf2stats-2.7.1 + context: variants/v1.5.3153.0-bf2stats-2.7.2 platforms: linux/386,linux/amd64 push: true tags: | - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-1.outputs.VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-1.outputs.REF_VARIANT }} - ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-1.outputs.REF_SHA_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-2.outputs.VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-2.outputs.REF_VARIANT }} + ${{ github.repository }}:${{ steps.prep-v1-5-3153-0-bf2stats-2-7-2.outputs.REF_SHA_VARIANT }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max diff --git a/README.md b/README.md index d685f4e..a249239 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ All images contain [`Battlefield 2 Server 1.50`](https://www.bf-games.net/downlo | `:v1.5.3153.0-bf2all64-bf2stats-2.4.6` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-2.4.6 ) | | `:v1.5.3153.0-bf2all64-bf2stats-2.5.1` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-2.5.1 ) | | `:v1.5.3153.0-bf2all64-bf2stats-2.6.0` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-2.6.0 ) | -| `:v1.5.3153.0-bf2all64-bf2stats-2.7.1` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-2.7.1 ) | +| `:v1.5.3153.0-bf2all64-bf2stats-2.7.2` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2 ) | | `:v1.5.3153.0-bf2all64-bf2stats-3.1.0` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-3.1.0 ) | | `:v1.5.3153.0-bf2all64-bf2stats-3.1.2` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-3.1.2 ) | | `:v1.5.3153.0-bf2all64-bf2stats-3.2.0` | [View](variants/v1.5.3153.0-bf2all64-bf2stats-3.2.0 ) | @@ -31,7 +31,7 @@ All images contain [`Battlefield 2 Server 1.50`](https://www.bf-games.net/downlo | `:v1.5.3153.0-bf2stats-2.4.6` | [View](variants/v1.5.3153.0-bf2stats-2.4.6 ) | | `:v1.5.3153.0-bf2stats-2.5.1` | [View](variants/v1.5.3153.0-bf2stats-2.5.1 ) | | `:v1.5.3153.0-bf2stats-2.6.0` | [View](variants/v1.5.3153.0-bf2stats-2.6.0 ) | -| `:v1.5.3153.0-bf2stats-2.7.1` | [View](variants/v1.5.3153.0-bf2stats-2.7.1 ) | +| `:v1.5.3153.0-bf2stats-2.7.2` | [View](variants/v1.5.3153.0-bf2stats-2.7.2 ) | | `:v1.5.3153.0-bf2stats-3.1.0` | [View](variants/v1.5.3153.0-bf2stats-3.1.0 ) | | `:v1.5.3153.0-bf2stats-3.1.2` | [View](variants/v1.5.3153.0-bf2stats-3.1.2 ) | | `:v1.5.3153.0-bf2stats-3.2.0` | [View](variants/v1.5.3153.0-bf2stats-3.2.0 ) | diff --git a/docs/usage.md b/docs/usage.md index a1724bc..bf4fcbb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -59,13 +59,13 @@ To customize the server, edit `serversettings.con` and `maplist.con` accordingly ```sh # Generate serversettings.con and customize -docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.1 cat /server/bf2/mods/bf2/settings/serversettings.con > serversettings.con +docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.2 cat /server/bf2/mods/bf2/settings/serversettings.con > serversettings.con # Generate maplist.con (coop) -docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.1 bash -c '(esai-helper -m bf2 get maplist; esai-helper -m xpack get maplist) | grep gpm_coop' > maplist.con +docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.2 bash -c '(esai-helper -m bf2 get maplist; esai-helper -m xpack get maplist) | grep gpm_coop' > maplist.con # Generate maplist.con (conquest) -docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.1 bash -c '(esai-helper -m bf2 get maplist; esai-helper -m xpack get maplist) | grep gpm_cq' > maplist.con +docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.2 bash -c '(esai-helper -m bf2 get maplist; esai-helper -m xpack get maplist) | grep gpm_cq' > maplist.con # Generate BF2StatisticsConfig.py and customize -docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.1 cat /server/bf2/python/bf2/BF2StatisticsConfig.py > BF2StatisticsConfig.py +docker run --rm startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.2 cat /server/bf2/python/bf2/BF2StatisticsConfig.py > BF2StatisticsConfig.py # BF2 server with BF2Statistics 2.x.x docker run --rm -it -p 16567:16567/udp -p 29900:29900/udp \ -v "$(pwd)/serversettings.con:/server/bf2/mods/bf2/settings/serversettings.con:ro" \ @@ -74,7 +74,7 @@ docker run --rm -it -p 16567:16567/udp -p 29900:29900/udp \ --add-host bf2web.gamespy.com:192.168.1.100 \ --add-host gamestats.gamespy.com:192.168.1.100 \ --add-host eapusher.dice.se:192.168.1.100 \ - startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.1 + startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.2 ``` See `docker-compose` examples: @@ -308,7 +308,7 @@ docker run --rm -it -p 16567:16567/udp -p 29900:29900/udp \ --add-host bf2web.gamespy.com:192.168.1.100 \ --add-host gamestats.gamespy.com:192.168.1.100 \ --add-host eapusher.dice.se:192.168.1.100 \ - startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.1 + startersclan/docker-bf2:v1.5.3153.0-bf2stats-2.7.2 ``` See `docker-compose` examples: diff --git a/generate/definitions/VARIANTS.ps1 b/generate/definitions/VARIANTS.ps1 index b3e3679..48dc881 100644 --- a/generate/definitions/VARIANTS.ps1 +++ b/generate/definitions/VARIANTS.ps1 @@ -12,7 +12,7 @@ $local:VARIANTS_MATRIX = @( @{ components = @( 'bf2all64', 'bf2stats-2.4.6' ) } @{ components = @( 'bf2all64', 'bf2stats-2.5.1' ) } @{ components = @( 'bf2all64', 'bf2stats-2.6.0' ) } - @{ components = @( 'bf2all64', 'bf2stats-2.7.1' ) } + @{ components = @( 'bf2all64', 'bf2stats-2.7.2' ) } @{ components = @( 'bf2all64', 'bf2stats-3.1.0' ) } @{ components = @( 'bf2all64', 'bf2stats-3.1.2' ) } @{ components = @( 'bf2all64', 'bf2stats-3.2.0' ) } @@ -23,7 +23,7 @@ $local:VARIANTS_MATRIX = @( @{ components = @( 'bf2stats-2.4.6' ) } @{ components = @( 'bf2stats-2.5.1' ) } @{ components = @( 'bf2stats-2.6.0' ) } - @{ components = @( 'bf2stats-2.7.1' ) } + @{ components = @( 'bf2stats-2.7.2' ) } @{ components = @( 'bf2stats-3.1.0' ) } @{ components = @( 'bf2stats-3.1.2' ) } @{ components = @( 'bf2stats-3.2.0' ) } @@ -65,7 +65,7 @@ $VARIANTS = @( @{ variables = @{ # Since bf2stats 2 python files - # E.g. https://github.com/startersclan/bf2stats/archive/refs/tags/2.7.1.tar.gz + # E.g. https://github.com/startersclan/bf2stats/archive/refs/tags/2.7.2.tar.gz bf2stats_2_sha256sum = @" 29a25c6e78062f34b05d7086aad530b598b4c9ed3f32164ffcf3b1c52b33f553 2.3.0.tar.gz 9a5e0544ba1474feb5ca0194449f6d6dee521abf59cba96dbc94387490d660b0 2.3.1.tar.gz @@ -87,7 +87,8 @@ de0468b62a510b1b074e6be41b79027edb4f3198940b65d01aa4947cafc27bf8 2.5.0.tar.gz e07f46f0078fc0dcdbeb0dd86e1e9add4b502b0d7b263711dcad957ec4a6de61 2.5.1.tar.gz 7a75b58fec1b1d105c1a495e543eff6f2ee0fd0bf4ab010078539ef95e55f6e7 2.6.0.tar.gz daeb57232cd1725bea3cf45c197fba13d99251864347ffff44552aae585b273a 2.7.0.tar.gz -96a9cd2c1283668e417f45ee14dec6307cbad9f310a81e2e8b5af95a871fef4f 2.7.1.tar.gz +96a9cd2c1283668e417f45ee14dec6307cbad9f310a81e2e8b5af95a871fef4f 2.7.2.tar.gz +bee8933873b42fff26aff34de964d54f4f470e256be43de7ab30ad122788d605 2.7.2.tar.gz "@ # Since bf2stats 3 python files # E.g. https://github.com/startersclan/statspython/archive/refs/tags/3.2.0.tar.gz diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/Dockerfile b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/Dockerfile new file mode 100644 index 0000000..dd492b3 --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/Dockerfile @@ -0,0 +1,101 @@ +FROM ubuntu:16.04 as install +ARG TARGETPLATFORM=linux/amd64 +ARG BUILDPLATFORM=linux/amd64 +RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" + +# Install network utilities which can be useful for debugging issues +# Install unzip and zip for the sake of applying ESAI strategies in ./mods/*/levels/*/server.zip at './GameModes/[gpm_coop|gpm_cq|sp1|sp2|sp3]/[16|32|64]/AI/Strategies.ai' +RUN export DEBIAN_FRONTEND=noninteractive; \ + apt-get update; \ + apt-get install --no-install-recommends -y \ + ca-certificates \ + curl \ + conntrack dnsutils iproute2 netcat net-tools tcpdump \ + unzip zip \ + ; \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/*; + +# Install Battlefield 2 server +WORKDIR /root +COPY aibehaviours-fixlookatwrapper.ai /aibehaviours-fixlookatwrapper.ai +RUN set -eux; \ + curl -sSLO https://files.startersclan.com/ea/bf2/bf2-linuxded-1.5.3153.0-installer.tgz; \ + sha256sum bf2-linuxded-1.5.3153.0-installer.tgz | grep "^4d849218c1725e7bd6a7e7f164e27b036248f8ded2e30340dd0722c1dfffbab6 "; \ + tar -zxvf bf2-linuxded-1.5.3153.0-installer.tgz; \ + sh bf2-linuxded-1.5.3153.0-installer.sh --target /install --noexec --info; \ + sh bf2-linuxded-1.5.3153.0-installer.sh --target /install --noexec; \ + rm -v bf2-linuxded-1.5.3153.0-installer.sh; \ + rm -v bf2-linuxded-1.5.3153.0-installer.tgz; \ + cd /install; \ + mkdir -p /server; \ + # Show the licenses without a pager + cat /install/license.sh | sed 's/^more/cat/' > /install/license-fixed.sh; \ + # Agree to licenses + printf '\naccept\n\nyes\n/server\ny\n' | sh /install/license-fixed.sh; \ + find /server; \ + rm -rf /install; \ + # Apply the LookAtWrapper fix to prevent crashes when playing with bots + mv -v /server/bf2/mods/bf2/ai/aibehaviours.ai /server/bf2/mods/bf2/ai/aibehaviours.ai.original; \ + cp -v /aibehaviours-fixlookatwrapper.ai /server/bf2/mods/bf2/ai/aibehaviours.ai; \ + mv -v /server/bf2/mods/xpack/ai/aibehaviours.ai /server/bf2/mods/xpack/ai/aibehaviours.ai.original; \ + cp -v /aibehaviours-fixlookatwrapper.ai /server/bf2/mods/xpack/ai/aibehaviours.ai; \ + rm -v /aibehaviours-fixlookatwrapper.ai + +# Install bf2all64 mod +WORKDIR /root +COPY aibehaviours-fixlookatwrapper.ai /aibehaviours-fixlookatwrapper.ai +RUN set -eux; \ + curl -sSLO https://files.startersclan.com/ea/bf2/bf2all64_v1.0_setup.zip; \ + sha256sum bf2all64_v1.0_setup.zip | grep '^4ee82d91043c4afbf1bed50787cbf98af124bd7e6c608cdb0f5115c7761024f1 '; \ + unzip bf2all64_v1.0_setup.zip -d extract; \ + rm -rf /server/bf2/mods/bf2all64; \ + mv extract/bf2all64 /server/bf2/mods; \ + rm -fv bf2all64_v1.0_setup.zip; \ + # Apply the LookAtWrapper fix to prevent crashes when playing with bots + mv -v /server/bf2/mods/bf2all64/ai/aibehaviours.ai /server/bf2/mods/bf2all64/ai/aibehaviours.ai.original; \ + cp -v /aibehaviours-fixlookatwrapper.ai /server/bf2/mods/bf2all64/ai/aibehaviours.ai; \ + rm -v /aibehaviours-fixlookatwrapper.ai + +# Install bf2stats 2.7.2 +WORKDIR /root +RUN set -eux; \ + curl -sSLO https://github.com/startersclan/bf2stats/archive/refs/tags/2.7.2.tar.gz; \ + echo "96a9cd2c1283668e417f45ee14dec6307cbad9f310a81e2e8b5af95a871fef4f 2.7.2.tar.gz bee8933873b42fff26aff34de964d54f4f470e256be43de7ab30ad122788d605 2.7.2.tar.gz" | sha256sum -c -; \ + mkdir -p extract; \ + tar -C extract -zxvf 2.7.2.tar.gz; \ + rm -rf /server/bf2/python; \ + mv extract/bf2stats-2.7.2/src/python /server/bf2/python; \ + rm -fv 2.7.2.tar.gz; \ + rm -rf extract + +# Install ESAI in all mods +WORKDIR /root +COPY ESAI-Standard-v4.2.zip ESAI-Standard-v4.2.zip +COPY lowercase-helper /usr/local/bin/lowercase-helper +RUN set -eux; \ + sha256sum ESAI-Standard-v4.2.zip | grep '^ef4e5d0f1446b9a2ddb0b350f1334273681c0f64d9c38c506320db769b24499c '; \ + # Lowercase all files in ESAI folder + for i in $( ls /server/bf2/mods ); do \ + unzip ESAI-Standard-v4.2.zip -d /server/bf2/mods/$i; \ + lowercase-helper --dir "/server/bf2/mods/$i/ESAI"; \ + done; \ + # Lowercase ESAI mapfiles' content + for i in $( find /server/bf2/mods/*/esai/mapfiles -type f ); do \ + CONTENT=$( cat "$i" ); \ + echo "$CONTENT" | tr '[:upper:]' '[:lower:]' > "$i"; \ + done; + +# Install esai-helper and configs +COPY esai-helper /usr/local/bin/esai-helper +COPY esai-optimized-strategies-bf2.txt /esai-optimized-strategies-bf2.txt +COPY esai-optimized-strategies-bf2all64.txt /esai-optimized-strategies-bf2all64.txt +COPY esai-optimized-strategies-xpack.txt /esai-optimized-strategies-xpack.txt + +COPY healthcheck /healthcheck + +# EXPOSE 16567/udp +# EXPOSE 29900/udp +# HEALTHCHECK CMD /healthcheck +WORKDIR /server/bf2 +CMD [ "./start.sh", "+modPath", "mods/bf2all64" ] diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/ESAI-Standard-v4.2.zip b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/ESAI-Standard-v4.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..4870ceea2e1f298cc68aaae1d1c933c4fb20f19b GIT binary patch literal 37801 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 literal 0 HcmV?d00001 diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai new file mode 100644 index 0000000..61a95f0 --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai @@ -0,0 +1,822 @@ +rem *** Set number of behaviours and id/name mappings *** +aiSettings.setMaxNumberOfBehaviours 13 + +aiSettings.setBehaviour 0 Avoid +aiSettings.setBehaviour 1 MoveTo +aiSettings.setBehaviour 2 Idle +aiSettings.setBehaviour 3 Fire +aiSettings.setBehaviour 4 TakeCover +aiSettings.setBehaviour 5 Change +aiSettings.setBehaviour 6 Special +aiSettings.setBehaviour 7 Revive +aiSettings.setBehaviour 8 c4 +aiSettings.setBehaviour 9 Special2 +aiSettings.setBehaviour 10 Special3 +aiSettings.setBehaviour 11 Random +aiSettings.setBehaviour 12 Triggerable + + +rem *** Set number of vehicles and id/name mappings *** +aiSettings.setVehicle Tank +aiSettings.setVehicle Plane +aiSettings.setVehicle Boat +aiSettings.setVehicle Infantery +aiSettings.setVehicle Fixed +aiSettings.setVehicle Car +aiSettings.setVehicle LandingCraft +aiSettings.setVehicle Passenger +aiSettings.setVehicle LandingCraftPassenger +aiSettings.setVehicle LandingCraftFixed +aiSettings.setVehicle Helicopter +aiSettings.setVehicle TransportHelicopter +aiSettings.setVehicle ArmedCar +aiSettings.setVehicle ManDown +aiSettings.setVehicle ParatrooperFixed + +aiSettings.setVehicleClusterMapping Tank Tank +aiSettings.setVehicleClusterMapping Boat LandingCraft +aiSettings.setVehicleClusterMapping Infantery Infantery +aiSettings.setVehicleClusterMapping Car Tank +rem aiSettings.setVehicleClusterMapping LandingCraft LandingCraft +aiSettings.setVehicleClusterMapping LandingCraft ArmedCar +aiSettings.setVehicleClusterMapping ArmedCar ArmedCar + + +rem *** Set Sensing Agent Patterns id/name mappings *** +aiSettings.setSensingAgentPatternName Turret +aiSettings.setSensingAgentPatternName MouseFreeLook +aiSettings.setSensingAgentPatternName Soldier +aiSettings.setSensingAgentPatternName Null +rem the null pattern +aiSettings.setSensingAgentNullPattern Null + + +aiSettings.setManDownEquipment ManDown + +rem *** IMPORTANT !!! ************************** +rem * NEVER ALLOW IDLE's urgency to become 0. * +rem * The AI will CRASH in that case. * +rem *** REMINDER ******************************* + +rem *** Construct unit weights *** +aiSettings.createBehaviourModifiers UnitWeights +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 1.0 +aiSettings.setBehaviourModifier Fire 1.0 +aiSettings.setBehaviourModifier Special 1.0 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct HeliMove weights *** +aiSettings.createBehaviourModifiers HeliMoveWeights +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 0.01 +aiSettings.setBehaviourModifier Fire 1.0 +aiSettings.setBehaviourModifier Special 1.0 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct standard weights *** +aiSettings.createBehaviourModifiers StandardWeights +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 0.1 +aiSettings.setBehaviourModifier Fire 7.5 +aiSettings.setBehaviourModifier Special 3.0 +aiSettings.setBehaviourModifier TakeCover 2.0 +aiSettings.setBehaviourModifier Change 1.9 +aiSettings.setBehaviourModifier Revive 3.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct plane weights *** +aiSettings.createBehaviourModifiers PlaneWeights +aiSettings.setBehaviourModifier Avoid 0.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 0.1 +aiSettings.setBehaviourModifier Fire 1.5 +aiSettings.setBehaviourModifier Special 1.0 +aiSettings.setBehaviourModifier TakeCover 0.0 +aiSettings.setBehaviourModifier Change 0.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct Avoid inhibitors *** +aiSettings.createBehaviourModifiers AvoidInhibit +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 0.3 +aiSettings.setBehaviourModifier Idle 1.0 +aiSettings.setBehaviourModifier Fire 1.0 +aiSettings.setBehaviourModifier Special 0.5 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct Change Inhibit *** +aiSettings.createBehaviourModifiers ChangeInhibit +aiSettings.setBehaviourModifier Avoid 0.8 +aiSettings.setBehaviourModifier MoveTo 0.0 +aiSettings.setBehaviourModifier Idle 0.01 +aiSettings.setBehaviourModifier Fire 0.75 +aiSettings.setBehaviourModifier Special 0.0 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Set basic weights for bot behaviour *** +aiSettings.setBasicBotWeights UnitWeights +aiSettings.setStandardPersonality UnitWeights 1 +aiSettings.setStandardPersonality UnitWeights 2 + +rem ************************* Vehicle behaviour setup ****************************** + +aiSettings.createUCConstant UCUnion 1.0 +aiSettings.createUCLinear UCFire -0.22 1.3 +aiSettings.createUCLinear UCCallForMedic 0.1 1 +aiSettings.createUCXInverse UCScout 2.5 0.9 1.0 0.5 + +rem *** Tank Behaviour setup *** +aisettings.setVehicleMods Tank StandardWeights +aiSettings.setVehicleMaterialCost Tank Ground 1 +aiSettings.setVehicleMaterialCost Tank Road 1 +aiSettings.setVehicleMaterialCost Tank Shallows 1.5 +aiSettings.setVehicleMaterialCost Tank DeepWater -1 +aiSettings.setVehicleBehaviour Tank Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Tank MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Tank Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Tank Idle +aiSettings.addInterpreterEntry Tank MoveToMedium Medium +aiSettings.addInterpreterEntry Tank MoveToObjectMedium Medium +aiSettings.addInterpreterEntry Tank InfoWrapper +aiSettings.addInterpreterEntry Tank TankMoveTo +aiSettings.addInterpreterEntry Tank TankTurnTo +aiSettings.addInterpreterEntry Tank TankMoveToDirection +aiSettings.addInterpreterEntry Tank TankMoveToObject +aiSettings.addInterpreterEntry Tank Trigger +aiSettings.addInterpreterEntry Tank TriggerContinously +aiSettings.addInterpreterEntry Tank MouseTurretAimAt +aiSettings.addInterpreterEntry Tank TankResetControls +aiSettings.addInterpreterEntry Tank MouseTurretLookAt +aiSettings.addInterpreterEntry Tank Sense +aiSettings.activateDefaultInterpreter Tank BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter Tank BAPSTParallel Full +aiSettings.activateDefaultInterpreter Tank BAPSTSerial Full +aiSettings.activateDefaultInterpreter Tank BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Tank BAPSTIf Full +aiSettings.activateDefaultInterpreter Tank BAPSTWait Full +aiSettings.activateDefaultInterpreter Tank BAPSTWhile Full +aiSettings.activateDefaultInterpreter Tank BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Tank BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Tank BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Tank BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Tank BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Tank BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Tank BAPSTIdle Full +aiSettings.activateDefaultInterpreter Tank BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Tank BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Tank BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Tank BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTDebug Full +aiSettings.activateDefaultInterpreter Tank BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Tank BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Tank BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern Tank Turret + +rem *** Plane Behaviour setup *** +aisettings.setVehicleMods Plane StandardWeights +aiSettings.setVehicleBehaviour Plane MoveTo BBMoveTo BBPGotoWaypoint3d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Plane Idle BBIdle BBPIdle3d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Plane Fire BBFire3d BBPFire3d 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Plane Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Plane Idle +aiSettings.addInterpreterEntry Plane InfoWrapper +aiSettings.addInterpreterEntry Plane PlaneMoveTo +aiSettings.addInterpreterEntry Plane PlaneMoveToDirection +aiSettings.addInterpreterEntry Plane PlaneMoveToObject +aiSettings.addInterpreterEntry Plane Trigger +aiSettings.addInterpreterEntry Plane TriggerContinously +aiSettings.addInterpreterEntry Plane PlaneAimAt +aiSettings.addInterpreterEntry Plane PlaneResetControls +aiSettings.addInterpreterEntry Plane Sense +aiSettings.activateDefaultInterpreter Plane BAPSTParallel Full +aiSettings.activateDefaultInterpreter Plane BAPSTSerial Full +aiSettings.activateDefaultInterpreter Plane BAPSTIf Full +aiSettings.activateDefaultInterpreter Plane BAPSTWait Full +aiSettings.activateDefaultInterpreter Plane BAPSTWhile Full +aiSettings.activateDefaultInterpreter Plane BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Plane BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Plane BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Plane BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Plane BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Plane BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Plane BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Plane BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Plane BAPSTIdle Full +aiSettings.activateDefaultInterpreter Plane BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Plane BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Plane BAPSTDebug Full +aiSettings.activateDefaultInterpreter Plane BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Plane BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter Plane BAPSTLookAtWrapper Full + +rem *** Boat Behaviour setup *** +aisettings.setVehicleMods Boat StandardWeights +aiSettings.setVehicleMaterialCost Boat Ground -1 +aiSettings.setVehicleMaterialCost Boat Road -1 +aiSettings.setVehicleMaterialCost Boat Shallows -1 +aiSettings.setVehicleMaterialCost Boat DeepWater 1 +aiSettings.setVehicleBehaviour Boat Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Boat MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Boat Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Boat Fire BBFireLargeBore BBPFire2d 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Boat Change BBChangeTeleport BBPChangeTeleport 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Boat Idle +aiSettings.addInterpreterEntry Boat InfoWrapper +aiSettings.addInterpreterEntry Boat BoatMoveTo +aiSettings.addInterpreterEntry Boat BoatMoveToDirection +aiSettings.addInterpreterEntry Boat BoatMoveToObject +aiSettings.addInterpreterEntry Boat Trigger +aiSettings.addInterpreterEntry Boat TriggerContinously +aiSettings.addInterpreterEntry Boat MouseTurretLookAt +aiSettings.addInterpreterEntry Boat MouseTurretAimAt +aiSettings.addInterpreterEntry Boat Sense +aiSettings.addInterpreterEntry Boat BoatResetControls +aiSettings.activateDefaultInterpreter Boat BAPSTParallel Full +aiSettings.activateDefaultInterpreter Boat BAPSTSerial Full +aiSettings.activateDefaultInterpreter Boat BAPSTIf Full +aiSettings.activateDefaultInterpreter Boat BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Boat BAPSTWait Full +aiSettings.activateDefaultInterpreter Boat BAPSTWhile Full +aiSettings.activateDefaultInterpreter Boat BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Boat BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Boat BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Boat BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Boat BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Boat BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Boat BAPSTIdle Full +aiSettings.activateDefaultInterpreter Boat BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Boat BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Boat BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Boat BAPSTDebug Full +aiSettings.activateDefaultInterpreter Boat BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Boat BAPSTEvaluateCondition Full + +rem *** Infantery Behaviour setup *** +aisettings.setVehicleMods Infantery StandardWeights +aiSettings.setVehicleMaterialCost Infantery Ground 1 +aiSettings.setVehicleMaterialCost Infantery Road 1 +aiSettings.setVehicleMaterialCost Infantery Shallows 1.5 +aiSettings.setVehicleMaterialCost Infantery DeepWater 6 +aiSettings.setVehicleBehaviour Infantery Avoid BBAvoid BBPAvoidCollisionInfantery 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Infantery MoveTo BBMoveTo BBPGotoWaypointInfantery 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Idle BBIdle BBPIdleInfantery 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Infantery Special BBMedicAssist BBPMedicAssist 12 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery c4 BBC4 BBPC4 12 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Change BBChange BBPChange 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Revive BBRevive BBPRevive 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Random BBRandom BBPRandom 12 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Triggerable BBTriggerable BBPTriggerable 12 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Infantery Idle +aiSettings.addInterpreterEntry Infantery MoveToMediumSoldier Medium +aiSettings.addInterpreterEntry Infantery MoveToObjectMediumSoldier Medium +aiSettings.addInterpreterEntry Infantery InfoWrapper +aiSettings.addInterpreterEntry Infantery InfanteryMoveTo +aiSettings.addInterpreterEntry Infantery InfanteryMoveToDirection +aiSettings.addInterpreterEntry Infantery InfanteryMoveToObject +aiSettings.addInterpreterEntry Infantery Trigger +aiSettings.addInterpreterEntry Infantery TriggerContinously +aiSettings.addInterpreterEntry Infantery MouseTurretAimAt +aiSettings.addInterpreterEntry Infantery InfanteryResetControls +aiSettings.addInterpreterEntry Infantery MouseTurretLookAt +aiSettings.addInterpreterEntry Infantery Sense +aiSettings.addInterpreterEntry Infantery SoldierPose +aiSettings.activateDefaultInterpreter Infantery BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter Infantery BAPSTPlaceC4 Full +aiSettings.activateDefaultInterpreter Infantery BAPSTParallel Full +aiSettings.activateDefaultInterpreter Infantery BAPSTSerial Full +aiSettings.activateDefaultInterpreter Infantery BAPSTIf Full +aiSettings.activateDefaultInterpreter Infantery BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Infantery BAPSTWait Full +aiSettings.activateDefaultInterpreter Infantery BAPSTWhile Full +aiSettings.activateDefaultInterpreter Infantery BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Infantery BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Infantery BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Infantery BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Infantery BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Infantery BAPSTIdle Full +aiSettings.activateDefaultInterpreter Infantery BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Infantery BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Infantery BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Infantery BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTDebug Full +aiSettings.activateDefaultInterpreter Infantery BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Infantery BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluateCondition Full +aiSettings.activateDefaultInterpreter Infantery BAPSTRevive Full +aiSettings.addSensingAgentPattern Infantery Soldier + + + +rem *** Fixed Behaviour setup *** +aisettings.setVehicleMods Fixed StandardWeights +aiSettings.setVehicleBehaviour Fixed Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Fixed MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Change BBChange BBPChange 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Fixed Idle +aiSettings.addInterpreterEntry Fixed InfoWrapper +aiSettings.addInterpreterEntry Fixed Trigger +aiSettings.addInterpreterEntry Fixed TriggerContinously +aiSettings.addInterpreterEntry Fixed MouseTurretAimAt +aiSettings.addInterpreterEntry Fixed MouseTurretLookAt +aiSettings.addInterpreterEntry Fixed Sense +aiSettings.addInterpreterEntry Fixed InfanteryResetControls +aiSettings.activateDefaultInterpreter Fixed BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter Fixed BAPSTParallel Full +aiSettings.activateDefaultInterpreter Fixed BAPSTSerial Full +aiSettings.activateDefaultInterpreter Fixed BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Fixed BAPSTIf Full +aiSettings.activateDefaultInterpreter Fixed BAPSTWait Full +aiSettings.activateDefaultInterpreter Fixed BAPSTWhile Full +aiSettings.activateDefaultInterpreter Fixed BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Fixed BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Fixed BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Fixed BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Fixed BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Fixed BAPSTNotifyBot Full + +aiSettings.activateDefaultInterpreter Fixed BAPSTIdle Full +aiSettings.activateDefaultInterpreter Fixed BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Fixed BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Fixed BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Fixed BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTDebug Full +aiSettings.activateDefaultInterpreter Fixed BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Fixed BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern Fixed Turret + +rem *** Car Behaviour setup *** +aiSettings.setVehicleMaterialCost Car Ground 1 +aiSettings.setVehicleMaterialCost Car Road 1 +aiSettings.setVehicleMaterialCost Car Shallows 1.8 +aiSettings.setVehicleMaterialCost Car DeepWater -1 + +aisettings.setVehicleMods Car StandardWeights +aiSettings.setVehicleBehaviour Car Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Car MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Change BBChange BBPChange 2 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Fire BBFireUnarmed BBPFireDriveAttack 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Special BBRunOverSoldier BBPRunOverSoldier 6 UCUnion UnitWeights + +aiSettings.setVehicleBehaviour Car Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Car Idle + +aiSettings.addInterpreterEntry Car CarResetControls +aiSettings.addInterpreterEntry Car MoveToMedium Medium +aiSettings.addInterpreterEntry Car MoveToObjectMedium Medium +aiSettings.addInterpreterEntry Car InfoWrapper +aiSettings.addInterpreterEntry Car CarMoveTo +aiSettings.addInterpreterEntry Car CarMoveToDirection +aiSettings.addInterpreterEntry Car CarMoveToObject +aiSettings.addInterpreterEntry Car Trigger +aiSettings.addInterpreterEntry Car TriggerContinously +aiSettings.addInterpreterEntry Car MouseTurretAimAt +aiSettings.addInterpreterEntry Car MouseTurretLookAt +aiSettings.addInterpreterEntry Car Sense +aiSettings.activateDefaultInterpreter Car BAPSTParallel Full +aiSettings.activateDefaultInterpreter Car BAPSTSerial Full +aiSettings.activateDefaultInterpreter Car BAPSTIf Full +aiSettings.activateDefaultInterpreter Car BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Car BAPSTWait Full +aiSettings.activateDefaultInterpreter Car BAPSTWhile Full +aiSettings.activateDefaultInterpreter Car BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Car BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Car BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Car BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Car BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Car BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Car BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Car BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Car BAPSTIdle Full +aiSettings.activateDefaultInterpreter Car BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Car BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Car BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Car BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Car BAPSTDebug Full +aiSettings.activateDefaultInterpreter Car BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Car BAPSTRunOverObject Full +aiSettings.activateDefaultInterpreter Car BAPSTHonkHorn Full +aiSettings.activateDefaultInterpreter Car BAPSTEvaluateCondition Full + +rem *** LandingCraft Behaviour setup *** +aisettings.setVehicleMods LandingCraft StandardWeights +aiSettings.setVehicleMaterialCost LandingCraft Ground 10 +aiSettings.setVehicleMaterialCost LandingCraft Road 10 +aiSettings.setVehicleMaterialCost LandingCraft Shallows 2 +aiSettings.setVehicleMaterialCost LandingCraft DeepWater 1 +aiSettings.setVehicleBehaviour LandingCraft Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour LandingCraft MoveTo BBMoveTo BBPGotoWaypointBoat 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraft Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraft Fire BBFireUnarmed UnRelated 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraft Change BBChangeLandingCraft BBPChangeLandingCraft 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour LandingCraft Idle +aiSettings.addInterpreterEntry LandingCraft MoveToMediumBoat Medium +aiSettings.addInterpreterEntry LandingCraft MoveToObjectMediumBoat Medium +aiSettings.addInterpreterEntry LandingCraft CarMoveTo +aiSettings.addInterpreterEntry LandingCraft CarMoveToDirection +aiSettings.addInterpreterEntry LandingCraft CarMoveToObject +aiSettings.addInterpreterEntry LandingCraft Trigger +aiSettings.addInterpreterEntry LandingCraft TriggerContinously +aiSettings.addInterpreterEntry LandingCraft MouseTurretLookAt +aiSettings.addInterpreterEntry LandingCraft BoatResetControls +aiSettings.addInterpreterEntry LandingCraft Sense +aiSettings.activateDefaultInterpreter LandingCraft BAPSTParallel Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTSerial Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTIf Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTWait Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTWhile Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTIdle Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTPhysicsEnable Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTDebug Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTUseFlareOnMissileLock Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter LandingCraft BAPSTLookAtWrapper Full +aiSettings.addSensingAgentPattern LandingCraft Turret + + +rem *** Passenger Behaviour setup *** +aisettings.setVehicleMods Passenger StandardWeights +aiSettings.setVehicleBehaviour Passenger Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Fire BBFireUnarmed UnRelated 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleBehaviour Passenger MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Passenger Idle +aiSettings.addInterpreterEntry Passenger Trigger +aiSettings.addInterpreterEntry Passenger TriggerContinously +aiSettings.addInterpreterEntry Passenger MouseTurretLookAt +aiSettings.addInterpreterEntry Passenger InfanteryResetControls +aiSettings.addInterpreterEntry Passenger Sense +aiSettings.activateDefaultInterpreter Passenger BAPSTParallel Full +aiSettings.activateDefaultInterpreter Passenger BAPSTSerial Full +aiSettings.activateDefaultInterpreter Passenger BAPSTIf Full +aiSettings.activateDefaultInterpreter Passenger BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Passenger BAPSTWait Full +aiSettings.activateDefaultInterpreter Passenger BAPSTWhile Full +aiSettings.activateDefaultInterpreter Passenger BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter Passenger BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Passenger BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Passenger BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Passenger BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Passenger BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Passenger BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Passenger BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Passenger BAPSTIdle Full +aiSettings.activateDefaultInterpreter Passenger BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Passenger BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Passenger BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Passenger BAPSTDebug Full +aiSettings.activateDefaultInterpreter Passenger BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Passenger BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter Passenger BAPSTLookAtWrapper Full +aiSettings.addSensingAgentPattern Passenger Turret + +rem *** Passenger Behaviour setup *** +aisettings.setVehicleMods LandingCraftPassenger StandardWeights +aiSettings.setVehicleBehaviour LandingCraftPassenger Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraftPassenger Fire BBFireUnarmed UnRelated 6 UCScout UnitWeights +aiSettings.setVehicleBehaviour LandingCraftPassenger Change BBChangeLandingCraft BBPChangeLandingCraft 6 UCUnion ChangeInhibit +aiSettings.setVehicleBehaviour LandingCraftPassenger MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour LandingCraftPassenger Idle +aiSettings.addInterpreterEntry LandingCraftPassenger Trigger +aiSettings.addInterpreterEntry LandingCraftPassenger TriggerContinously +aiSettings.addInterpreterEntry LandingCraftPassenger MouseTurretLookAt +aiSettings.addInterpreterEntry LandingCraftPassenger InfanteryResetControls +aiSettings.addInterpreterEntry LandingCraftPassenger Sense +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTParallel Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTSerial Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTIf Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTWait Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTWhile Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTIdle Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTDebug Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTLookAtWrapper Full + +rem *** LandingCraftFixed Behaviour setup *** +aisettings.setVehicleMods LandingCraftFixed StandardWeights +aiSettings.setVehicleBehaviour LandingCraftFixed Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraftFixed Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour LandingCraftFixed MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraftFixed Change BBChangeLandingCraft BBPChangeLandingCraft 6 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour LandingCraftFixed Idle +aiSettings.addInterpreterEntry LandingCraftFixed InfoWrapper +aiSettings.addInterpreterEntry LandingCraftFixed Trigger +aiSettings.addInterpreterEntry LandingCraftFixed TriggerContinously +aiSettings.addInterpreterEntry LandingCraftFixed MouseTurretAimAt +aiSettings.addInterpreterEntry LandingCraftFixed MouseTurretLookAt +aiSettings.addInterpreterEntry LandingCraftFixed Sense +aiSettings.addInterpreterEntry LandingCraftFixed InfanteryResetControls +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTParallel Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTSerial Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTIf Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTWait Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTWhile Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTIdle Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTDebug Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTLookAtWrapper Full +aiSettings.addSensingAgentPattern LandingCraftFixed Turret + +rem ***** HeliBehaviour setup *** +aisettings.setVehicleMods Helicopter StandardWeights +aiSettings.setVehicleBehaviour Helicopter MoveTo BBMoveTo BBPGotoWaypoint3d 4 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour Helicopter Idle BBIdle BBPIdle3d 5 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour Helicopter Fire BBFire3d BBPHeliFire3d 4 UCFire HeliMoveWeights +aiSettings.setVehicleBehaviour Helicopter Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Helicopter Idle + +aiSettings.addInterpreterEntry Helicopter InfoWrapper +aiSettings.addInterpreterEntry Helicopter HeliMoveTo +aiSettings.addInterpreterEntry Helicopter HeliMoveToDirection +aiSettings.addInterpreterEntry Helicopter HeliMoveToObject +aiSettings.addInterpreterEntry Helicopter HeliMoveAwayFromObject +aiSettings.addInterpreterEntry Helicopter Trigger +aiSettings.addInterpreterEntry Helicopter TriggerContinously +aiSettings.addInterpreterEntry Helicopter HeliAimAt +aiSettings.addInterpreterEntry Helicopter HeliResetControls +aiSettings.addInterpreterEntry Helicopter Sense +aiSettings.activateDefaultInterpreter Helicopter BAPSTParallel Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTSerial Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTIf Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTWait Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTWhile Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTIdle Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTDebug Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter Helicopter BAPSTLookAtWrapper Full + + +rem ***** TransportHelicopterBehaviour setup *** +aisettings.setVehicleMods TransportHelicopter StandardWeights +aiSettings.setVehicleBehaviour TransportHelicopter MoveTo BBMoveTo BBPGotoWaypoint3d 4 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour TransportHelicopter Idle BBIdle BBPIdle3d 5 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour TransportHelicopter Change BBChangeLandingCraft BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour TransportHelicopter Idle + +aiSettings.addInterpreterEntry TransportHelicopter InfoWrapper +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveTo +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveToDirection +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveToObject +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveAwayFromObject +aiSettings.addInterpreterEntry TransportHelicopter Trigger +aiSettings.addInterpreterEntry TransportHelicopter TriggerContinously +aiSettings.addInterpreterEntry TransportHelicopter HeliAimAt +aiSettings.addInterpreterEntry TransportHelicopter HeliResetControls +aiSettings.addInterpreterEntry TransportHelicopter Sense +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTParallel Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTSerial Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTIf Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTWait Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTWhile Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTIdle Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTDebug Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTLookAtWrapper Full + +rem **-------- Armed Car ----------------------- + +aisettings.setVehicleMods ArmedCar StandardWeights +aiSettings.setVehicleMaterialCost ArmedCar Ground 1 +aiSettings.setVehicleMaterialCost ArmedCar Road 1 +aiSettings.setVehicleMaterialCost ArmedCar Shallows 1 +aiSettings.setVehicleMaterialCost ArmedCar DeepWater 2 +aiSettings.setVehicleBehaviour ArmedCar Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour ArmedCar MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Change BBChange BBPChange 2 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour ArmedCar Idle +aiSettings.addInterpreterEntry ArmedCar CarResetControls +aiSettings.addInterpreterEntry ArmedCar MoveToMedium Medium +aiSettings.addInterpreterEntry ArmedCar MoveToObjectMedium Medium +aiSettings.addInterpreterEntry ArmedCar InfoWrapper +aiSettings.addInterpreterEntry ArmedCar CarMoveTo +aiSettings.addInterpreterEntry ArmedCar CarMoveToDirection +aiSettings.addInterpreterEntry ArmedCar CarMoveToObject +aiSettings.addInterpreterEntry ArmedCar Trigger +aiSettings.addInterpreterEntry ArmedCar TriggerContinously +aiSettings.addInterpreterEntry ArmedCar MouseTurretAimAt +aiSettings.addInterpreterEntry ArmedCar MouseTurretLookAt +aiSettings.addInterpreterEntry ArmedCar Sense +aiSettings.activateDefaultInterpreter ArmedCar BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTParallel Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTSerial Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTIf Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTWait Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTWhile Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTIdle Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTDebug Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTDebug Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern ArmedCar Turret + +rem ***-------------------- + +aisettings.setVehicleMods ManDown UnitWeights +aiSettings.setVehicleBehaviour ManDown Idle BBIdle BBPIdle2d 2 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour ManDown Idle +aiSettings.addInterpreterEntry ManDown Trigger +aiSettings.addInterpreterEntry ManDown InfanteryResetControls +aiSettings.activateDefaultInterpreter ManDown BAPSTWhile Full +aiSettings.activateDefaultInterpreter ManDown BAPSTParallel Full +aiSettings.activateDefaultInterpreter ManDown BAPSTSerial Full +aiSettings.activateDefaultInterpreter ManDown BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter ManDown BAPSTDebug Full +aiSettings.activateDefaultInterpreter ManDown BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter ManDown BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter ManDown BAPSTSoldierPose Full +aiSettings.activateDefaultInterpreter ManDown BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter ManDown BAPSTLookAtWrapper Full + +aiSettings.addSensingAgentPattern ManDown Null + +rem *** ParatrooperFixed Behaviour setup *** +aisettings.setVehicleMods ParatrooperFixed StandardWeights +aiSettings.setVehicleBehaviour ParatrooperFixed Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ParatrooperFixed Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour ParatrooperFixed MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ParatrooperFixed Change BBChangeLandingCraft BBPChange 6 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour ParatrooperFixed Idle +aiSettings.addInterpreterEntry ParatrooperFixed InfoWrapper +aiSettings.addInterpreterEntry ParatrooperFixed Trigger +aiSettings.addInterpreterEntry ParatrooperFixed TriggerContinously +aiSettings.addInterpreterEntry ParatrooperFixed MouseTurretAimAt +aiSettings.addInterpreterEntry ParatrooperFixed MouseTurretLookAt +aiSettings.addInterpreterEntry ParatrooperFixed Sense +aiSettings.addInterpreterEntry ParatrooperFixed InfanteryResetControls +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTParallel Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTSerial Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTIf Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTWait Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTWhile Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTIdle Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTDebug Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern ParatrooperFixed Turret +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTLookAtWrapper Full \ No newline at end of file diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-helper b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-helper new file mode 100755 index 0000000..8d4c00d --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-helper @@ -0,0 +1,412 @@ +#!/bin/sh +set -eu + +usage() { + echo "esai-helper: Get and apply ESAI strategies.ai in levels//server.zip" + echo "Options:" + echo " -d|--dir BF2 server installation directory. Defaults to '/server/bf2'" + echo " -m|--mod Mod. E.g. 'bf2' or 'xpack'. Defaults to 'bf2'" + echo "Commands:" + echo " get [subcommand]" + echo " gamemodes Get all available levels' gamemodes" + echo " maplist Generate a maplist" + echo " level-strategies Get a level's server.zip's ESAI strategies" + echo " If if omitted, all levels' strategies are shown" + echo " level-strategiescontent Get file content of level's server.zip's ESAI strategies" + echo " If if omitted, all levels' strategies are shown" + echo " levels Get all available levels" + echo " mods Get all available mods" + echo " strategies Get all available ESAI strategies" + echo " apply|delete [subcommand]" + echo " default-strategy Apply a default ESAI strategy for all levels." + echo " This is the default strategy if a level-strategy is not found for a level" + echo " level-strategy Apply the specified ESAI strategy to a specified gamemode" + echo " of a specified level's server.zip" + echo " -f|--file Apply ESAI strategies based on a space-delimited file" + echo " Format per line: " + echo " Use '#' for comments" + echo "Examples:" + echo " esai-helper -m bf2 get gamemodes" + echo " esai-helper -m xpack get gamemodes" + echo " esai-helper -m bf2 get maplist" + echo " esai-helper -m bf2 get level-strategies" + echo " esai-helper -m bf2 get level-strategiescontent" + echo " esai-helper -m bf2 get levels" + echo " esai-helper -m bf2 get mods" + echo " esai-helper -m bf2 get strategies" + echo " esai-helper -m bf2 apply default-strategy mediumfca" + echo " esai-helper -m bf2 apply level-strategy highway_tampa gpm_cq 32 mediumfca" + echo " esai-helper -m bf2 apply -f strategies.txt" + echo " esai-helper -m bf2 delete default-strategy mediumfca" + echo " esai-helper -m bf2 delete level-strategy highway_tampa gpm_cq 32 mediumfca" + echo " esai-helper -m bf2 delete -f strategies.txt" +} +# Exit if we got no options +if [ $# -eq 0 ]; then usage; exit 1; fi + +# Get some options +while test $# -gt 0; do + case "$1" in + help|-h|--help) + usage + exit 0 + ;; + -d|--dir) + shift + if test $# -gt 0; then + DIR="$1" + shift + fi + ;; + -m|--mod) + shift + if test $# -gt 0; then + MOD="$1" + shift + fi + ;; + get) + shift + if [ $# = 0 ]; then + echo "Missing subcommand" + usage + exit 1 + fi + case "$1" in + gamemodes) + GET_GAMEMODES=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + break + ;; + maplist) + GET_MAPLIST=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + ;; + level-strategies) + GET_LEVEL_STRATEGIES=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + ;; + level-strategiescontent) + GET_LEVEL_STRATEGIESCONTENT=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + ;; + levels) + GET_LEVELS=1 + shift + ;; + mods) + GET_MODS=1 + shift + ;; + strategies) + GET_STRATEGIES=1 + shift + ;; + esac + ;; + apply|delete) + SUBCOMMAND="$1" + shift + if [ "$#" = 0 ]; then + echo "Missing options or arguments" + usage + exit 1 + fi + case "$1" in + default-strategy) + if [ "$SUBCOMMAND" = 'apply' ]; then + APPLY_DEFAULT_STRATEGY=1 + else + DELETE_DEFAULT_STRATEGY=1 + fi + shift + STRATEGY="${1:-}" + if [ -z "$STRATEGY" ]; then + echo "Please specify an ESAI strategy an argument. E.g. mediumfcapb" + exit 1 + fi + shift + ;; + level-strategy) + if [ "$SUBCOMMAND" = 'apply' ]; then + APPLY_LEVEL_STRATEGY=1 + else + DELETE_LEVEL_STRATEGY=1 + fi + shift + LEVEL="${1:-}" + if [ -z "$LEVEL" ]; then + echo "Please specify a level as the first argument. E.g. dalian_plant" + exit 1 + fi + shift + GAMEMODE="${1:-}" + if [ -z "$GAMEMODE" ]; then + echo "Please specify a gamemode as the second argument. E.g. gpm_coop" + exit 1 + fi + shift + SIZE="${1:-}" + if [ -z "$SIZE" ]; then + echo "Please specify a map size as the third argument. E.g. 16" + exit 1 + fi + shift + STRATEGY="${1:-}" + if [ -z "$STRATEGY" ]; then + echo "Please specify an ESAI strategy as the fourth argument. E.g. mediumfcapb" + exit 1 + fi + shift + ;; + -f|--file) + if [ "$SUBCOMMAND" = 'apply' ]; then + APPLY_FILE=1 + else + DELETE_FILE=1 + fi + shift + if [ "$#" -gt 0 ]; then + FILE="$1" + shift + fi + ;; + *) + echo "Invalid option '$1'" 1>&2 + usage + exit 1 + ;; + esac + ;; + *) + echo "Invalid option '$1'" 1>&2 + usage + exit 1 + ;; + esac +done + +DIR=${DIR:-/server/bf2} +MOD=${MOD:-bf2} # Default mod is mods/bf2 +GET_GAMEMODES=${GET_GAMEMODES:-} +GET_MAPLIST=${GET_MAPLIST:-} +GET_LEVEL_STRATEGIES=${GET_LEVEL_STRATEGIES:-} +GET_LEVEL_STRATEGIESCONTENT=${GET_LEVEL_STRATEGIESCONTENT:-} +GET_LEVELS=${GET_LEVELS:-} +GET_MODS=${GET_MODS:-} +GET_STRATEGIES=${GET_STRATEGIES:-} +APPLY_DEFAULT_STRATEGY=${APPLY_DEFAULT_STRATEGY:-} +DELETE_DEFAULT_STRATEGY=${DELETE_DEFAULT_STRATEGY:-} +APPLY_LEVEL_STRATEGY=${APPLY_LEVEL_STRATEGY:-} +DELETE_LEVEL_STRATEGY=${DELETE_LEVEL_STRATEGY:-} +APPLY_FILE=${APPLY_FILE:-} +DELETE_FILE=${DELETE_FILE:-} +LEVEL=${LEVEL:-} +GAMEMODE=${GAMEMODE:-} +SIZE=${SIZE:-} +STRATEGY=${STRATEGY:-} + +# Validation +if ! cd "$DIR" 2>/dev/null; then + echo "No such directory: $DIR" + exit 1 +fi +DIR=$( cd "$DIR" && pwd ) +if [ ! -d "$DIR/mods/$MOD" ]; then + echo "Invalid mod. Mod directory does not exist: $DIR/mods/$MOD" + exit 1 +fi +if [ -n "$GET_GAMEMODES" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + for i in $( echo "$SERVER_ZIPS" | sort -n ); do + LEVEL=$( echo "$i" | xargs dirname | xargs basename ) + for j in $( unzip -l "$i" | awk '{print $4}' | grep -iE "gamemodes/[^/]+/[0-9]+/.+" | cut -d '/' -f2-3 | sort -n | uniq || true ); do + GAMEMODE=$( echo "$j" | cut -d '/' -f1 ) + SIZE=$( echo "$j" | cut -d '/' -f2 ) + echo "$LEVEL $GAMEMODE $SIZE" + done + done +fi + +if [ -n "$GET_MAPLIST" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + for i in $( echo "$SERVER_ZIPS" | sort -n ); do + LEVEL=$( echo "$i" | xargs dirname | xargs basename ) + for j in $( unzip -l "$i" | awk '{print $4}' | grep -iE "gamemodes/[^/]+/[0-9]+/.+" | cut -d '/' -f2-3 | sort -n | uniq || true ); do + GAMEMODE=$( echo "$j" | cut -d '/' -f1 ) + SIZE=$( echo "$j" | cut -d '/' -f2 ) + echo "maplist.append $LEVEL $GAMEMODE $SIZE" + done + done +fi + +if [ -n "$GET_MODS" ]; then + ls -1 "$DIR/mods" | sort -n +fi + +if [ -n "$GET_LEVELS" ]; then + ls -1 "$DIR/mods/$MOD/levels" | sort -n +fi + +if [ -n "$GET_LEVEL_STRATEGIES" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + for i in $SERVER_ZIPS; do + STRATEGIES_AI=$( unzip -l "$i" | grep -iE "gamemodes/[^/]+/[0-9]+/[^/]+/strategies.ai" | awk '{print $4}' | sort -n | uniq || true ) + if [ -n "$STRATEGIES_AI" ]; then + for s in $STRATEGIES_AI; do + echo "$i $s" + done + else + echo "No strategies found in: $i" >&2 + fi + done +fi + +if [ -n "$GET_LEVEL_STRATEGIESCONTENT" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + ERR= + for i in $SERVER_ZIPS; do + echo "Looking in: $i" >&2 + STRATEGIES_AI=$( unzip -l "$i" | grep -iE "gamemodes/[^/]+/[0-9]+/[^/]+/strategies.ai" | awk '{print $4}' | sort -n | uniq || true ) + if [ -n "$STRATEGIES_AI" ]; then + for s in $STRATEGIES_AI; do + echo "Content of $s in $i:" >&2 + unzip -p "$i" "$s" + done + else + echo "No strategies found in: $i" >&2 + ERR=1 + fi + done + if [ -n "$ERR" ]; then + exit 1 + fi +fi + +if [ -n "$GET_STRATEGIES" ]; then + cd "$DIR" + find . | grep -E "mods/$MOD/esai/mapfiles/[^/]+/[^/]+/strategies.ai" | cut -d '/' -f7 | sort -n +fi + +if [ -n "$APPLY_DEFAULT_STRATEGY" ]; then + # A trick not found in ESAI readmes + # The default ESAI strategy is used when there is no ESAI strategy for a particular level. + # According to Void, the original author of ESAI, it's easy to add the default ESAI strategy for all maps: + # 1. All except the last two lines of an ESAI strategy (i.e. mods/bf2/esai/mapfiles/*//strategies.ai) goes into aidefaultstrategies.ai + # 2. The last two lines go into aidefaultstrategiesadd.ai + STRATEGIES_AI=$( find "$DIR" | grep -E "mods/$MOD/esai/mapfiles/[^/]+/$STRATEGY/strategies.ai" | head -n1 || true ) + if [ -z "$STRATEGIES_AI" ]; then + echo "No such strategy: $STRATEGY" + echo "To get a list of available strategies, run:" + echo " esai-helper -m "$MOD" get strategies" + exit 1 + fi + CONTENT=$( cat "$STRATEGIES_AI" ) + LINE_COUNT=$( echo "$CONTENT" | wc -l ) + echo "Applying $STRATEGIES_AI to $DIR/mods/$MOD/ai/aidefaultstrategies.ai">&2 + echo "$CONTENT" | head -n $(( $LINE_COUNT - 2 )) > "$DIR/mods/$MOD/ai/aidefaultstrategies.ai" + echo "Applying $STRATEGIES_AI to $DIR/mods/$MOD/ai/aidefaultstrategiesadd.ai">&2 + echo "$CONTENT" | tail -n 2 > "$DIR/mods/$MOD/ai/aidefaultstrategiesadd.ai" +fi + +if [ -n "$DELETE_DEFAULT_STRATEGY" ]; then + echo "Deleting a default ESAI strategy is not supported. The server needs a default strategy." + exit 1 +fi + +if [ -n "$APPLY_LEVEL_STRATEGY" ] || [ -n "$DELETE_LEVEL_STRATEGY" ] || [ -n "$APPLY_FILE" ] || [ -n "$DELETE_FILE" ]; then + # Validation + if [ -n "$APPLY_LEVEL_STRATEGY" ] || [ -n "$DELETE_LEVEL_STRATEGY" ]; then + CONTENT="$LEVEL $GAMEMODE $SIZE $STRATEGY" + fi + if [ -n "$APPLY_FILE" ] || [ -n "$DELETE_FILE" ]; then + if [ ! -f "$FILE" ]; then + echo "No such file: $FILE" + exit 1 + fi + CONTENT=$( cat "$FILE" | grep -v '#' | awk NF || true ) # Remove lines starting with '#' or trailing with '# ...', as well as blank lines + if [ -z "$CONTENT" ]; then + echo "No ESAI strategies to apply in: $FILE" + exit 1 + fi + fi + echo "$CONTENT" | while read -r LEVEL GAMEMODE SIZE STRATEGY; do + SERVER_ZIP="$DIR/mods/$MOD/levels/$LEVEL/server.zip" + if ! unzip -l "$SERVER_ZIP" | grep -iE "gamemodes/$GAMEMODE/$SIZE/" > /dev/null; then + echo "The gamemode '$GAMEMODE' does not exist in $SERVER_ZIP at gamemodes/$GAMEMODE/$SIZE/" + echo "To get a list of available gamemodes, run:" + echo " esai-helper -m "$MOD" get gamemodes" + exit 1 + fi + STRATEGIES_AI=$( find "$DIR" | grep -E "mods/$MOD/esai/mapfiles/[^/]+/$STRATEGY/strategies.ai" | head -n1 || true ) + if [ -z "$STRATEGIES_AI" ]; then + echo "No such strategy: $STRATEGY" + echo "To get a list of available strategies, run:" + echo " esai-helper -m "$MOD" get strategies" + exit 1 + fi + done + + if [ -n "$APPLY_LEVEL_STRATEGY" ] || [ -n "$APPLY_FILE" ]; then + echo "$CONTENT" | while read -r LEVEL GAMEMODE SIZE STRATEGY; do + cd "$DIR/mods/$MOD/levels/$LEVEL" + SERVER_ZIP="$PWD/server.zip" + STRATEGIES_AI=$( find "$DIR" | grep -E "mods/$MOD/esai/mapfiles/[^/]+/$STRATEGY/strategies.ai" | head -n1 || true ) + STRATEGIES_AI_DESTINATION_IN_ZIP="gamemodes/$GAMEMODE/$SIZE/ai/strategies.ai" + echo "Applying strategy $STRATEGIES_AI to $SERVER_ZIP at $STRATEGIES_AI_DESTINATION_IN_ZIP" + mkdir -p "$( dirname "$STRATEGIES_AI_DESTINATION_IN_ZIP" )" # Same layout as content of server.zip + cp -f "$STRATEGIES_AI" "$STRATEGIES_AI_DESTINATION_IN_ZIP" + zip -qru server.zip gamemodes + rm -rf "$DIR/mods/$MOD/levels/$LEVEL/gamemodes" + done + fi + + if [ -n "$DELETE_LEVEL_STRATEGY" ] || [ -n "$DELETE_FILE" ]; then + echo "$CONTENT" | while read -r LEVEL GAMEMODE SIZE STRATEGY; do + cd "$DIR/mods/$MOD/levels/$LEVEL" + SERVER_ZIP="$PWD/server.zip" + EXISTING_STRATEGIES_AI=$( unzip -l "$SERVER_ZIP" | grep -iE "gamemodes/$GAMEMODE/$SIZE/ai/strategies.ai" | awk '{print $4}' || true ) + if [ -n "$EXISTING_STRATEGIES_AI" ]; then + for i in $EXISTING_STRATEGIES_AI; do + echo "Removing existing strategy $i from $SERVER_ZIP at $i" + zip -q -d "$SERVER_ZIP" "$i" + done + else + echo "No existing strategy in: $SERVER_ZIP" + exit 1 + fi + done + fi +fi diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt new file mode 100644 index 0000000..8207539 --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt @@ -0,0 +1,142 @@ +# This is a list of optimized ESAI strategies, based on 'Strategies-&-Navmesh-Credits.pdf' for BF2SP64 +# Format: +# Usage: +# 1. The following level-gamemode-strategy entries may be generated (with an empty field): +# esai-helper --mod bf2 get gamemodes +# 2. Edit field to your liking. To get all available strategies: +# esai-helper --mod bf2 get strategies +# 3. Apply these ESAI strategies: +# esai-helper --mod bf2 apply -f esai-optimized-strategies-bf2.txt +# 4. Remove these ESAI strategies: +# esai-helper --mod bf2 delete -f esai-optimized-strategies-bf2.txt +# NOTE: Commented out maps do not have an optimized ESAI strategy + +dalian_plant gpm_coop 16 smallmap +dalian_plant gpm_cq 16 smallmap +dalian_plant gpm_cq 32 smallmap +dalian_plant gpm_cq 64 largemap +dalian_plant sp1 16 smallmap +daqing_oilfields gpm_coop 16 smallmap +daqing_oilfields gpm_cq 16 smallmap +daqing_oilfields gpm_cq 32 mediummap +daqing_oilfields gpm_cq 64 largefcapf +daqing_oilfields sp1 16 smallmap +dragon_valley gpm_coop 16 smallmap +dragon_valley gpm_cq 16 smallmap +dragon_valley gpm_cq 32 mediumfcapfpb +dragon_valley gpm_cq 64 largefcapfpb +dragon_valley gpm_cq 128 largefcapfpb +dragon_valley gpm_sl 16 smallmap +dragon_valley gpm_sl 32 mediumfcapfpb +dragon_valley gpm_sl 64 largefcapfpb +dragon_valley gpm_sl 128 largefcapfpb +dragon_valley sp1 16 smallmap +dragon_valley sp1 32 mediumfcapfpb +dragon_valley sp1 64 largefcapfpb +dragon_valley sp1 128 largefcapfpb +dragon_valley sp2 16 smallmap +dragon_valley sp2 32 mediumfcapfpb +dragon_valley sp2 64 largefcapfpb +dragon_valley sp2 128 largefcapfpb +dragon_valley sp3 16 smallmap +dragon_valley sp3 32 mediumfcapfpb +dragon_valley sp3 64 largefcapfpb +dragon_valley sp3 128 largefcapfpb +fushe_pass gpm_coop 16 smallmap +fushe_pass gpm_cq 16 smallmap +fushe_pass gpm_cq 32 mediumpf +fushe_pass gpm_cq 64 largepf +fushe_pass sp1 16 smallmap +# greatwall gpm_coop 16 - +# greatwall gpm_cq 16 - +# greatwall gpm_cq 32 - +# greatwall sp1 16 - +# greatwall sp1 32 - +# greatwall sp1 64 - +gulf_of_oman gpm_coop 16 smallmap +gulf_of_oman gpm_cq 16 smallmap +gulf_of_oman gpm_cq 32 smallfca +gulf_of_oman gpm_cq 64 mediumfca +gulf_of_oman sp1 16 smallmap +highway_tampa gpm_cq 16 smallmap +highway_tampa gpm_cq 32 mediummap +highway_tampa gpm_cq 64 largemap +highway_tampa gpm_cq 128 largemap +highway_tampa gpm_cq 8 smallmap +highway_tampa gpm_sl 16 smallmap +highway_tampa gpm_sl 32 mediummap +highway_tampa gpm_sl 64 largemap +highway_tampa gpm_sl 128 largemap +highway_tampa sp1 16 smallmap +highway_tampa sp1 32 mediummap +highway_tampa sp1 64 largemap +highway_tampa sp1 128 largemap +highway_tampa sp2 16 smallmap +highway_tampa sp2 32 mediummap +highway_tampa sp2 64 largemap +highway_tampa sp2 128 largemap +highway_tampa sp3 16 smallmap +highway_tampa sp3 32 mediummap +highway_tampa sp3 64 largemap +highway_tampa sp3 128 largemap +kubra_dam gpm_cq 16 smallmap +kubra_dam gpm_cq 32 mediumpf +kubra_dam gpm_cq 64 largepf +kubra_dam sp1 16 smallmap +mashtuur_city gpm_cq 16 smallmap +mashtuur_city gpm_cq 32 smallmap +mashtuur_city gpm_cq 64 mediummap +# midnight_sun gpm_coop 16 - +# midnight_sun gpm_cq 16 - +# midnight_sun gpm_cq 32 - +# midnight_sun gpm_cq 64 - +# midnight_sun sp1 16 -` +# operation_blue_pearl gpm_cq 16 - +# operation_blue_pearl gpm_cq 32 - +# operation_blue_pearl gpm_cq 64 - +operation_clean_sweep gpm_coop 16 smallmap +operation_clean_sweep gpm_cq 16 smallmap +operation_clean_sweep gpm_cq 32 mediumfcapf +operation_clean_sweep gpm_cq 64 mediumfcapf +operation_clean_sweep sp1 16 smallmap +# operationharvest gpm_coop 16 - +# operationharvest gpm_cq 16 - +# operationharvest gpm_cq 32 - +# operationharvest gpm_cq 64 - +# operationharvest sp1 16 - +# operationroadrage gpm_coop 1 -6 +# operationroadrage gpm_cq 16 - +# operationroadrage gpm_cq 32 - +# operationroadrage gpm_cq 64 - +# operationroadrage sp1 16 - +# operationsmokescreen gpm_coop 16 - +# operationsmokescreen gpm_cq 16 - +# operationsmokescreen gpm_cq 32 - +# operationsmokescreen sp1 16 - +# operationsmokescreen sp1 32 - +road_to_jalalabad gpm_coop 16 smallmap +road_to_jalalabad gpm_cq 16 smallmap +road_to_jalalabad gpm_cq 32 mediumfcapf +road_to_jalalabad gpm_cq 64 mediumfcapf +road_to_jalalabad sp1 16 smallmap +sharqi_peninsula gpm_coop 16 smallmap +sharqi_peninsula gpm_cq 16 smallmap +sharqi_peninsula gpm_cq 32 mediumfcapf +sharqi_peninsula gpm_cq 64 mediumfcapf +sharqi_peninsula sp1 16 smallmap +songhua_stalemate gpm_coop 16 smallmap +songhua_stalemate gpm_cq 16 smallmap +songhua_stalemate gpm_cq 32 mediumfca +songhua_stalemate gpm_cq 64 largefca +songhua_stalemate sp1 16 smallmap +# taraba_quarry gpm_coop 16 - +# taraba_quarry gpm_cq 16 - +# taraba_quarry gpm_cq 32 - +# taraba_quarry sp1 16 - +# taraba_quarry sp1 32 - +wake_island_2007 gpm_cq 64 wake-island-64 +zatar_wetlands gpm_coop 16 smallmap +zatar_wetlands gpm_cq 16 smallmap +zatar_wetlands gpm_cq 32 mediumfca +zatar_wetlands gpm_cq 64 mediumfcapf +zatar_wetlands sp1 16 smallmap diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2all64.txt b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2all64.txt new file mode 100644 index 0000000..c7ae71f --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-bf2all64.txt @@ -0,0 +1,187 @@ +# This is a list of optimized ESAI strategies, based on 'Strategies-&-Navmesh-Credits.pdf' for BF2SP64 +# Format: +# Usage: +# 1. The following level-gamemode-strategy entries may be generated (with an empty field): +# esai-helper --mod bf2all64 get gamemodes +# 2. Edit field to your liking. To get all available strategies: +# esai-helper --mod bf2all64 get strategies +# 3. Apply these ESAI strategies: +# esai-helper --mod bf2all64 apply -f esai-optimized-strategies-bf2all64.txt +# 4. Remove these ESAI strategies: +# esai-helper --mod bf2all64 delete -f esai-optimized-strategies-bf2all64.txt +# NOTE: Commented out maps do not have an optimized ESAI strategy + +dalian_plant gpm_coop 16 smallmap +dalian_plant gpm_coop 32 smallmap +dalian_plant gpm_coop 64 largemap +dalian_plant gpm_cq 16 smallmap +dalian_plant gpm_cq 32 smallmap +dalian_plant gpm_cq 64 largemap +dalian_plant gpm_cq 128 largemap +dalian_plant sp1 16 smallmap +dalian_plant sp2 32 smallmap +dalian_plant sp3 64 largemap +daqing_oilfields gpm_coop 16 smallmap +daqing_oilfields gpm_coop 32 mediummap +daqing_oilfields gpm_coop 64 largefcapf +daqing_oilfields gpm_cq 16 smallmap +daqing_oilfields gpm_cq 32 mediummap +daqing_oilfields gpm_cq 64 largefcapf +daqing_oilfields sp1 16 smallmap +daqing_oilfields sp2 32 mediummap +daqing_oilfields sp3 64 largefcapf +dragon_valley gpm_coop 16 smallmap +dragon_valley gpm_coop 32 mediumfcapfpb +dragon_valley gpm_coop 64 largefcapfpb +dragon_valley gpm_cq 16 smallmap +dragon_valley gpm_cq 32 mediumfcapfpb +dragon_valley gpm_cq 64 largefcapfpb +dragon_valley gpm_cq 128 largefcapfpb +dragon_valley sp1 16 smallmap +dragon_valley sp2 32 mediumfcapfpb +dragon_valley sp3 64 largefcapfpb +fushe_pass gpm_coop 16 smallmap +fushe_pass gpm_coop 32 mediumpf +fushe_pass gpm_coop 64 largepf +fushe_pass gpm_cq 64 largepf +fushe_pass sp1 16 smallmap +fushe_pass sp2 32 mediumpf +fushe_pass sp3 64 largepf +# greatwall gpm_coop 16 - +# greatwall gpm_cq 16 - +# greatwall gpm_cq 32 - +# greatwall sp1 16 - +# greatwall sp1 32 - +# greatwall sp1 64 - +gulf_of_oman gpm_coop 16 smallmap +gulf_of_oman gpm_coop 32 smallfca +gulf_of_oman gpm_coop 64 mediumfca +gulf_of_oman gpm_cq 16 smallmap +gulf_of_oman gpm_cq 32 smallfca +gulf_of_oman gpm_cq 64 mediumfca +gulf_of_oman sp1 16 smallmap +gulf_of_oman sp2 32 smallfca +gulf_of_oman sp3 64 mediumfca +highway_tampa gpm_coop 16 smallmap +highway_tampa gpm_coop 32 mediummap +highway_tampa gpm_coop 64 largemap +highway_tampa gpm_cq 16 smallmap +highway_tampa gpm_cq 32 mediummap +highway_tampa gpm_cq 64 largemap +highway_tampa sp1 16 smallmap +highway_tampa sp2 32 mediummap +highway_tampa sp3 64 largemap +kubra_dam gpm_coop 16 smallmap +kubra_dam gpm_coop 32 mediumpf +kubra_dam gpm_coop 64 largepf +kubra_dam gpm_cq 16 smallmap +kubra_dam gpm_cq 32 mediumpf +kubra_dam gpm_cq 64 largepf +kubra_dam sp1 16 smallmap +kubra_dam sp2 32 mediumpf +kubra_dam sp3 64 largepf +mashtuur_city gpm_coop 16 smallmap +mashtuur_city gpm_coop 32 smallmap +mashtuur_city gpm_coop 64 mediummap +mashtuur_city gpm_cq 128 mediummap +mashtuur_city gpm_cq 16 smallmap +mashtuur_city gpm_cq 32 smallmap +mashtuur_city gpm_cq 64 mediummap +# midnight_sun gpm_coop 16 - +# midnight_sun gpm_coop 32 - +# midnight_sun gpm_coop 64 - +# midnight_sun gpm_cq 16 - +# midnight_sun gpm_cq 32 - +# midnight_sun gpm_cq 64 - +# midnight_sun sp1 16 - +# midnight_sun sp2 32 - +# midnight_sun sp3 64 - +operation_clean_sweep gpm_coop 16 smallmap +operation_clean_sweep gpm_coop 32 mediumfcapf +operation_clean_sweep gpm_coop 64 mediumfcapf +operation_clean_sweep gpm_cq 16 smallmap +operation_clean_sweep gpm_cq 32 mediumfcapf +operation_clean_sweep gpm_cq 64 mediumfcapf +operation_clean_sweep sp1 16 smallmap +operation_clean_sweep sp2 32 mediumfcapf +operation_clean_sweep sp3 64 mediumfcapf +# operationharvest gpm_coop 16 - +# operationharvest gpm_coop 32 - +# operationharvest gpm_coop 64 - +# operationharvest gpm_cq 16 - +# operationharvest gpm_cq 32 - +# operationharvest gpm_cq 64 - +# operationharvest gpm_sl 16 - +# operationharvest gpm_sl 32 - +# operationharvest gpm_sl 64 - +# operationharvest sp1 16 - +# operationharvest sp2 32 - +# operationharvest sp3 64 - +# operationroadrage gpm_coop 16 - +# operationroadrage gpm_coop 32 - +# operationroadrage gpm_coop 64 - +# operationroadrage gpm_cq 16 - +# operationroadrage gpm_cq 32 - +# operationroadrage gpm_cq 64 - +# operationroadrage sp1 16 - +# operationroadrage sp2 32 - +# operationroadrage sp3 64 - +# operationsmokescreen gpm_coop 16 - +# operationsmokescreen gpm_coop 32 - +# operationsmokescreen gpm_cq 16 - +# operationsmokescreen gpm_cq 32 - +# operationsmokescreen sp1 16 - +# operationsmokescreen sp1 32 - +# operationsmokescreen sp2 32 - +road_to_jalalabad gpm_coop 16 smallmap +road_to_jalalabad gpm_coop 32 mediumfcapf +road_to_jalalabad gpm_coop 64 mediumfcapf +road_to_jalalabad gpm_cq 16 smallmap +road_to_jalalabad gpm_cq 32 mediumfcapf +road_to_jalalabad gpm_cq 64 mediumfcapf +road_to_jalalabad sp1 16 smallmap +road_to_jalalabad sp2 32 mediumfcapf +road_to_jalalabad sp3 64 mediumfcapf +sharqi_peninsula gpm_coop 16 smallmap +sharqi_peninsula gpm_coop 32 mediumfcapf +sharqi_peninsula gpm_coop 64 mediumfcapf +sharqi_peninsula gpm_cq 128 mediumfcapf +sharqi_peninsula gpm_cq 16 smallmap +sharqi_peninsula gpm_cq 32 mediumfcapf +sharqi_peninsula gpm_cq 64 mediumfcapf +sharqi_peninsula sp1 16 smallmap +sharqi_peninsula sp2 32 mediumfcapf +sharqi_peninsula sp3 64 mediumfcapf +songhua_stalemate gpm_coop 16 smallmap +songhua_stalemate gpm_coop 32 mediumfcapf +songhua_stalemate gpm_coop 64 largefcapf +songhua_stalemate gpm_cq 16 smallmap +songhua_stalemate gpm_cq 32 mediumfca +songhua_stalemate gpm_cq 64 largefca +songhua_stalemate sp1 16 smallmap +songhua_stalemate sp2 32 mediumfca +songhua_stalemate sp3 64 largefca +# taraba_quarry gpm_coop 16 - +# taraba_quarry gpm_coop 32 - +# taraba_quarry gpm_cq 16 - +# taraba_quarry gpm_cq 32 - +# taraba_quarry sp1 16 - +# taraba_quarry sp2 32 - +wake_island_2007 gpm_coop 16 smallmap +wake_island_2007 gpm_coop 32 smallmap +wake_island_2007 gpm_coop 64 wake-island-64 +wake_island_2007 gpm_cq 16 smallmap +wake_island_2007 gpm_cq 32 smallmap +wake_island_2007 gpm_cq 64 wake-island-64 +wake_island_2007 sp1 16 smallmap +wake_island_2007 sp2 32 smallmap +wake_island_2007 sp3 64 wake-island-64 +zatar_wetlands gpm_coop 16 smallmap +zatar_wetlands gpm_coop 32 mediumfca +zatar_wetlands gpm_coop 64 mediumfcapf +zatar_wetlands gpm_cq 16 smallmap +zatar_wetlands gpm_cq 32 mediumfca +zatar_wetlands gpm_cq 64 mediumfcapf +zatar_wetlands sp1 16 smallmap +zatar_wetlands sp2 32 mediumfca +zatar_wetlands sp3 64 mediumfcapf diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt new file mode 100644 index 0000000..d0fffa6 --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt @@ -0,0 +1,42 @@ +# Format: +# 1. The following level-gamemode-strategy entries may be generated (with an empty field) using: +# esai-helper --mod xpack get gamemodes +# 2. Edit field to your liking. To get all available strategies: +# esai-helper --mod xpack get strategies +# 3. Then apply these ESAI strategies as part of container entrypoint: +# esai-helper --mod xpack apply -f esai-optimized-strategies-xpack.txt +# 4. To remove these ESAI strategies, simply: +# esai-helper --mod xpack delete -f esai-optimized-strategies-xpack.txt +# NOTE: Commented out maps do not have an optimized ESAI strategy + +# ghost_town gpm_coop 16 - +# ghost_town gpm_cq 16 - +# ghost_town gpm_cq 32 - +# ghost_town gpm_cq 64 - +# ghost_town sp1 16 - +# iron_gator gpm_cq 16 - +# iron_gator gpm_cq 32 - +# iron_gator gpm_cq 64 - +# leviathan gpm_cq 16 - +# leviathan gpm_cq 32 - +# leviathan gpm_cq 64 - +# mass_destruction gpm_coop 16 - +# mass_destruction gpm_cq 16 - +# mass_destruction gpm_cq 32 - +# mass_destruction gpm_cq 64 - +# mass_destruction sp1 16 - +# night_flight gpm_coop 16 - +# night_flight gpm_cq 16 - +# night_flight gpm_cq 32 - +# night_flight gpm_cq 64 - +# night_flight sp1 16 - +# surge gpm_coop 16 - +# surge gpm_cq 16 - +# surge gpm_cq 32 - +# surge gpm_cq 64 - +# surge sp1 16 - +# warlord gpm_coop 16 - +# warlord gpm_cq 16 - +# warlord gpm_cq 32 - +# warlord gpm_cq 64 - +# warlord sp1 16 - diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/healthcheck b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/healthcheck new file mode 100755 index 0000000..5464f28 --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/healthcheck @@ -0,0 +1,24 @@ +#!/bin/bash +set -eu +usage() { + echo "healthcheck: Healthcheck a Battlefield 2 server" + echo "Usage: healthcheck " + echo "Examples:" + echo " ./healthcheck 127.0.0.1 29900" + echo " ./healthcheck bf2 29900" +} +if [ "${1:-}" = '-h' ] || [ "${1:-}" = '--help' ]; then + usage + exit 0 +fi +HOST=${1:-localhost} # Hostname +PORT=${2:-29900} # Gamespy port + +echo "Checking $HOST:$PORT" +RES=$( printf '\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01' | nc -w 1 -u "$HOST" "$PORT" ) +if [ -n "$RES" ]; then + echo "OK" +else + echo "Not OK" + exit 1 +fi diff --git a/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/lowercase-helper b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/lowercase-helper new file mode 100755 index 0000000..699a069 --- /dev/null +++ b/variants/v1.5.3153.0-bf2all64-bf2stats-2.7.2/lowercase-helper @@ -0,0 +1,70 @@ +#!/bin/sh +set -eu + +usage() { + echo "$0 The BF2 linux server requires all files to be in lowercase, except python files. See /readmes/readme-linux.txt" + echo " This script lowercases a given directory and all descendent folders" + echo "Examples:" + echo " $0 --dir /server/bf2/mods/bf2/ESAI" +} + +# Get some options +while test $# -gt 0; do + case "$1" in + -h|--help) + usage + exit 0 + ;; + -d|--dir) + shift + if test $# -gt 0; then + DIR="$1" + shift + fi + ;; + *) + echo "Invalid option '$1'" 1>&2 + usage + exit 1 + ;; + esac +done + +if [ -z "$DIR" ]; then + echo "Specify a directory as the first argument" + usage() + exit 1 +fi + +# Lowercase this directory +if basename "$DIR" | grep -E '[A-Z]' > /dev/null; then + DIR_LOWERCASED="$( dirname "$DIR" )/$( basename "$DIR" | tr '[:upper:]' '[:lower:]' )" + mv -v "$DIR" "$DIR_LOWERCASED" 2>&1 || true + DIR="$DIR_LOWERCASED" +fi + +# Lowercase descendent directories starting from the parent-most +i=1 +while true; do + DIRS=$( find "$DIR" -mindepth "$i" -maxdepth "$i" -type d | grep -E '[A-Z]' || true ) + if [ -z "$DIRS" ]; then + break + fi + echo "$DIRS" | while read -r d; do + mv -v "$d" "$( echo "$d" | tr '[:upper:]' '[:lower:]' )" + done + i=$(( $i + 1 )) +done + +# Lowercase descendent files starting from the parent-most +i=1 +while true; do + FILES=$( find "$DIR" -mindepth "$i" -maxdepth "$i" -type f | grep -E '[A-Z]' || true ) + if [ -z "$FILES" ]; then + break + fi + echo "$FILES" | while read -r f; do + mv -v "$f" "$( echo "$f" | tr '[:upper:]' '[:lower:]' )" + done + i=$(( $i + 1 )) +done diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/Dockerfile b/variants/v1.5.3153.0-bf2stats-2.7.2/Dockerfile new file mode 100644 index 0000000..976f5fc --- /dev/null +++ b/variants/v1.5.3153.0-bf2stats-2.7.2/Dockerfile @@ -0,0 +1,85 @@ +FROM ubuntu:16.04 as install +ARG TARGETPLATFORM=linux/amd64 +ARG BUILDPLATFORM=linux/amd64 +RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" + +# Install network utilities which can be useful for debugging issues +# Install unzip and zip for the sake of applying ESAI strategies in ./mods/*/levels/*/server.zip at './GameModes/[gpm_coop|gpm_cq|sp1|sp2|sp3]/[16|32|64]/AI/Strategies.ai' +RUN export DEBIAN_FRONTEND=noninteractive; \ + apt-get update; \ + apt-get install --no-install-recommends -y \ + ca-certificates \ + curl \ + conntrack dnsutils iproute2 netcat net-tools tcpdump \ + unzip zip \ + ; \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/*; + +# Install Battlefield 2 server +WORKDIR /root +COPY aibehaviours-fixlookatwrapper.ai /aibehaviours-fixlookatwrapper.ai +RUN set -eux; \ + curl -sSLO https://files.startersclan.com/ea/bf2/bf2-linuxded-1.5.3153.0-installer.tgz; \ + sha256sum bf2-linuxded-1.5.3153.0-installer.tgz | grep "^4d849218c1725e7bd6a7e7f164e27b036248f8ded2e30340dd0722c1dfffbab6 "; \ + tar -zxvf bf2-linuxded-1.5.3153.0-installer.tgz; \ + sh bf2-linuxded-1.5.3153.0-installer.sh --target /install --noexec --info; \ + sh bf2-linuxded-1.5.3153.0-installer.sh --target /install --noexec; \ + rm -v bf2-linuxded-1.5.3153.0-installer.sh; \ + rm -v bf2-linuxded-1.5.3153.0-installer.tgz; \ + cd /install; \ + mkdir -p /server; \ + # Show the licenses without a pager + cat /install/license.sh | sed 's/^more/cat/' > /install/license-fixed.sh; \ + # Agree to licenses + printf '\naccept\n\nyes\n/server\ny\n' | sh /install/license-fixed.sh; \ + find /server; \ + rm -rf /install; \ + # Apply the LookAtWrapper fix to prevent crashes when playing with bots + mv -v /server/bf2/mods/bf2/ai/aibehaviours.ai /server/bf2/mods/bf2/ai/aibehaviours.ai.original; \ + cp -v /aibehaviours-fixlookatwrapper.ai /server/bf2/mods/bf2/ai/aibehaviours.ai; \ + mv -v /server/bf2/mods/xpack/ai/aibehaviours.ai /server/bf2/mods/xpack/ai/aibehaviours.ai.original; \ + cp -v /aibehaviours-fixlookatwrapper.ai /server/bf2/mods/xpack/ai/aibehaviours.ai; \ + rm -v /aibehaviours-fixlookatwrapper.ai + +# Install bf2stats 2.7.2 +WORKDIR /root +RUN set -eux; \ + curl -sSLO https://github.com/startersclan/bf2stats/archive/refs/tags/2.7.2.tar.gz; \ + echo "96a9cd2c1283668e417f45ee14dec6307cbad9f310a81e2e8b5af95a871fef4f 2.7.2.tar.gz bee8933873b42fff26aff34de964d54f4f470e256be43de7ab30ad122788d605 2.7.2.tar.gz" | sha256sum -c -; \ + mkdir -p extract; \ + tar -C extract -zxvf 2.7.2.tar.gz; \ + rm -rf /server/bf2/python; \ + mv extract/bf2stats-2.7.2/src/python /server/bf2/python; \ + rm -fv 2.7.2.tar.gz; \ + rm -rf extract + +# Install ESAI in all mods +WORKDIR /root +COPY ESAI-Standard-v4.2.zip ESAI-Standard-v4.2.zip +COPY lowercase-helper /usr/local/bin/lowercase-helper +RUN set -eux; \ + sha256sum ESAI-Standard-v4.2.zip | grep '^ef4e5d0f1446b9a2ddb0b350f1334273681c0f64d9c38c506320db769b24499c '; \ + # Lowercase all files in ESAI folder + for i in $( ls /server/bf2/mods ); do \ + unzip ESAI-Standard-v4.2.zip -d /server/bf2/mods/$i; \ + lowercase-helper --dir "/server/bf2/mods/$i/ESAI"; \ + done; \ + # Lowercase ESAI mapfiles' content + for i in $( find /server/bf2/mods/*/esai/mapfiles -type f ); do \ + CONTENT=$( cat "$i" ); \ + echo "$CONTENT" | tr '[:upper:]' '[:lower:]' > "$i"; \ + done; + +# Install esai-helper and configs +COPY esai-helper /usr/local/bin/esai-helper +COPY esai-optimized-strategies-bf2.txt /esai-optimized-strategies-bf2.txt +COPY esai-optimized-strategies-xpack.txt /esai-optimized-strategies-xpack.txt + +COPY healthcheck /healthcheck + +# EXPOSE 16567/udp +# EXPOSE 29900/udp +# HEALTHCHECK CMD /healthcheck +WORKDIR /server/bf2 +CMD [ "./start.sh" ] diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/ESAI-Standard-v4.2.zip b/variants/v1.5.3153.0-bf2stats-2.7.2/ESAI-Standard-v4.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..4870ceea2e1f298cc68aaae1d1c933c4fb20f19b GIT binary patch literal 37801 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 literal 0 HcmV?d00001 diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai b/variants/v1.5.3153.0-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai new file mode 100644 index 0000000..61a95f0 --- /dev/null +++ b/variants/v1.5.3153.0-bf2stats-2.7.2/aibehaviours-fixlookatwrapper.ai @@ -0,0 +1,822 @@ +rem *** Set number of behaviours and id/name mappings *** +aiSettings.setMaxNumberOfBehaviours 13 + +aiSettings.setBehaviour 0 Avoid +aiSettings.setBehaviour 1 MoveTo +aiSettings.setBehaviour 2 Idle +aiSettings.setBehaviour 3 Fire +aiSettings.setBehaviour 4 TakeCover +aiSettings.setBehaviour 5 Change +aiSettings.setBehaviour 6 Special +aiSettings.setBehaviour 7 Revive +aiSettings.setBehaviour 8 c4 +aiSettings.setBehaviour 9 Special2 +aiSettings.setBehaviour 10 Special3 +aiSettings.setBehaviour 11 Random +aiSettings.setBehaviour 12 Triggerable + + +rem *** Set number of vehicles and id/name mappings *** +aiSettings.setVehicle Tank +aiSettings.setVehicle Plane +aiSettings.setVehicle Boat +aiSettings.setVehicle Infantery +aiSettings.setVehicle Fixed +aiSettings.setVehicle Car +aiSettings.setVehicle LandingCraft +aiSettings.setVehicle Passenger +aiSettings.setVehicle LandingCraftPassenger +aiSettings.setVehicle LandingCraftFixed +aiSettings.setVehicle Helicopter +aiSettings.setVehicle TransportHelicopter +aiSettings.setVehicle ArmedCar +aiSettings.setVehicle ManDown +aiSettings.setVehicle ParatrooperFixed + +aiSettings.setVehicleClusterMapping Tank Tank +aiSettings.setVehicleClusterMapping Boat LandingCraft +aiSettings.setVehicleClusterMapping Infantery Infantery +aiSettings.setVehicleClusterMapping Car Tank +rem aiSettings.setVehicleClusterMapping LandingCraft LandingCraft +aiSettings.setVehicleClusterMapping LandingCraft ArmedCar +aiSettings.setVehicleClusterMapping ArmedCar ArmedCar + + +rem *** Set Sensing Agent Patterns id/name mappings *** +aiSettings.setSensingAgentPatternName Turret +aiSettings.setSensingAgentPatternName MouseFreeLook +aiSettings.setSensingAgentPatternName Soldier +aiSettings.setSensingAgentPatternName Null +rem the null pattern +aiSettings.setSensingAgentNullPattern Null + + +aiSettings.setManDownEquipment ManDown + +rem *** IMPORTANT !!! ************************** +rem * NEVER ALLOW IDLE's urgency to become 0. * +rem * The AI will CRASH in that case. * +rem *** REMINDER ******************************* + +rem *** Construct unit weights *** +aiSettings.createBehaviourModifiers UnitWeights +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 1.0 +aiSettings.setBehaviourModifier Fire 1.0 +aiSettings.setBehaviourModifier Special 1.0 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct HeliMove weights *** +aiSettings.createBehaviourModifiers HeliMoveWeights +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 0.01 +aiSettings.setBehaviourModifier Fire 1.0 +aiSettings.setBehaviourModifier Special 1.0 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct standard weights *** +aiSettings.createBehaviourModifiers StandardWeights +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 0.1 +aiSettings.setBehaviourModifier Fire 7.5 +aiSettings.setBehaviourModifier Special 3.0 +aiSettings.setBehaviourModifier TakeCover 2.0 +aiSettings.setBehaviourModifier Change 1.9 +aiSettings.setBehaviourModifier Revive 3.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct plane weights *** +aiSettings.createBehaviourModifiers PlaneWeights +aiSettings.setBehaviourModifier Avoid 0.0 +aiSettings.setBehaviourModifier MoveTo 1.0 +aiSettings.setBehaviourModifier Idle 0.1 +aiSettings.setBehaviourModifier Fire 1.5 +aiSettings.setBehaviourModifier Special 1.0 +aiSettings.setBehaviourModifier TakeCover 0.0 +aiSettings.setBehaviourModifier Change 0.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct Avoid inhibitors *** +aiSettings.createBehaviourModifiers AvoidInhibit +aiSettings.setBehaviourModifier Avoid 1.0 +aiSettings.setBehaviourModifier MoveTo 0.3 +aiSettings.setBehaviourModifier Idle 1.0 +aiSettings.setBehaviourModifier Fire 1.0 +aiSettings.setBehaviourModifier Special 0.5 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Construct Change Inhibit *** +aiSettings.createBehaviourModifiers ChangeInhibit +aiSettings.setBehaviourModifier Avoid 0.8 +aiSettings.setBehaviourModifier MoveTo 0.0 +aiSettings.setBehaviourModifier Idle 0.01 +aiSettings.setBehaviourModifier Fire 0.75 +aiSettings.setBehaviourModifier Special 0.0 +aiSettings.setBehaviourModifier TakeCover 1.0 +aiSettings.setBehaviourModifier Change 1.0 +aiSettings.setBehaviourModifier Revive 1.0 +aiSettings.setBehaviourModifier c4 1.0 +aiSettings.setBehaviourModifier Special2 1.0 +aiSettings.setBehaviourModifier Special3 1.0 +aiSettings.setBehaviourModifier Random 1.0 +aiSettings.setBehaviourModifier Triggerable 1.0 + +rem *** Set basic weights for bot behaviour *** +aiSettings.setBasicBotWeights UnitWeights +aiSettings.setStandardPersonality UnitWeights 1 +aiSettings.setStandardPersonality UnitWeights 2 + +rem ************************* Vehicle behaviour setup ****************************** + +aiSettings.createUCConstant UCUnion 1.0 +aiSettings.createUCLinear UCFire -0.22 1.3 +aiSettings.createUCLinear UCCallForMedic 0.1 1 +aiSettings.createUCXInverse UCScout 2.5 0.9 1.0 0.5 + +rem *** Tank Behaviour setup *** +aisettings.setVehicleMods Tank StandardWeights +aiSettings.setVehicleMaterialCost Tank Ground 1 +aiSettings.setVehicleMaterialCost Tank Road 1 +aiSettings.setVehicleMaterialCost Tank Shallows 1.5 +aiSettings.setVehicleMaterialCost Tank DeepWater -1 +aiSettings.setVehicleBehaviour Tank Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Tank MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Tank Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Tank Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Tank Idle +aiSettings.addInterpreterEntry Tank MoveToMedium Medium +aiSettings.addInterpreterEntry Tank MoveToObjectMedium Medium +aiSettings.addInterpreterEntry Tank InfoWrapper +aiSettings.addInterpreterEntry Tank TankMoveTo +aiSettings.addInterpreterEntry Tank TankTurnTo +aiSettings.addInterpreterEntry Tank TankMoveToDirection +aiSettings.addInterpreterEntry Tank TankMoveToObject +aiSettings.addInterpreterEntry Tank Trigger +aiSettings.addInterpreterEntry Tank TriggerContinously +aiSettings.addInterpreterEntry Tank MouseTurretAimAt +aiSettings.addInterpreterEntry Tank TankResetControls +aiSettings.addInterpreterEntry Tank MouseTurretLookAt +aiSettings.addInterpreterEntry Tank Sense +aiSettings.activateDefaultInterpreter Tank BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter Tank BAPSTParallel Full +aiSettings.activateDefaultInterpreter Tank BAPSTSerial Full +aiSettings.activateDefaultInterpreter Tank BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Tank BAPSTIf Full +aiSettings.activateDefaultInterpreter Tank BAPSTWait Full +aiSettings.activateDefaultInterpreter Tank BAPSTWhile Full +aiSettings.activateDefaultInterpreter Tank BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Tank BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Tank BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Tank BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Tank BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Tank BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Tank BAPSTIdle Full +aiSettings.activateDefaultInterpreter Tank BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Tank BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Tank BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Tank BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Tank BAPSTDebug Full +aiSettings.activateDefaultInterpreter Tank BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Tank BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Tank BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern Tank Turret + +rem *** Plane Behaviour setup *** +aisettings.setVehicleMods Plane StandardWeights +aiSettings.setVehicleBehaviour Plane MoveTo BBMoveTo BBPGotoWaypoint3d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Plane Idle BBIdle BBPIdle3d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Plane Fire BBFire3d BBPFire3d 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Plane Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Plane Idle +aiSettings.addInterpreterEntry Plane InfoWrapper +aiSettings.addInterpreterEntry Plane PlaneMoveTo +aiSettings.addInterpreterEntry Plane PlaneMoveToDirection +aiSettings.addInterpreterEntry Plane PlaneMoveToObject +aiSettings.addInterpreterEntry Plane Trigger +aiSettings.addInterpreterEntry Plane TriggerContinously +aiSettings.addInterpreterEntry Plane PlaneAimAt +aiSettings.addInterpreterEntry Plane PlaneResetControls +aiSettings.addInterpreterEntry Plane Sense +aiSettings.activateDefaultInterpreter Plane BAPSTParallel Full +aiSettings.activateDefaultInterpreter Plane BAPSTSerial Full +aiSettings.activateDefaultInterpreter Plane BAPSTIf Full +aiSettings.activateDefaultInterpreter Plane BAPSTWait Full +aiSettings.activateDefaultInterpreter Plane BAPSTWhile Full +aiSettings.activateDefaultInterpreter Plane BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Plane BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Plane BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Plane BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Plane BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Plane BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Plane BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Plane BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Plane BAPSTIdle Full +aiSettings.activateDefaultInterpreter Plane BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Plane BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Plane BAPSTDebug Full +aiSettings.activateDefaultInterpreter Plane BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Plane BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter Plane BAPSTLookAtWrapper Full + +rem *** Boat Behaviour setup *** +aisettings.setVehicleMods Boat StandardWeights +aiSettings.setVehicleMaterialCost Boat Ground -1 +aiSettings.setVehicleMaterialCost Boat Road -1 +aiSettings.setVehicleMaterialCost Boat Shallows -1 +aiSettings.setVehicleMaterialCost Boat DeepWater 1 +aiSettings.setVehicleBehaviour Boat Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Boat MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Boat Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Boat Fire BBFireLargeBore BBPFire2d 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Boat Change BBChangeTeleport BBPChangeTeleport 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Boat Idle +aiSettings.addInterpreterEntry Boat InfoWrapper +aiSettings.addInterpreterEntry Boat BoatMoveTo +aiSettings.addInterpreterEntry Boat BoatMoveToDirection +aiSettings.addInterpreterEntry Boat BoatMoveToObject +aiSettings.addInterpreterEntry Boat Trigger +aiSettings.addInterpreterEntry Boat TriggerContinously +aiSettings.addInterpreterEntry Boat MouseTurretLookAt +aiSettings.addInterpreterEntry Boat MouseTurretAimAt +aiSettings.addInterpreterEntry Boat Sense +aiSettings.addInterpreterEntry Boat BoatResetControls +aiSettings.activateDefaultInterpreter Boat BAPSTParallel Full +aiSettings.activateDefaultInterpreter Boat BAPSTSerial Full +aiSettings.activateDefaultInterpreter Boat BAPSTIf Full +aiSettings.activateDefaultInterpreter Boat BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Boat BAPSTWait Full +aiSettings.activateDefaultInterpreter Boat BAPSTWhile Full +aiSettings.activateDefaultInterpreter Boat BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Boat BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Boat BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Boat BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Boat BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Boat BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Boat BAPSTIdle Full +aiSettings.activateDefaultInterpreter Boat BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Boat BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Boat BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Boat BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Boat BAPSTDebug Full +aiSettings.activateDefaultInterpreter Boat BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Boat BAPSTEvaluateCondition Full + +rem *** Infantery Behaviour setup *** +aisettings.setVehicleMods Infantery StandardWeights +aiSettings.setVehicleMaterialCost Infantery Ground 1 +aiSettings.setVehicleMaterialCost Infantery Road 1 +aiSettings.setVehicleMaterialCost Infantery Shallows 1.5 +aiSettings.setVehicleMaterialCost Infantery DeepWater 6 +aiSettings.setVehicleBehaviour Infantery Avoid BBAvoid BBPAvoidCollisionInfantery 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Infantery MoveTo BBMoveTo BBPGotoWaypointInfantery 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Idle BBIdle BBPIdleInfantery 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Infantery Special BBMedicAssist BBPMedicAssist 12 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery c4 BBC4 BBPC4 12 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Change BBChange BBPChange 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Revive BBRevive BBPRevive 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Random BBRandom BBPRandom 12 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Infantery Triggerable BBTriggerable BBPTriggerable 12 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Infantery Idle +aiSettings.addInterpreterEntry Infantery MoveToMediumSoldier Medium +aiSettings.addInterpreterEntry Infantery MoveToObjectMediumSoldier Medium +aiSettings.addInterpreterEntry Infantery InfoWrapper +aiSettings.addInterpreterEntry Infantery InfanteryMoveTo +aiSettings.addInterpreterEntry Infantery InfanteryMoveToDirection +aiSettings.addInterpreterEntry Infantery InfanteryMoveToObject +aiSettings.addInterpreterEntry Infantery Trigger +aiSettings.addInterpreterEntry Infantery TriggerContinously +aiSettings.addInterpreterEntry Infantery MouseTurretAimAt +aiSettings.addInterpreterEntry Infantery InfanteryResetControls +aiSettings.addInterpreterEntry Infantery MouseTurretLookAt +aiSettings.addInterpreterEntry Infantery Sense +aiSettings.addInterpreterEntry Infantery SoldierPose +aiSettings.activateDefaultInterpreter Infantery BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter Infantery BAPSTPlaceC4 Full +aiSettings.activateDefaultInterpreter Infantery BAPSTParallel Full +aiSettings.activateDefaultInterpreter Infantery BAPSTSerial Full +aiSettings.activateDefaultInterpreter Infantery BAPSTIf Full +aiSettings.activateDefaultInterpreter Infantery BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Infantery BAPSTWait Full +aiSettings.activateDefaultInterpreter Infantery BAPSTWhile Full +aiSettings.activateDefaultInterpreter Infantery BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Infantery BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Infantery BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Infantery BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Infantery BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Infantery BAPSTIdle Full +aiSettings.activateDefaultInterpreter Infantery BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Infantery BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Infantery BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Infantery BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Infantery BAPSTDebug Full +aiSettings.activateDefaultInterpreter Infantery BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Infantery BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluateCondition Full +aiSettings.activateDefaultInterpreter Infantery BAPSTRevive Full +aiSettings.addSensingAgentPattern Infantery Soldier + + + +rem *** Fixed Behaviour setup *** +aisettings.setVehicleMods Fixed StandardWeights +aiSettings.setVehicleBehaviour Fixed Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour Fixed MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Change BBChange BBPChange 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Fixed Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Fixed Idle +aiSettings.addInterpreterEntry Fixed InfoWrapper +aiSettings.addInterpreterEntry Fixed Trigger +aiSettings.addInterpreterEntry Fixed TriggerContinously +aiSettings.addInterpreterEntry Fixed MouseTurretAimAt +aiSettings.addInterpreterEntry Fixed MouseTurretLookAt +aiSettings.addInterpreterEntry Fixed Sense +aiSettings.addInterpreterEntry Fixed InfanteryResetControls +aiSettings.activateDefaultInterpreter Fixed BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter Fixed BAPSTParallel Full +aiSettings.activateDefaultInterpreter Fixed BAPSTSerial Full +aiSettings.activateDefaultInterpreter Fixed BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Fixed BAPSTIf Full +aiSettings.activateDefaultInterpreter Fixed BAPSTWait Full +aiSettings.activateDefaultInterpreter Fixed BAPSTWhile Full +aiSettings.activateDefaultInterpreter Fixed BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Fixed BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Fixed BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Fixed BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Fixed BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Fixed BAPSTNotifyBot Full + +aiSettings.activateDefaultInterpreter Fixed BAPSTIdle Full +aiSettings.activateDefaultInterpreter Fixed BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Fixed BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Fixed BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Fixed BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter Fixed BAPSTDebug Full +aiSettings.activateDefaultInterpreter Fixed BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Fixed BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern Fixed Turret + +rem *** Car Behaviour setup *** +aiSettings.setVehicleMaterialCost Car Ground 1 +aiSettings.setVehicleMaterialCost Car Road 1 +aiSettings.setVehicleMaterialCost Car Shallows 1.8 +aiSettings.setVehicleMaterialCost Car DeepWater -1 + +aisettings.setVehicleMods Car StandardWeights +aiSettings.setVehicleBehaviour Car Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour Car MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Change BBChange BBPChange 2 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Fire BBFireUnarmed BBPFireDriveAttack 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Special BBRunOverSoldier BBPRunOverSoldier 6 UCUnion UnitWeights + +aiSettings.setVehicleBehaviour Car Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Car Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Car Idle + +aiSettings.addInterpreterEntry Car CarResetControls +aiSettings.addInterpreterEntry Car MoveToMedium Medium +aiSettings.addInterpreterEntry Car MoveToObjectMedium Medium +aiSettings.addInterpreterEntry Car InfoWrapper +aiSettings.addInterpreterEntry Car CarMoveTo +aiSettings.addInterpreterEntry Car CarMoveToDirection +aiSettings.addInterpreterEntry Car CarMoveToObject +aiSettings.addInterpreterEntry Car Trigger +aiSettings.addInterpreterEntry Car TriggerContinously +aiSettings.addInterpreterEntry Car MouseTurretAimAt +aiSettings.addInterpreterEntry Car MouseTurretLookAt +aiSettings.addInterpreterEntry Car Sense +aiSettings.activateDefaultInterpreter Car BAPSTParallel Full +aiSettings.activateDefaultInterpreter Car BAPSTSerial Full +aiSettings.activateDefaultInterpreter Car BAPSTIf Full +aiSettings.activateDefaultInterpreter Car BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Car BAPSTWait Full +aiSettings.activateDefaultInterpreter Car BAPSTWhile Full +aiSettings.activateDefaultInterpreter Car BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter Car BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Car BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Car BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Car BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Car BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Car BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Car BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Car BAPSTIdle Full +aiSettings.activateDefaultInterpreter Car BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Car BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Car BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Car BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter Car BAPSTDebug Full +aiSettings.activateDefaultInterpreter Car BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Car BAPSTRunOverObject Full +aiSettings.activateDefaultInterpreter Car BAPSTHonkHorn Full +aiSettings.activateDefaultInterpreter Car BAPSTEvaluateCondition Full + +rem *** LandingCraft Behaviour setup *** +aisettings.setVehicleMods LandingCraft StandardWeights +aiSettings.setVehicleMaterialCost LandingCraft Ground 10 +aiSettings.setVehicleMaterialCost LandingCraft Road 10 +aiSettings.setVehicleMaterialCost LandingCraft Shallows 2 +aiSettings.setVehicleMaterialCost LandingCraft DeepWater 1 +aiSettings.setVehicleBehaviour LandingCraft Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour LandingCraft MoveTo BBMoveTo BBPGotoWaypointBoat 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraft Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraft Fire BBFireUnarmed UnRelated 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraft Change BBChangeLandingCraft BBPChangeLandingCraft 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour LandingCraft Idle +aiSettings.addInterpreterEntry LandingCraft MoveToMediumBoat Medium +aiSettings.addInterpreterEntry LandingCraft MoveToObjectMediumBoat Medium +aiSettings.addInterpreterEntry LandingCraft CarMoveTo +aiSettings.addInterpreterEntry LandingCraft CarMoveToDirection +aiSettings.addInterpreterEntry LandingCraft CarMoveToObject +aiSettings.addInterpreterEntry LandingCraft Trigger +aiSettings.addInterpreterEntry LandingCraft TriggerContinously +aiSettings.addInterpreterEntry LandingCraft MouseTurretLookAt +aiSettings.addInterpreterEntry LandingCraft BoatResetControls +aiSettings.addInterpreterEntry LandingCraft Sense +aiSettings.activateDefaultInterpreter LandingCraft BAPSTParallel Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTSerial Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTIf Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTWait Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTWhile Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTIdle Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTPhysicsEnable Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTDebug Full +aiSettings.activateDefaultInterpreter LandingCraft BAPSTUseFlareOnMissileLock Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter LandingCraft BAPSTLookAtWrapper Full +aiSettings.addSensingAgentPattern LandingCraft Turret + + +rem *** Passenger Behaviour setup *** +aisettings.setVehicleMods Passenger StandardWeights +aiSettings.setVehicleBehaviour Passenger Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Fire BBFireUnarmed UnRelated 6 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleBehaviour Passenger MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour Passenger Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour Passenger Idle +aiSettings.addInterpreterEntry Passenger Trigger +aiSettings.addInterpreterEntry Passenger TriggerContinously +aiSettings.addInterpreterEntry Passenger MouseTurretLookAt +aiSettings.addInterpreterEntry Passenger InfanteryResetControls +aiSettings.addInterpreterEntry Passenger Sense +aiSettings.activateDefaultInterpreter Passenger BAPSTParallel Full +aiSettings.activateDefaultInterpreter Passenger BAPSTSerial Full +aiSettings.activateDefaultInterpreter Passenger BAPSTIf Full +aiSettings.activateDefaultInterpreter Passenger BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter Passenger BAPSTWait Full +aiSettings.activateDefaultInterpreter Passenger BAPSTWhile Full +aiSettings.activateDefaultInterpreter Passenger BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter Passenger BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Passenger BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Passenger BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Passenger BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Passenger BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Passenger BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Passenger BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Passenger BAPSTIdle Full +aiSettings.activateDefaultInterpreter Passenger BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Passenger BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter Passenger BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Passenger BAPSTDebug Full +aiSettings.activateDefaultInterpreter Passenger BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Passenger BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter Passenger BAPSTLookAtWrapper Full +aiSettings.addSensingAgentPattern Passenger Turret + +rem *** Passenger Behaviour setup *** +aisettings.setVehicleMods LandingCraftPassenger StandardWeights +aiSettings.setVehicleBehaviour LandingCraftPassenger Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraftPassenger Fire BBFireUnarmed UnRelated 6 UCScout UnitWeights +aiSettings.setVehicleBehaviour LandingCraftPassenger Change BBChangeLandingCraft BBPChangeLandingCraft 6 UCUnion ChangeInhibit +aiSettings.setVehicleBehaviour LandingCraftPassenger MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour LandingCraftPassenger Idle +aiSettings.addInterpreterEntry LandingCraftPassenger Trigger +aiSettings.addInterpreterEntry LandingCraftPassenger TriggerContinously +aiSettings.addInterpreterEntry LandingCraftPassenger MouseTurretLookAt +aiSettings.addInterpreterEntry LandingCraftPassenger InfanteryResetControls +aiSettings.addInterpreterEntry LandingCraftPassenger Sense +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTParallel Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTSerial Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTIf Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTWait Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTWhile Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTIdle Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTDebug Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter LandingCraftPassenger BAPSTLookAtWrapper Full + +rem *** LandingCraftFixed Behaviour setup *** +aisettings.setVehicleMods LandingCraftFixed StandardWeights +aiSettings.setVehicleBehaviour LandingCraftFixed Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraftFixed Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour LandingCraftFixed MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour LandingCraftFixed Change BBChangeLandingCraft BBPChangeLandingCraft 6 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour LandingCraftFixed Idle +aiSettings.addInterpreterEntry LandingCraftFixed InfoWrapper +aiSettings.addInterpreterEntry LandingCraftFixed Trigger +aiSettings.addInterpreterEntry LandingCraftFixed TriggerContinously +aiSettings.addInterpreterEntry LandingCraftFixed MouseTurretAimAt +aiSettings.addInterpreterEntry LandingCraftFixed MouseTurretLookAt +aiSettings.addInterpreterEntry LandingCraftFixed Sense +aiSettings.addInterpreterEntry LandingCraftFixed InfanteryResetControls +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTParallel Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTSerial Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTIf Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTWait Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTWhile Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTIdle Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTDebug Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter LandingCraftFixed BAPSTLookAtWrapper Full +aiSettings.addSensingAgentPattern LandingCraftFixed Turret + +rem ***** HeliBehaviour setup *** +aisettings.setVehicleMods Helicopter StandardWeights +aiSettings.setVehicleBehaviour Helicopter MoveTo BBMoveTo BBPGotoWaypoint3d 4 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour Helicopter Idle BBIdle BBPIdle3d 5 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour Helicopter Fire BBFire3d BBPHeliFire3d 4 UCFire HeliMoveWeights +aiSettings.setVehicleBehaviour Helicopter Change BBChange BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour Helicopter Idle + +aiSettings.addInterpreterEntry Helicopter InfoWrapper +aiSettings.addInterpreterEntry Helicopter HeliMoveTo +aiSettings.addInterpreterEntry Helicopter HeliMoveToDirection +aiSettings.addInterpreterEntry Helicopter HeliMoveToObject +aiSettings.addInterpreterEntry Helicopter HeliMoveAwayFromObject +aiSettings.addInterpreterEntry Helicopter Trigger +aiSettings.addInterpreterEntry Helicopter TriggerContinously +aiSettings.addInterpreterEntry Helicopter HeliAimAt +aiSettings.addInterpreterEntry Helicopter HeliResetControls +aiSettings.addInterpreterEntry Helicopter Sense +aiSettings.activateDefaultInterpreter Helicopter BAPSTParallel Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTSerial Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTIf Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTWait Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTWhile Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTIdle Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTDebug Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter Helicopter BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter Helicopter BAPSTLookAtWrapper Full + + +rem ***** TransportHelicopterBehaviour setup *** +aisettings.setVehicleMods TransportHelicopter StandardWeights +aiSettings.setVehicleBehaviour TransportHelicopter MoveTo BBMoveTo BBPGotoWaypoint3d 4 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour TransportHelicopter Idle BBIdle BBPIdle3d 5 UCUnion HeliMoveWeights +aiSettings.setVehicleBehaviour TransportHelicopter Change BBChangeLandingCraft BBPChange 6 UCUnion ChangeInhibit +aiSettings.setVehicleDefaultBehaviour TransportHelicopter Idle + +aiSettings.addInterpreterEntry TransportHelicopter InfoWrapper +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveTo +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveToDirection +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveToObject +aiSettings.addInterpreterEntry TransportHelicopter HeliMoveAwayFromObject +aiSettings.addInterpreterEntry TransportHelicopter Trigger +aiSettings.addInterpreterEntry TransportHelicopter TriggerContinously +aiSettings.addInterpreterEntry TransportHelicopter HeliAimAt +aiSettings.addInterpreterEntry TransportHelicopter HeliResetControls +aiSettings.addInterpreterEntry TransportHelicopter Sense +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTParallel Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTSerial Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTIf Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTWait Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTWhile Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTIdle Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTDebug Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter TransportHelicopter BAPSTLookAtWrapper Full + +rem **-------- Armed Car ----------------------- + +aisettings.setVehicleMods ArmedCar StandardWeights +aiSettings.setVehicleMaterialCost ArmedCar Ground 1 +aiSettings.setVehicleMaterialCost ArmedCar Road 1 +aiSettings.setVehicleMaterialCost ArmedCar Shallows 1 +aiSettings.setVehicleMaterialCost ArmedCar DeepWater 2 +aiSettings.setVehicleBehaviour ArmedCar Avoid BBAvoid BBPAvoidCollision2d 1 UCUnion AvoidInhibit +aiSettings.setVehicleBehaviour ArmedCar MoveTo BBMoveTo BBPGotoWaypoint2d 4 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Change BBChange BBPChange 2 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ArmedCar Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour ArmedCar Idle +aiSettings.addInterpreterEntry ArmedCar CarResetControls +aiSettings.addInterpreterEntry ArmedCar MoveToMedium Medium +aiSettings.addInterpreterEntry ArmedCar MoveToObjectMedium Medium +aiSettings.addInterpreterEntry ArmedCar InfoWrapper +aiSettings.addInterpreterEntry ArmedCar CarMoveTo +aiSettings.addInterpreterEntry ArmedCar CarMoveToDirection +aiSettings.addInterpreterEntry ArmedCar CarMoveToObject +aiSettings.addInterpreterEntry ArmedCar Trigger +aiSettings.addInterpreterEntry ArmedCar TriggerContinously +aiSettings.addInterpreterEntry ArmedCar MouseTurretAimAt +aiSettings.addInterpreterEntry ArmedCar MouseTurretLookAt +aiSettings.addInterpreterEntry ArmedCar Sense +aiSettings.activateDefaultInterpreter ArmedCar BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTParallel Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTSerial Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTIf Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTWait Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTWhile Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTIdle Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTMergeSoldierInputs Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTDebug Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTLookAtWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTDebug Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTForgetTarget Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter ArmedCar BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern ArmedCar Turret + +rem ***-------------------- + +aisettings.setVehicleMods ManDown UnitWeights +aiSettings.setVehicleBehaviour ManDown Idle BBIdle BBPIdle2d 2 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour ManDown Idle +aiSettings.addInterpreterEntry ManDown Trigger +aiSettings.addInterpreterEntry ManDown InfanteryResetControls +aiSettings.activateDefaultInterpreter ManDown BAPSTWhile Full +aiSettings.activateDefaultInterpreter ManDown BAPSTParallel Full +aiSettings.activateDefaultInterpreter ManDown BAPSTSerial Full +aiSettings.activateDefaultInterpreter ManDown BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter ManDown BAPSTDebug Full +aiSettings.activateDefaultInterpreter ManDown BAPSTInfoWrapper Full +aiSettings.activateDefaultInterpreter ManDown BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter ManDown BAPSTSoldierPose Full +aiSettings.activateDefaultInterpreter ManDown BAPSTEvaluateCondition Full +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter ManDown BAPSTLookAtWrapper Full + +aiSettings.addSensingAgentPattern ManDown Null + +rem *** ParatrooperFixed Behaviour setup *** +aisettings.setVehicleMods ParatrooperFixed StandardWeights +aiSettings.setVehicleBehaviour ParatrooperFixed Idle BBIdle BBPIdle2d 5 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ParatrooperFixed Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights +aiSettings.setVehicleBehaviour ParatrooperFixed MoveTo BBMoveToFixed UnRelated 8 UCUnion UnitWeights +aiSettings.setVehicleBehaviour ParatrooperFixed Change BBChangeLandingCraft BBPChange 6 UCUnion UnitWeights +aiSettings.setVehicleDefaultBehaviour ParatrooperFixed Idle +aiSettings.addInterpreterEntry ParatrooperFixed InfoWrapper +aiSettings.addInterpreterEntry ParatrooperFixed Trigger +aiSettings.addInterpreterEntry ParatrooperFixed TriggerContinously +aiSettings.addInterpreterEntry ParatrooperFixed MouseTurretAimAt +aiSettings.addInterpreterEntry ParatrooperFixed MouseTurretLookAt +aiSettings.addInterpreterEntry ParatrooperFixed Sense +aiSettings.addInterpreterEntry ParatrooperFixed InfanteryResetControls +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTOverrideSensingAgent Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTParallel Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTSerial Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTIf Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTPlanEnd Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTWait Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTWhile Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTWeaponWrapper Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTAimingWrapper Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTFinishedWrapper Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTUpdateVehicle Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTChangeWeapon Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTICTurnLock Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTICChangeVehicle Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTEvaluate Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTNotifyBot Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTIdle Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTSetSensingAgentFocus Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTSendRadioMessage Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTDebug Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTUseFlareOnMissileLock Full +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTEvaluateCondition Full +aiSettings.addSensingAgentPattern ParatrooperFixed Turret +rem http://www.bfeditor.org/forums/?showtopic=13499 +aiSettings.activateDefaultInterpreter ParatrooperFixed BAPSTLookAtWrapper Full \ No newline at end of file diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/esai-helper b/variants/v1.5.3153.0-bf2stats-2.7.2/esai-helper new file mode 100755 index 0000000..8d4c00d --- /dev/null +++ b/variants/v1.5.3153.0-bf2stats-2.7.2/esai-helper @@ -0,0 +1,412 @@ +#!/bin/sh +set -eu + +usage() { + echo "esai-helper: Get and apply ESAI strategies.ai in levels//server.zip" + echo "Options:" + echo " -d|--dir BF2 server installation directory. Defaults to '/server/bf2'" + echo " -m|--mod Mod. E.g. 'bf2' or 'xpack'. Defaults to 'bf2'" + echo "Commands:" + echo " get [subcommand]" + echo " gamemodes Get all available levels' gamemodes" + echo " maplist Generate a maplist" + echo " level-strategies Get a level's server.zip's ESAI strategies" + echo " If if omitted, all levels' strategies are shown" + echo " level-strategiescontent Get file content of level's server.zip's ESAI strategies" + echo " If if omitted, all levels' strategies are shown" + echo " levels Get all available levels" + echo " mods Get all available mods" + echo " strategies Get all available ESAI strategies" + echo " apply|delete [subcommand]" + echo " default-strategy Apply a default ESAI strategy for all levels." + echo " This is the default strategy if a level-strategy is not found for a level" + echo " level-strategy Apply the specified ESAI strategy to a specified gamemode" + echo " of a specified level's server.zip" + echo " -f|--file Apply ESAI strategies based on a space-delimited file" + echo " Format per line: " + echo " Use '#' for comments" + echo "Examples:" + echo " esai-helper -m bf2 get gamemodes" + echo " esai-helper -m xpack get gamemodes" + echo " esai-helper -m bf2 get maplist" + echo " esai-helper -m bf2 get level-strategies" + echo " esai-helper -m bf2 get level-strategiescontent" + echo " esai-helper -m bf2 get levels" + echo " esai-helper -m bf2 get mods" + echo " esai-helper -m bf2 get strategies" + echo " esai-helper -m bf2 apply default-strategy mediumfca" + echo " esai-helper -m bf2 apply level-strategy highway_tampa gpm_cq 32 mediumfca" + echo " esai-helper -m bf2 apply -f strategies.txt" + echo " esai-helper -m bf2 delete default-strategy mediumfca" + echo " esai-helper -m bf2 delete level-strategy highway_tampa gpm_cq 32 mediumfca" + echo " esai-helper -m bf2 delete -f strategies.txt" +} +# Exit if we got no options +if [ $# -eq 0 ]; then usage; exit 1; fi + +# Get some options +while test $# -gt 0; do + case "$1" in + help|-h|--help) + usage + exit 0 + ;; + -d|--dir) + shift + if test $# -gt 0; then + DIR="$1" + shift + fi + ;; + -m|--mod) + shift + if test $# -gt 0; then + MOD="$1" + shift + fi + ;; + get) + shift + if [ $# = 0 ]; then + echo "Missing subcommand" + usage + exit 1 + fi + case "$1" in + gamemodes) + GET_GAMEMODES=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + break + ;; + maplist) + GET_MAPLIST=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + ;; + level-strategies) + GET_LEVEL_STRATEGIES=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + ;; + level-strategiescontent) + GET_LEVEL_STRATEGIESCONTENT=1 + shift + if [ "$#" -gt 0 ]; then + LEVEL="${1:-}" + shift + fi + ;; + levels) + GET_LEVELS=1 + shift + ;; + mods) + GET_MODS=1 + shift + ;; + strategies) + GET_STRATEGIES=1 + shift + ;; + esac + ;; + apply|delete) + SUBCOMMAND="$1" + shift + if [ "$#" = 0 ]; then + echo "Missing options or arguments" + usage + exit 1 + fi + case "$1" in + default-strategy) + if [ "$SUBCOMMAND" = 'apply' ]; then + APPLY_DEFAULT_STRATEGY=1 + else + DELETE_DEFAULT_STRATEGY=1 + fi + shift + STRATEGY="${1:-}" + if [ -z "$STRATEGY" ]; then + echo "Please specify an ESAI strategy an argument. E.g. mediumfcapb" + exit 1 + fi + shift + ;; + level-strategy) + if [ "$SUBCOMMAND" = 'apply' ]; then + APPLY_LEVEL_STRATEGY=1 + else + DELETE_LEVEL_STRATEGY=1 + fi + shift + LEVEL="${1:-}" + if [ -z "$LEVEL" ]; then + echo "Please specify a level as the first argument. E.g. dalian_plant" + exit 1 + fi + shift + GAMEMODE="${1:-}" + if [ -z "$GAMEMODE" ]; then + echo "Please specify a gamemode as the second argument. E.g. gpm_coop" + exit 1 + fi + shift + SIZE="${1:-}" + if [ -z "$SIZE" ]; then + echo "Please specify a map size as the third argument. E.g. 16" + exit 1 + fi + shift + STRATEGY="${1:-}" + if [ -z "$STRATEGY" ]; then + echo "Please specify an ESAI strategy as the fourth argument. E.g. mediumfcapb" + exit 1 + fi + shift + ;; + -f|--file) + if [ "$SUBCOMMAND" = 'apply' ]; then + APPLY_FILE=1 + else + DELETE_FILE=1 + fi + shift + if [ "$#" -gt 0 ]; then + FILE="$1" + shift + fi + ;; + *) + echo "Invalid option '$1'" 1>&2 + usage + exit 1 + ;; + esac + ;; + *) + echo "Invalid option '$1'" 1>&2 + usage + exit 1 + ;; + esac +done + +DIR=${DIR:-/server/bf2} +MOD=${MOD:-bf2} # Default mod is mods/bf2 +GET_GAMEMODES=${GET_GAMEMODES:-} +GET_MAPLIST=${GET_MAPLIST:-} +GET_LEVEL_STRATEGIES=${GET_LEVEL_STRATEGIES:-} +GET_LEVEL_STRATEGIESCONTENT=${GET_LEVEL_STRATEGIESCONTENT:-} +GET_LEVELS=${GET_LEVELS:-} +GET_MODS=${GET_MODS:-} +GET_STRATEGIES=${GET_STRATEGIES:-} +APPLY_DEFAULT_STRATEGY=${APPLY_DEFAULT_STRATEGY:-} +DELETE_DEFAULT_STRATEGY=${DELETE_DEFAULT_STRATEGY:-} +APPLY_LEVEL_STRATEGY=${APPLY_LEVEL_STRATEGY:-} +DELETE_LEVEL_STRATEGY=${DELETE_LEVEL_STRATEGY:-} +APPLY_FILE=${APPLY_FILE:-} +DELETE_FILE=${DELETE_FILE:-} +LEVEL=${LEVEL:-} +GAMEMODE=${GAMEMODE:-} +SIZE=${SIZE:-} +STRATEGY=${STRATEGY:-} + +# Validation +if ! cd "$DIR" 2>/dev/null; then + echo "No such directory: $DIR" + exit 1 +fi +DIR=$( cd "$DIR" && pwd ) +if [ ! -d "$DIR/mods/$MOD" ]; then + echo "Invalid mod. Mod directory does not exist: $DIR/mods/$MOD" + exit 1 +fi +if [ -n "$GET_GAMEMODES" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + for i in $( echo "$SERVER_ZIPS" | sort -n ); do + LEVEL=$( echo "$i" | xargs dirname | xargs basename ) + for j in $( unzip -l "$i" | awk '{print $4}' | grep -iE "gamemodes/[^/]+/[0-9]+/.+" | cut -d '/' -f2-3 | sort -n | uniq || true ); do + GAMEMODE=$( echo "$j" | cut -d '/' -f1 ) + SIZE=$( echo "$j" | cut -d '/' -f2 ) + echo "$LEVEL $GAMEMODE $SIZE" + done + done +fi + +if [ -n "$GET_MAPLIST" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + for i in $( echo "$SERVER_ZIPS" | sort -n ); do + LEVEL=$( echo "$i" | xargs dirname | xargs basename ) + for j in $( unzip -l "$i" | awk '{print $4}' | grep -iE "gamemodes/[^/]+/[0-9]+/.+" | cut -d '/' -f2-3 | sort -n | uniq || true ); do + GAMEMODE=$( echo "$j" | cut -d '/' -f1 ) + SIZE=$( echo "$j" | cut -d '/' -f2 ) + echo "maplist.append $LEVEL $GAMEMODE $SIZE" + done + done +fi + +if [ -n "$GET_MODS" ]; then + ls -1 "$DIR/mods" | sort -n +fi + +if [ -n "$GET_LEVELS" ]; then + ls -1 "$DIR/mods/$MOD/levels" | sort -n +fi + +if [ -n "$GET_LEVEL_STRATEGIES" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + for i in $SERVER_ZIPS; do + STRATEGIES_AI=$( unzip -l "$i" | grep -iE "gamemodes/[^/]+/[0-9]+/[^/]+/strategies.ai" | awk '{print $4}' | sort -n | uniq || true ) + if [ -n "$STRATEGIES_AI" ]; then + for s in $STRATEGIES_AI; do + echo "$i $s" + done + else + echo "No strategies found in: $i" >&2 + fi + done +fi + +if [ -n "$GET_LEVEL_STRATEGIESCONTENT" ]; then + SERVER_ZIPS=$( find "$DIR" -path "*/mods/$MOD/levels/${LEVEL:-*}/server.zip" | sort -n ) + if [ -z "$SERVER_ZIPS" ]; then + echo "No such level: $LEVEL" >&2 + exit 1 + fi + ERR= + for i in $SERVER_ZIPS; do + echo "Looking in: $i" >&2 + STRATEGIES_AI=$( unzip -l "$i" | grep -iE "gamemodes/[^/]+/[0-9]+/[^/]+/strategies.ai" | awk '{print $4}' | sort -n | uniq || true ) + if [ -n "$STRATEGIES_AI" ]; then + for s in $STRATEGIES_AI; do + echo "Content of $s in $i:" >&2 + unzip -p "$i" "$s" + done + else + echo "No strategies found in: $i" >&2 + ERR=1 + fi + done + if [ -n "$ERR" ]; then + exit 1 + fi +fi + +if [ -n "$GET_STRATEGIES" ]; then + cd "$DIR" + find . | grep -E "mods/$MOD/esai/mapfiles/[^/]+/[^/]+/strategies.ai" | cut -d '/' -f7 | sort -n +fi + +if [ -n "$APPLY_DEFAULT_STRATEGY" ]; then + # A trick not found in ESAI readmes + # The default ESAI strategy is used when there is no ESAI strategy for a particular level. + # According to Void, the original author of ESAI, it's easy to add the default ESAI strategy for all maps: + # 1. All except the last two lines of an ESAI strategy (i.e. mods/bf2/esai/mapfiles/*//strategies.ai) goes into aidefaultstrategies.ai + # 2. The last two lines go into aidefaultstrategiesadd.ai + STRATEGIES_AI=$( find "$DIR" | grep -E "mods/$MOD/esai/mapfiles/[^/]+/$STRATEGY/strategies.ai" | head -n1 || true ) + if [ -z "$STRATEGIES_AI" ]; then + echo "No such strategy: $STRATEGY" + echo "To get a list of available strategies, run:" + echo " esai-helper -m "$MOD" get strategies" + exit 1 + fi + CONTENT=$( cat "$STRATEGIES_AI" ) + LINE_COUNT=$( echo "$CONTENT" | wc -l ) + echo "Applying $STRATEGIES_AI to $DIR/mods/$MOD/ai/aidefaultstrategies.ai">&2 + echo "$CONTENT" | head -n $(( $LINE_COUNT - 2 )) > "$DIR/mods/$MOD/ai/aidefaultstrategies.ai" + echo "Applying $STRATEGIES_AI to $DIR/mods/$MOD/ai/aidefaultstrategiesadd.ai">&2 + echo "$CONTENT" | tail -n 2 > "$DIR/mods/$MOD/ai/aidefaultstrategiesadd.ai" +fi + +if [ -n "$DELETE_DEFAULT_STRATEGY" ]; then + echo "Deleting a default ESAI strategy is not supported. The server needs a default strategy." + exit 1 +fi + +if [ -n "$APPLY_LEVEL_STRATEGY" ] || [ -n "$DELETE_LEVEL_STRATEGY" ] || [ -n "$APPLY_FILE" ] || [ -n "$DELETE_FILE" ]; then + # Validation + if [ -n "$APPLY_LEVEL_STRATEGY" ] || [ -n "$DELETE_LEVEL_STRATEGY" ]; then + CONTENT="$LEVEL $GAMEMODE $SIZE $STRATEGY" + fi + if [ -n "$APPLY_FILE" ] || [ -n "$DELETE_FILE" ]; then + if [ ! -f "$FILE" ]; then + echo "No such file: $FILE" + exit 1 + fi + CONTENT=$( cat "$FILE" | grep -v '#' | awk NF || true ) # Remove lines starting with '#' or trailing with '# ...', as well as blank lines + if [ -z "$CONTENT" ]; then + echo "No ESAI strategies to apply in: $FILE" + exit 1 + fi + fi + echo "$CONTENT" | while read -r LEVEL GAMEMODE SIZE STRATEGY; do + SERVER_ZIP="$DIR/mods/$MOD/levels/$LEVEL/server.zip" + if ! unzip -l "$SERVER_ZIP" | grep -iE "gamemodes/$GAMEMODE/$SIZE/" > /dev/null; then + echo "The gamemode '$GAMEMODE' does not exist in $SERVER_ZIP at gamemodes/$GAMEMODE/$SIZE/" + echo "To get a list of available gamemodes, run:" + echo " esai-helper -m "$MOD" get gamemodes" + exit 1 + fi + STRATEGIES_AI=$( find "$DIR" | grep -E "mods/$MOD/esai/mapfiles/[^/]+/$STRATEGY/strategies.ai" | head -n1 || true ) + if [ -z "$STRATEGIES_AI" ]; then + echo "No such strategy: $STRATEGY" + echo "To get a list of available strategies, run:" + echo " esai-helper -m "$MOD" get strategies" + exit 1 + fi + done + + if [ -n "$APPLY_LEVEL_STRATEGY" ] || [ -n "$APPLY_FILE" ]; then + echo "$CONTENT" | while read -r LEVEL GAMEMODE SIZE STRATEGY; do + cd "$DIR/mods/$MOD/levels/$LEVEL" + SERVER_ZIP="$PWD/server.zip" + STRATEGIES_AI=$( find "$DIR" | grep -E "mods/$MOD/esai/mapfiles/[^/]+/$STRATEGY/strategies.ai" | head -n1 || true ) + STRATEGIES_AI_DESTINATION_IN_ZIP="gamemodes/$GAMEMODE/$SIZE/ai/strategies.ai" + echo "Applying strategy $STRATEGIES_AI to $SERVER_ZIP at $STRATEGIES_AI_DESTINATION_IN_ZIP" + mkdir -p "$( dirname "$STRATEGIES_AI_DESTINATION_IN_ZIP" )" # Same layout as content of server.zip + cp -f "$STRATEGIES_AI" "$STRATEGIES_AI_DESTINATION_IN_ZIP" + zip -qru server.zip gamemodes + rm -rf "$DIR/mods/$MOD/levels/$LEVEL/gamemodes" + done + fi + + if [ -n "$DELETE_LEVEL_STRATEGY" ] || [ -n "$DELETE_FILE" ]; then + echo "$CONTENT" | while read -r LEVEL GAMEMODE SIZE STRATEGY; do + cd "$DIR/mods/$MOD/levels/$LEVEL" + SERVER_ZIP="$PWD/server.zip" + EXISTING_STRATEGIES_AI=$( unzip -l "$SERVER_ZIP" | grep -iE "gamemodes/$GAMEMODE/$SIZE/ai/strategies.ai" | awk '{print $4}' || true ) + if [ -n "$EXISTING_STRATEGIES_AI" ]; then + for i in $EXISTING_STRATEGIES_AI; do + echo "Removing existing strategy $i from $SERVER_ZIP at $i" + zip -q -d "$SERVER_ZIP" "$i" + done + else + echo "No existing strategy in: $SERVER_ZIP" + exit 1 + fi + done + fi +fi diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt b/variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt new file mode 100644 index 0000000..8207539 --- /dev/null +++ b/variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-bf2.txt @@ -0,0 +1,142 @@ +# This is a list of optimized ESAI strategies, based on 'Strategies-&-Navmesh-Credits.pdf' for BF2SP64 +# Format: +# Usage: +# 1. The following level-gamemode-strategy entries may be generated (with an empty field): +# esai-helper --mod bf2 get gamemodes +# 2. Edit field to your liking. To get all available strategies: +# esai-helper --mod bf2 get strategies +# 3. Apply these ESAI strategies: +# esai-helper --mod bf2 apply -f esai-optimized-strategies-bf2.txt +# 4. Remove these ESAI strategies: +# esai-helper --mod bf2 delete -f esai-optimized-strategies-bf2.txt +# NOTE: Commented out maps do not have an optimized ESAI strategy + +dalian_plant gpm_coop 16 smallmap +dalian_plant gpm_cq 16 smallmap +dalian_plant gpm_cq 32 smallmap +dalian_plant gpm_cq 64 largemap +dalian_plant sp1 16 smallmap +daqing_oilfields gpm_coop 16 smallmap +daqing_oilfields gpm_cq 16 smallmap +daqing_oilfields gpm_cq 32 mediummap +daqing_oilfields gpm_cq 64 largefcapf +daqing_oilfields sp1 16 smallmap +dragon_valley gpm_coop 16 smallmap +dragon_valley gpm_cq 16 smallmap +dragon_valley gpm_cq 32 mediumfcapfpb +dragon_valley gpm_cq 64 largefcapfpb +dragon_valley gpm_cq 128 largefcapfpb +dragon_valley gpm_sl 16 smallmap +dragon_valley gpm_sl 32 mediumfcapfpb +dragon_valley gpm_sl 64 largefcapfpb +dragon_valley gpm_sl 128 largefcapfpb +dragon_valley sp1 16 smallmap +dragon_valley sp1 32 mediumfcapfpb +dragon_valley sp1 64 largefcapfpb +dragon_valley sp1 128 largefcapfpb +dragon_valley sp2 16 smallmap +dragon_valley sp2 32 mediumfcapfpb +dragon_valley sp2 64 largefcapfpb +dragon_valley sp2 128 largefcapfpb +dragon_valley sp3 16 smallmap +dragon_valley sp3 32 mediumfcapfpb +dragon_valley sp3 64 largefcapfpb +dragon_valley sp3 128 largefcapfpb +fushe_pass gpm_coop 16 smallmap +fushe_pass gpm_cq 16 smallmap +fushe_pass gpm_cq 32 mediumpf +fushe_pass gpm_cq 64 largepf +fushe_pass sp1 16 smallmap +# greatwall gpm_coop 16 - +# greatwall gpm_cq 16 - +# greatwall gpm_cq 32 - +# greatwall sp1 16 - +# greatwall sp1 32 - +# greatwall sp1 64 - +gulf_of_oman gpm_coop 16 smallmap +gulf_of_oman gpm_cq 16 smallmap +gulf_of_oman gpm_cq 32 smallfca +gulf_of_oman gpm_cq 64 mediumfca +gulf_of_oman sp1 16 smallmap +highway_tampa gpm_cq 16 smallmap +highway_tampa gpm_cq 32 mediummap +highway_tampa gpm_cq 64 largemap +highway_tampa gpm_cq 128 largemap +highway_tampa gpm_cq 8 smallmap +highway_tampa gpm_sl 16 smallmap +highway_tampa gpm_sl 32 mediummap +highway_tampa gpm_sl 64 largemap +highway_tampa gpm_sl 128 largemap +highway_tampa sp1 16 smallmap +highway_tampa sp1 32 mediummap +highway_tampa sp1 64 largemap +highway_tampa sp1 128 largemap +highway_tampa sp2 16 smallmap +highway_tampa sp2 32 mediummap +highway_tampa sp2 64 largemap +highway_tampa sp2 128 largemap +highway_tampa sp3 16 smallmap +highway_tampa sp3 32 mediummap +highway_tampa sp3 64 largemap +highway_tampa sp3 128 largemap +kubra_dam gpm_cq 16 smallmap +kubra_dam gpm_cq 32 mediumpf +kubra_dam gpm_cq 64 largepf +kubra_dam sp1 16 smallmap +mashtuur_city gpm_cq 16 smallmap +mashtuur_city gpm_cq 32 smallmap +mashtuur_city gpm_cq 64 mediummap +# midnight_sun gpm_coop 16 - +# midnight_sun gpm_cq 16 - +# midnight_sun gpm_cq 32 - +# midnight_sun gpm_cq 64 - +# midnight_sun sp1 16 -` +# operation_blue_pearl gpm_cq 16 - +# operation_blue_pearl gpm_cq 32 - +# operation_blue_pearl gpm_cq 64 - +operation_clean_sweep gpm_coop 16 smallmap +operation_clean_sweep gpm_cq 16 smallmap +operation_clean_sweep gpm_cq 32 mediumfcapf +operation_clean_sweep gpm_cq 64 mediumfcapf +operation_clean_sweep sp1 16 smallmap +# operationharvest gpm_coop 16 - +# operationharvest gpm_cq 16 - +# operationharvest gpm_cq 32 - +# operationharvest gpm_cq 64 - +# operationharvest sp1 16 - +# operationroadrage gpm_coop 1 -6 +# operationroadrage gpm_cq 16 - +# operationroadrage gpm_cq 32 - +# operationroadrage gpm_cq 64 - +# operationroadrage sp1 16 - +# operationsmokescreen gpm_coop 16 - +# operationsmokescreen gpm_cq 16 - +# operationsmokescreen gpm_cq 32 - +# operationsmokescreen sp1 16 - +# operationsmokescreen sp1 32 - +road_to_jalalabad gpm_coop 16 smallmap +road_to_jalalabad gpm_cq 16 smallmap +road_to_jalalabad gpm_cq 32 mediumfcapf +road_to_jalalabad gpm_cq 64 mediumfcapf +road_to_jalalabad sp1 16 smallmap +sharqi_peninsula gpm_coop 16 smallmap +sharqi_peninsula gpm_cq 16 smallmap +sharqi_peninsula gpm_cq 32 mediumfcapf +sharqi_peninsula gpm_cq 64 mediumfcapf +sharqi_peninsula sp1 16 smallmap +songhua_stalemate gpm_coop 16 smallmap +songhua_stalemate gpm_cq 16 smallmap +songhua_stalemate gpm_cq 32 mediumfca +songhua_stalemate gpm_cq 64 largefca +songhua_stalemate sp1 16 smallmap +# taraba_quarry gpm_coop 16 - +# taraba_quarry gpm_cq 16 - +# taraba_quarry gpm_cq 32 - +# taraba_quarry sp1 16 - +# taraba_quarry sp1 32 - +wake_island_2007 gpm_cq 64 wake-island-64 +zatar_wetlands gpm_coop 16 smallmap +zatar_wetlands gpm_cq 16 smallmap +zatar_wetlands gpm_cq 32 mediumfca +zatar_wetlands gpm_cq 64 mediumfcapf +zatar_wetlands sp1 16 smallmap diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt b/variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt new file mode 100644 index 0000000..d0fffa6 --- /dev/null +++ b/variants/v1.5.3153.0-bf2stats-2.7.2/esai-optimized-strategies-xpack.txt @@ -0,0 +1,42 @@ +# Format: +# 1. The following level-gamemode-strategy entries may be generated (with an empty field) using: +# esai-helper --mod xpack get gamemodes +# 2. Edit field to your liking. To get all available strategies: +# esai-helper --mod xpack get strategies +# 3. Then apply these ESAI strategies as part of container entrypoint: +# esai-helper --mod xpack apply -f esai-optimized-strategies-xpack.txt +# 4. To remove these ESAI strategies, simply: +# esai-helper --mod xpack delete -f esai-optimized-strategies-xpack.txt +# NOTE: Commented out maps do not have an optimized ESAI strategy + +# ghost_town gpm_coop 16 - +# ghost_town gpm_cq 16 - +# ghost_town gpm_cq 32 - +# ghost_town gpm_cq 64 - +# ghost_town sp1 16 - +# iron_gator gpm_cq 16 - +# iron_gator gpm_cq 32 - +# iron_gator gpm_cq 64 - +# leviathan gpm_cq 16 - +# leviathan gpm_cq 32 - +# leviathan gpm_cq 64 - +# mass_destruction gpm_coop 16 - +# mass_destruction gpm_cq 16 - +# mass_destruction gpm_cq 32 - +# mass_destruction gpm_cq 64 - +# mass_destruction sp1 16 - +# night_flight gpm_coop 16 - +# night_flight gpm_cq 16 - +# night_flight gpm_cq 32 - +# night_flight gpm_cq 64 - +# night_flight sp1 16 - +# surge gpm_coop 16 - +# surge gpm_cq 16 - +# surge gpm_cq 32 - +# surge gpm_cq 64 - +# surge sp1 16 - +# warlord gpm_coop 16 - +# warlord gpm_cq 16 - +# warlord gpm_cq 32 - +# warlord gpm_cq 64 - +# warlord sp1 16 - diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/healthcheck b/variants/v1.5.3153.0-bf2stats-2.7.2/healthcheck new file mode 100755 index 0000000..5464f28 --- /dev/null +++ b/variants/v1.5.3153.0-bf2stats-2.7.2/healthcheck @@ -0,0 +1,24 @@ +#!/bin/bash +set -eu +usage() { + echo "healthcheck: Healthcheck a Battlefield 2 server" + echo "Usage: healthcheck " + echo "Examples:" + echo " ./healthcheck 127.0.0.1 29900" + echo " ./healthcheck bf2 29900" +} +if [ "${1:-}" = '-h' ] || [ "${1:-}" = '--help' ]; then + usage + exit 0 +fi +HOST=${1:-localhost} # Hostname +PORT=${2:-29900} # Gamespy port + +echo "Checking $HOST:$PORT" +RES=$( printf '\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01' | nc -w 1 -u "$HOST" "$PORT" ) +if [ -n "$RES" ]; then + echo "OK" +else + echo "Not OK" + exit 1 +fi diff --git a/variants/v1.5.3153.0-bf2stats-2.7.2/lowercase-helper b/variants/v1.5.3153.0-bf2stats-2.7.2/lowercase-helper new file mode 100755 index 0000000..699a069 --- /dev/null +++ b/variants/v1.5.3153.0-bf2stats-2.7.2/lowercase-helper @@ -0,0 +1,70 @@ +#!/bin/sh +set -eu + +usage() { + echo "$0 The BF2 linux server requires all files to be in lowercase, except python files. See /readmes/readme-linux.txt" + echo " This script lowercases a given directory and all descendent folders" + echo "Examples:" + echo " $0 --dir /server/bf2/mods/bf2/ESAI" +} + +# Get some options +while test $# -gt 0; do + case "$1" in + -h|--help) + usage + exit 0 + ;; + -d|--dir) + shift + if test $# -gt 0; then + DIR="$1" + shift + fi + ;; + *) + echo "Invalid option '$1'" 1>&2 + usage + exit 1 + ;; + esac +done + +if [ -z "$DIR" ]; then + echo "Specify a directory as the first argument" + usage() + exit 1 +fi + +# Lowercase this directory +if basename "$DIR" | grep -E '[A-Z]' > /dev/null; then + DIR_LOWERCASED="$( dirname "$DIR" )/$( basename "$DIR" | tr '[:upper:]' '[:lower:]' )" + mv -v "$DIR" "$DIR_LOWERCASED" 2>&1 || true + DIR="$DIR_LOWERCASED" +fi + +# Lowercase descendent directories starting from the parent-most +i=1 +while true; do + DIRS=$( find "$DIR" -mindepth "$i" -maxdepth "$i" -type d | grep -E '[A-Z]' || true ) + if [ -z "$DIRS" ]; then + break + fi + echo "$DIRS" | while read -r d; do + mv -v "$d" "$( echo "$d" | tr '[:upper:]' '[:lower:]' )" + done + i=$(( $i + 1 )) +done + +# Lowercase descendent files starting from the parent-most +i=1 +while true; do + FILES=$( find "$DIR" -mindepth "$i" -maxdepth "$i" -type f | grep -E '[A-Z]' || true ) + if [ -z "$FILES" ]; then + break + fi + echo "$FILES" | while read -r f; do + mv -v "$f" "$( echo "$f" | tr '[:upper:]' '[:lower:]' )" + done + i=$(( $i + 1 )) +done