Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: sourceserver.info. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

DeaD_EyE

Administrator

  • »DeaD_EyE« ist der Autor dieses Themas

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

1

Mittwoch, 4. Juli 2007, 16:46

[Linux] Maps Nav-Generator

Ich habe 3 Scripte geschrieben, mit denen man Nav-Dateien erstellen, komprimieren (tauschen) und zurückkopieren kann.

09.09.2007: Ich habe alle 3 Scripte nochmals überarbeitet. Es dürften jetzt keine Fehler mehr vorhanden sein.

1) Nav-Dateien erstellen
Das Script startet den Server mit einer bestimmten Map, nachdem die Nav-Datei generiert wurde, wird die Map neugeladen. Durch einen kleinen Trick wird der Server nach dem Laden der neuen Map beendet. In der Schleife wird dann die nächste Map abgearbeitet. Ich habe noch die Möglichkeit eingebaut Maps zu überspringen oder nur eine bestimmte Art von Maps zu durchlaufen.

Surf-Maps überspringen:

Quellcode

1
2
exclude="1"
prefix="surf_"


Nur gg-Maps durchlaufen:

Quellcode

1
2
exclude="0"
prefix="gg_"


Alle Maps:

Quellcode

1
prefix=""


Das Script muss in das gleiche Verzeichnis kopiert werden, in dem sich srcds_run befindet.

navgen.sh

#!/bin/bash
game=cstrike
hostname="GEN-Nav-Files"
port=40000
rcon=rconpasswort
nice=19

# if exclude is 1 then maps with the prefix will exluded
# if exclude is 0 then generate navigation meshes only for maps withthe prefix
# for all maps only a empty prefix is needed

exclude="1"
prefix="surf_"

echo -e "nav_generate\nservercfgfile \"s_restart.cfg\"" > ./$game/cfg/server_nav.cfg
echo -e "_restart" > ./$game/cfg/s_restart.cfg
if [ ! -f navfiles.txt ]; then echo "HLSW: sv_cheats 1 && nav_check_file_consistency ---> navfiles.txt" && exit 1; fi
cat navfiles.txt | expand | tr -s ' ' | grep "Missing nav file for" | cut -d ' ' -f 6 | sed s/.bsp// > mapcycle_nav.txt
cat navfiles.txt | expand | tr -s ' ' | grep "is built from an old version of the map" | cut -d ' ' -f 6 | sed s/.bsp// >> mapcycle_nav.txt

if [ $exclude = "1" ]; then echo 1
for map in $(cat mapcycle_nav.txt); do
if ! `echo $map | grep -q ^${prefix}` ; then
nice -n $nice ./srcds_run -game "$game" -port $port -maxplayers 2 -norestart +map $map +servercfgfile server_nav.cfg +sv_password "xx" +sv_cheats 1 +rcon_password "$rcon" +hostname $hostname
fi
done
fi

if [ $exclude = "0" ]; then echo 0
for map in $(cat mapcycle_nav.txt); do
if `echo $map | grep -q ^${prefix}` ; then
nice -n $nice ./srcds_run -game "$game" -port $port -maxplayers 2 -norestart +map $map +servercfgfile server_nav.cfg +sv_password "xx" +sv_cheats 1 +rcon_password "$rcon" +hostname $hostname
fi
done
fi

reset
echo -e "Fertig\nLösche erstellte Dateien: server_nav.cfg, s_restart.cfg, mapcycle_nav.txt und navfiles.txt"
rm ./$game/cfg/server_nav.cfg ./$game/cfg/s_restart.cfg ./mapcycle_nav.txt ./navfiles.txt
exit 0


Die beiden Dateien server_nav.cfg und s_restart.cfg werden automatisch generiert.

server_nav.cfg

Quellcode

1
2
nav_generate
servercfgfile "s_restart.cfg"



s_restart.cfg

Quellcode

1
_restart


Vorgehensweise:
Zuerst muss über HLSW sv_cheats 1 und nav_check_file_consistency ausgeführt werden. Alles nach dem Befehl "nav_check_file_consistency" muss kopiert werden die letzte Zeile "$UHRZEIT HLSW Information: Verbindung getrennt" muss ausgelassen werden. Der Inhalt muss dann in der Datei "navfiles.txt" gespeichert werden, die dann zusammen mit dem Script zum Gleichen Ort wie "srcds_run" kopiert wird.

Der Server wird mit nice -n $nice ./srcds_run -game "$game" -port $port -maxplayers 2 +map $map +servercfgfile server_nav.cfg +sv_password "xx" +sv_cheats 1 +rcon_password "$rcon" +hostname $hostname gestartet.

Mit "nice" wird dem Prozess eine Nettigkeit zugeordnet. Je höher der Wert (-20 - 19), desto niedriger ist die Priorität.

Die "servercfgfile" wird nach dem Mapchange geladen. Da in der server_nav.cfg die Variable servercfgfile neu gesetzt wird, wird die Datei s_restart.cfg nach Beendigung der Generierung geladen (Mapchange). Da der Inhalt einfach nur "_restart" ist, wird der Server einfach beendet. Nach Beendigung wird die For-Schleife weiter abgearbeitet.

Die beiden Echo-Befehle am Anfang vor der Schleife generieren nur die beiden Dateien, die nach der Abarbeitung der Schleife wieder gelöscht werden.

Das ganze kann man noch im Screen starten.

Ich kann nicht für Fehlerfreiheit garantieren. Maps, die den Server zum abstürzen bringen werden nicht nocheinmal abgearbeitet. Es sollte nicht vergessen werden die Datei navfiles.txt wieder zu entfernen.

2) Nav-Dateien kopieren und komprimieren
compress_nav_files.sh: Das Script ist ein bisschen einfacher aufgebaut. Es kopiert die ganzen nav-Dateien in ein Temp-Verzeichnis das vorher erstellt wird. Nachdem alle Dateien kopiert worden sind, wird vom allen bsp-Dateien eine md5summe erstellt. Diese Dateien dienen später zur Überprüfung beim Zurückkopieren, ob es sich auch um die gleiche Map handelt.

compress_nav_files.sh

#!/bin/bash
pwd=`pwd`
if [ -z "$1" ]; then echo "$0 [directory from css maps]" && exit 1; fi
if [ ! "`echo $1 | tail -c 2`" = "/" ]; then path=`echo "${1}/"`; else path=$1; fi
if [ ! -d nav_files_temp ]; then mkdir nav_files_temp; else echo "removing old nav_files_temp directory" && rm -R nav_files_temp && mkdir nav_files_temp; fi
echo "copy nav files"
cp ${path}*.nav nav_files_temp/

echo "delete standard valve-navfiles from nav_files_temp directory"
rm nav_files_temp/cs_assault.nav
rm nav_files_temp/cs_compound.nav
rm nav_files_temp/cs_havana.nav
rm nav_files_temp/cs_italy.nav
rm nav_files_temp/cs_militia.nav
rm nav_files_temp/cs_office.nav
rm nav_files_temp/de_aztec.nav
rm nav_files_temp/de_cbble.nav
rm nav_files_temp/de_chateau.nav
rm nav_files_temp/de_dust2.nav
rm nav_files_temp/de_dust.nav
rm nav_files_temp/de_inferno.nav
rm nav_files_temp/de_nuke.nav
rm nav_files_temp/de_piranesi.nav
rm nav_files_temp/de_port.nav
rm nav_files_temp/de_prodigy.nav
rm nav_files_temp/de_tides.nav
rm nav_files_temp/de_train.nav

echo "make a md5sum from all bsp files"
cd $path
for bsp in $(ls *.bsp | sed 's/.bsp//' ); do
if [ -f $path/${bsp}.nav ]; then md5sum ${bsp}.bsp > $pwd/nav_files_temp/${bsp}.bsp.md5; fi
done
cd $pwd

echo "delete all created md5sum from standardmaps"
rm nav_files_temp/cs_assault.bsp.md5
rm nav_files_temp/cs_compound.bsp.md5
rm nav_files_temp/cs_havana.bsp.md5
rm nav_files_temp/cs_italy.bsp.md5
rm nav_files_temp/cs_militia.bsp.md5
rm nav_files_temp/cs_office.bsp.md5
rm nav_files_temp/de_aztec.bsp.md5
rm nav_files_temp/de_cbble.bsp.md5
rm nav_files_temp/de_chateau.bsp.md5
rm nav_files_temp/de_dust2.bsp.md5
rm nav_files_temp/de_dust.bsp.md5
rm nav_files_temp/de_inferno.bsp.md5
rm nav_files_temp/de_nuke.bsp.md5
rm nav_files_temp/de_piranesi.bsp.md5
rm nav_files_temp/de_port.bsp.md5
rm nav_files_temp/de_prodigy.bsp.md5
rm nav_files_temp/de_tides.bsp.md5
rm nav_files_temp/de_train.bsp.md5

echo "compress..."
cd nav_files_temp
tar -czf nav_files.tar.gz *.nav *.bsp.md5
cd $pwd

echo "move nav_files.tar.gz"
mv ./nav_files_temp/nav_files.tar.gz $pwd
echo "delete all temp files"
rm -R nav_files_temp
echo "nav_files.tar.gz is ready"


3) Nav-Dateien zurückkopieren
copy_nav_files.sh: Kopiert die Nav-Dateien aus dem Archiv. Da es manchmal verschiedene Versionen von Maps gibt, wird mit "md5sum" überprüft, ob es sich um die gleiche Datei handelt. Die Nav-Dateien werden dann bei positiver Überprüfung einfach überschrieben (Veraltete sowie aktuelle, vorher besser ein Backup machen).

copy_nav_files.sh

#!/bin/bash

function usage {
echo "$0 [directory from css maps]"
}

function init {
if [ -z "`which md5sum`" ]; then echo "Please install md5sum" && exit 1; fi
if [ -z "`which gzip`" ]; then echo "Please install gzip" && exit 1; fi
if [ ! -f nav_files.tar.gz ]; then echo "File nav_files.tar.gz is missing" && exit 1; fi
if [ -z "$1" ]; then usage && exit 1; fi
if [ ! -f ${1}/de_tides.bsp ]; then echo "Wrong directory in commandline" && exit 1; fi
if [ -d nav_files ]; then echo "Removing old temp directory" && rm -R nav_files; fi
pwd=`pwd`
if [ ! "`echo $1 | tail -c 2`" = "/" ]; then maps_dir=`echo "${1}/"`; else maps_dir=$1; fi
}

function check {

if [ -f ./nav_files/${1}.bsp.md5 -a -f ./nav_files/${1}.nav ]; then
if [ "`cat ./nav_files/${1}.bsp.md5 | cut -d ' ' -f 1`" = "`md5sum ${2} | cut -d ' ' -f 1`" ]; then return 0; else return 1; fi
else
return 1
fi
}

function decompress {
if [ ! -d nav_files ]; then mkdir nav_files; fi
tar -xzf nav_files.tar.gz -C nav_files
}


init $1
echo "Decompressing nav_files.tar.gz"
decompress
echo "Move all NAV files to $maps_dir"
count_skip=0
count_move=0
for nav_file in $(ls $maps_dir/*.bsp); do
nav_file_name=`basename $nav_file | sed 's/.bsp//'`
count_skip=0
count_move=0
check $nav_file_name $nav_file && echo "Moving file ... ${nav_file_name}.nav" && mv nav_files/${nav_file_name}.nav $maps_dir && count_move=`expr $count_move + 1` || echo "Skip file ..... ${nav_file_name}.nav" || count_skip=`expr $count_skip + 1`
done
echo "Removing the temp directory"
rm -R nav_files
echo "$count_move files moved an $count_skip files skiped"
echo "Ready"
exit 0