Unterschiede (Vor- und Nachteile) vom XML gegenüber Ini-Dateien
-
er muss lisp meinen. lisp ist naemlich secret alien technology und der menschheit jahrtausende voraus. deswegen kapierts auch kaum jemand.
-
XML hat einen gravierenden Vorteil:
man kann Konfigurationsdateien einfach gegen ein Schema validieren und jedes Feld auf gültige Werte einschränken (z.B: Windowed darf nur einen bool-Wert besitzen). Heute liefert schon fast jede Programmiersprache einen Parser + Validator für XSD-Schema in der Standardbibliothek mit. Stellt euch mal vor wie fricklig sowas mit ini Dateien ist.
-
das schema musst du erstmal schreiben. die gleiche arbeit fuer ne ini datei muss man sich auch machen.
-
c.rackwitz schrieb:
das schema musst du erstmal schreiben. die gleiche arbeit fuer ne ini datei muss man sich auch machen.
Ne, ich schreib
new XmlSerializer(typeof(MyConfigClassWithGeilePropertiesType)).Serialize(stream, config);
Da muss ich kein Schema schreiben, weil die Properties vom passenden Typ sind und wenn ich den Wertebereich einschränken muss, muss ich sowieso die Validierung in die Properties einbauen, unabhängig davon was ich mit der Klasse dann mache. Aber für das XML ist der einzige Aufwand diese Zeile.
-
Schön peinliche Diskussion...
PS: foo_bar oder fooBar?
-
und wo steht, welches property welchen wertebereich oder typ haben darf?
-
c.rackwitz schrieb:
und wo steht, welches property welchen wertebereich oder typ haben darf?
Der Typ ergibt sich durch das Property selbst:
public class Configuration { public Size Resolution { get { return resolution; } set { resolution = value; } } public bool Windowed { get { return windowed; } set { windowed = value; } } ... }
Daraus entsteht dann irgendwie sowas in der Art:
<Configuration> <Resolution type="System.Drawing.Size"> <Width>800</Width> <Height>600</Height> </Resolution> <Windowed>True</Windowed> </Configuration>
Den Wertebereich prüfst du im Code bei der Zuweisung der Properties und wirfst ggf. eine Exception. Du stellst also sicher, dass eine Instanz von Configuration immer gültige Werte hat. Beim Deserialisieren werden die ganzen Zuweisungen gemacht und ungültiges XML oder ungültige Werte führen so zu einem Fehler beim Deserialisieren (auch ein Einzeiler).
-
XMLSpy hat übrigens einen ganz hervorragenden Schema-Editor, dem man eine XML vorlegt, und man kann daraus mit einigen Zusatzeingaben ein (sehr striktes) Schema bauen. Selbst bei komplexeren Datenformaten Dauer < 1 Stunde.
-
c.rackwitz schrieb:
das schema musst du erstmal schreiben. die gleiche arbeit fuer ne ini datei muss man sich auch machen.
Klar ist das Schreiben des Schemas ein Mehraufwand. Aber danach ist die Struktur der XML-Dateien klar definiert und Du kannst schon vor dem Parsen die Korrektheit des Formats prüfen. Das ist besonders nützlich, wenn mehrere Programme das gleiche Format verwenden. Wenn alle Programme das gleiche Schema zugrunde legen, ist die Interoperabilität gewährleistet.
Und was das Erzeugen angeht: Entweder man erzeugt das Schema automatisch aus bestehenden XML-Dateien und passt es noch ein wenig an (Kardinalitäten etc) oder man schreibt es kurz per Hand. Es gibt zahlreiche sehr gute Editoren mit Code-Completion, womit das recht fix von der Hand geht. Da hat man sich imo sehr schnell eingearbeitet. XML-Schema ist wesentlich weniger komplex als beispielsweise XSLT oder XPath.
-
Marc++us schrieb:
XMLSpy hat übrigens einen ganz hervorragenden Schema-Editor, dem man eine XML vorlegt, und man kann daraus mit einigen Zusatzeingaben ein (sehr striktes) Schema bauen. Selbst bei komplexeren Datenformaten Dauer < 1 Stunde.
Was heißt hier "< 1 Stunde"? Wie komplex sind die Datenformate die du mit XML verwaltest?
MfG SideWinder
-
Das letzte XML-Schema habe ich im Laufe meiner Diplomarbeit geschrieben und waren von der Komplexität her etwa 30-40 Schema-Typen (~1000 Zeilen). Hat vielleicht einen Vormittag gedauert. Mit entsprechenden Editoren brauchste dabei nicht mal XML schreiben sondern kannst Dir die Typen und Attribute auch zusammenklicken.
XMLSpy bietet verdammt viele Möglichkeiten, ist mir persönlich aber schon fast zuviel. Habe Eclipse Webtools Plattform benutzt, ist umsonst und hat einen vernünftigen XML und Schema Editor.
-
Optimizer schrieb:
...
das ueberzeugt mich garnicht. typisch java.
erkennt keiner von euch, dass man genau das gleiche auch mit lisp machen kann?
-
erkennt keiner von euch, dass man genau das gleiche auch mit lisp machen kann?
Solange du Java abwertest ohne es überhaupt zu erkennen (und das kann man von sich bei weitem nich behaupten, wenn man C# und Java Code verwechselt), hast du auch absolut keinen Anspruch Kenntnisse über Nischensprachen von anderen "Java"-Programmierern zu fordern.
-
c.rackwitz schrieb:
Optimizer schrieb:
...
das ueberzeugt mich garnicht. typisch java.
erkennt keiner von euch, dass man genau das gleiche auch mit lisp machen kann?
Ok. Du kritisiertest, dass man ein Schema schreiben muss. Ich zeigte, dass man das nicht muss (für Konfigurationsdateien, wofür man inis üblicherweise verwendet). Was ist an der Lösung genau schlecht? Geht sie am Thema vorbei? Willst du unbedingt ein freakiges Schema schreiben und alle XML-Tricks für was simples auspacken, dich endlos verkünsteln? Was hat das überhaupt mit einer Programmiersprache zu tun gehabt?
-
TactX schrieb:
Schön peinliche Diskussion...
PS: foo_bar oder fooBar?
fooBar natürlich
sonst könnte man ja gleich noch ungarische notation verwenden.
-
was ich meinte war:
die selbe arbeit, die ihr euch mit sun/MS java und XML machen muesst, um dateien zu validieren, die waere auch zu tun wenn man lisp daten validieren wollen wuerde. ich konnte es einfach nicht so stehen lassen, dass - ich weiss nicht mehr wer - xml schemas als etwas einfaches hinstellt, was man mit inis oder lisp daten nicht machen koennte. kann man naemlich. also ist es kein argument fuer xml.
und weil hier doch von config dateien die rede ist, braucht man ja schon mal kein schema, weil nichts interoperieren muss. von mir aus kanns gerne auch ein binaerformat sein, so lange das programm sich selbst dann noch lesen kann.
das laesst sich dann aber schlecht vom menschen bearbeiten. deswegen bin ich auch gegen xml als config.
laesst sich mit primitiven texteditoren schwerer bearbeiten als conf oder ini.so lange die daten keine baumstruktur haben, sind doch conf und ini perfekt. und wenn doch baumstruktur verlangt ist, wuerde ich s-expressions (lisp) vorziehen. die strapazieren das auge nicht mit meta-text wie "<attribute>", "<property>" oder diesen redundanten schliessenden tags. ein einfaches </> koennte es doch auch tun, ist dann aber wieder zu "uneindeutig", und das scheint manche zu beunruhigen.
-
Ich habe die Diskussion nicht im Detail verfolgt. Ich stimme dir auf jeden Fall mal zu, dass man kein Schema braucht (wie ich sagte).
so lange die daten keine baumstruktur haben, sind doch conf und ini perfekt.
Eine Baumstruktur kann aber schon deutlich übersichtlicher sein... magst du mal meine UT2004.ini sehen?
[URL] Protocol=ut2004 ProtocolDescription=Unreal Protocol Name=Player Map=Index.ut2 LocalMap=NvidiaLogo.ut2 NetBrowseMap=Entry.ut2 Host= Portal= MapExt=ut2 EXEName=UT2004.exe SaveExt=usa Port=7777 Class=Engine.Pawn Character=Gorge [FirstRun] FirstRun=3369 [Engine.Engine] RenderDevice=D3DDrv.D3DRenderDevice ;RenderDevice=D3D9Drv.D3D9RenderDevice ;RenderDevice=Engine.NullRenderDevice ;RenderDevice=OpenGLDrv.OpenGLRenderDevice ;RenderDevice=PixoDrv.PixoRenderDevice AudioDevice=ALAudio.ALAudioSubsystem NetworkDevice=IpDrv.TcpNetDriver DemoRecordingDevice=Engine.DemoRecDriver Console=XInterface.ExtendedConsole GUIController=GUI2K4.UT2K4GUIController StreamPlayer=Engine.StreamInteraction Language=int Product=UT2004 GameEngine=Engine.GameEngine EditorEngine=Editor.EditorEngine DefaultGame=XGame.XDeathmatch DefaultServerGame=XGame.XDeathmatch ViewportManager=WinDrv.WindowsClient ;ViewportManager=SDLDrv.SDLClient Render=Render.Render Input=Engine.Input Canvas=Engine.Canvas DetectedVideoMemory=256 ServerReadsStdin=False CdPath=E:\CD1 [Core.System] PurgeCacheDays=30 SavePath=../Save CachePath=../Cache CacheExt=.uxx CacheRecordPath=../System/*.ucl MusicPath=../Music SpeechPath=../Speech Paths=../System/*.u Paths=../Maps/*.ut2 Paths=../Textures/*.utx Paths=../Sounds/*.uax Paths=../Music/*.umx Paths=../StaticMeshes/*.usx Paths=../Animations/*.ukx Paths=../Saves/*.uvx Suppress=DevLoad Suppress=DevSave Suppress=DevNetTraffic Suppress=DevGarbage Suppress=DevKill Suppress=DevReplace Suppress=DevCompile Suppress=DevBind Suppress=DevBsp Suppress=DevNet Suppress=DevKarma Suppress=RecordCache Suppress=MapVoteDebug Suppress=Init suppress=MapVote Suppress=VoiceChat Suppress=ChatManager Suppress=Timer [Engine.GameEngine] CacheSizeMegs=32 UseSound=True VoIPAllowVAD=False ServerActors=IpDrv.MasterServerUplink ServerActors=UWeb.WebServer ServerPackages=Core ServerPackages=Engine ServerPackages=Fire ServerPackages=Editor ServerPackages=IpDrv ServerPackages=UWeb ServerPackages=GamePlay ServerPackages=UnrealGame ServerPackages=XEffects ServerPackages=XPickups ServerPackages=XGame ServerPackages=XWeapons ServerPackages=XInterface ServerPackages=Vehicles ServerPackages=TeamSymbols_UT2003 ServerPackages=TeamSymbols_UT2004 ServerPackages=BonusPack ServerPackages=SkaarjPack_rc ServerPackages=SkaarjPack ServerPackages=UTClassic ServerPackages=UT2k4Assault ServerPackages=Onslaught ServerPackages=GUI2K4 ServerPackages=UT2k4AssaultFull ServerPackages=OnslaughtFull ServerPackages=xVoting UseStaticMeshBatching=True ColorHighDetailMeshes=False ColorSlowCollisionMeshes=False ColorNoCollisionMeshes=False ColorWorldTextures=False ColorPlayerAndWeaponTextures=False ColorInterfaceTextures=False MainMenuClass=GUI2K4.UT2K4MainMenu ConnectingMenuClass=GUI2K4.UT2K4ServerLoading DisconnectMenuClass=GUI2K4.UT2K4DisconnectOptionPage LoadingClass=GUI2K4.UT2K4SP_LadderLoading SinglePlayerMenuClass=GUI2K4.UT2K4SP_Main [WinDrv.WindowsClient] WindowedViewportX=640 WindowedViewportY=480 FullscreenViewportX=1280 FullscreenViewportY=1024 MenuViewportX=640 MenuViewportY=480 Brightness=0.800000 Contrast=0.700000 Gamma=0.800000 UseJoystick=False CaptureMouse=True StartupFullscreen=True ScreenFlashes=True NoLighting=False MinDesiredFrameRate=35.000000 AnimMeshDynamicLOD=0.000000 Decals=True Coronas=True DecoLayers=True Projectors=True NoDynamicLights=False ReportDynamicUploads=False TextureDetailInterface=Higher TextureDetailTerrain=UltraHigh TextureDetailWeaponSkin=UltraHigh TextureDetailPlayerSkin=UltraHigh TextureDetailWorld=UltraHigh TextureDetailRenderMap=UltraHigh TextureDetailLightmap=UltraHigh NoFractalAnim=False ScaleHUDX=0.000000 MouseXMultiplier=1.000000 MouseYMultiplier=1.000000 UseSpeechRecognition=True WeatherEffects=True DrawDistanceLOD=1.000000 [SDLDrv.SDLClient] WindowedViewportX=640 WindowedViewportY=480 FullscreenViewportX=800 FullscreenViewportY=600 MenuViewportX=640 MenuViewportY=480 Brightness=0.800000 Contrast=0.700000 Gamma=0.800000 UseJoystick=False JoystickNumber=0 IgnoreHat=False JoystickHatNumber=0 CaptureMouse=True StartupFullscreen=True ScreenFlashes=True NoLighting=False MinDesiredFrameRate=35.000000 AnimMeshDynamicLOD=0.0 Decals=True Coronas=True DecoLayers=True Projectors=True NoDynamicLights=False ReportDynamicUploads=False TextureDetailInterface=Normal TextureDetailTerrain=Normal TextureDetailWeaponSkin=Normal TextureDetailPlayerSkin=Normal TextureDetailWorld=Normal TextureDetailRenderMap=Normal TextureDetailLightmap=UltraHigh TextureMaxLOD=0 TextureMinLOD=0 NoFractalAnim=False WeatherEffects=True DrawDistanceLOD=1.0 IgnoreUngrabbedMouse=False AllowUnicodeKeys=False AllowCommandQKeys=True MacFakeMouseButtons=True MacKeepAllScreensOn=False TextToSpeechFile= MacNativeTextToSpeech=True [ALAudio.ALAudioSubsystem] UseEAX=False Use3DSound=False UseDefaultDriver=True CompatibilityMode=False MaxEAXVersion=255 UsePrecache=True ReverseStereo=False Channels=32 MusicVolume=0.200000 AmbientVolume=0.500000 SoundVolume=0.600000 VoiceVolume=4.000000 VolumeScaleRec=0.100000 DopplerFactor=1.000000 Rolloff=0.500000 TimeBetweenHWUpdates=15.000000 DisablePitch=False LowQualitySound=False UseVoIP=True UseVAD=False UseSpatializedVoice=False SpatializedVoiceRadius=100000.000000 EnhancedDenoiser=False LocalZOffset=0.000000 [IpDrv.TcpNetDriver] AllowDownloads=True ConnectionTimeout=20.0 InitialConnectTimeout=200.0 AckTimeout=1.0 KeepAliveTime=0.2 MaxClientRate=15000 MaxInternetClientRate=10000 SimLatency=0 RelevantTimeout=5.0 SpawnPrioritySeconds=1.0 ServerTravelPause=4.0 NetServerMaxTickRate=20 LanServerMaxTickRate=35 DownloadManagers=IpDrv.HTTPDownload DownloadManagers=Engine.ChannelDownload AllowPlayerPortUnreach=False LogPortUnreach=False MaxConnPerIPPerMinute=5 LogMaxConnPerIPPerMin=False [IpServer.UdpServerQuery] GameName=ut2 [IpDrv.MasterServerUplink] DoUplink=True UplinkToGamespy=True SendStats=True ServerBehindNAT=False DoLANBroadcast=False bIgnoreUTANBans=False [IpDrv.MasterServerLink] LANPort=11777 LANServerPort=10777 MasterServerList=(Address="ut2004master1.epicgames.com",Port=28902) MasterServerList=(Address="ut2004master2.epicgames.com",Port=28902) [IpDrv.HTTPDownload] RedirectToURL= ProxyServerHost= ProxyServerPort=3128 UseCompression=True [Engine.DemoRecDriver] AllowDownloads=True DemoSpectatorClass=UnrealGame.DemoRecSpectator MaxClientRate=25000 ConnectionTimeout=15.0 InitialConnectTimeout=200.0 AckTimeout=1.0 KeepAliveTime=1.0 SimLatency=0 RelevantTimeout=5.0 SpawnPrioritySeconds=1.0 ServerTravelPause=4.0 NetServerMaxTickRate=30 LanServerMaxTickRate=30 [Engine.GameReplicationInfo] ServerName=UT2004 Server ShortName=UT2 Server ServerRegion=0 AdminName=KSK_Soldatin AdminEmail= MessageOfTheDay= [D3DDrv.D3DRenderDevice] DetailTextures=True HighDetailActors=True SuperHighDetailActors=True UsePrecaching=True UseTrilinear=True AdapterNumber=-1 ReduceMouseLag=True UseTripleBuffering=False UseHardwareTL=True UseHardwareVS=True UseCubemaps=True DesiredRefreshRate=60 UseCompressedLightmaps=True UseStencil=False Use16bit=False Use16bitTextures=False MaxPixelShaderVersion=255 UseVSync=False LevelOfAnisotropy=1 DetailTexMipBias=0.000000 DefaultTexMipBias=-0.500000 UseNPatches=False TesselationFactor=1.000000 CheckForOverflow=False AvoidHitches=False OverrideDesktopRefreshRate=False ReportUnusedTextures=False DecompressTextures=False TerrainLOD=0 SkyboxHack=False LowQualityTerrain=False [D3D9Drv.D3D9RenderDevice] DetailTextures=True HighDetailActors=True SuperHighDetailActors=True UsePrecaching=True UseTrilinear=True AdapterNumber=-1 ReduceMouseLag=True UseTripleBuffering=False UseHardwareTL=True UseHardwareVS=True UseCubemaps=True DesiredRefreshRate=60 UseCompressedLightmaps=True UseStencil=False Use16bit=False Use16bitTextures=False MaxPixelShaderVersion=255 UseVSync=False LevelOfAnisotropy=1 DetailTexMipBias=0.0 DefaultTexMipBias=-0.5 UseNPatches=False TesselationFactor=1.0 CheckForOverflow=False OverrideDesktopRefreshRate=False [OpenGLDrv.OpenGLRenderDevice] DetailTextures=True HighDetailActors=True SuperHighDetailActors=True UsePrecaching=True UseCompressedLightmaps=True UseTrilinear=True UseStencil=False MaxTextureUnits=8 VARSize=32 ReduceMouseLag=True UseVSync=False LevelOfAnisotropy=1.0 DetailTexMipBias=0.0 DefaultTexMipBias=-0.5 UseVBO=False UseVSync=False AppleVA=1 MultisampleBuffers=0 MultisampleSamples=0 MultisampleHint=2 [PixoDrv.PixoRenderDevice] FogEnabled=True Zoom2X=True SimpleMaterials=True LimitTextureSize=True LowQualityTerrain=True TerrainLOD=10 SkyboxHack=True FilterQuality3D=1 FilterQualityHUD=1 HighDetailActors=False SuperHighDetailActors=False ReduceMouseLag=False DesiredRefreshRate=0 DetailTexMipBias=0.000000 Use16bitTextures=False Use16bit=True UseStencil=False UseCompressedLightmaps=False DetailTextures=False UsePrecaching=True [Engine.NullRenderDevice] DetailTextures=True HighDetailActors=True SuperHighDetailActors=True UsePrecaching=True UseCompressedLightmaps=True UseStencil=False [Editor.EditorEngine] UseSound=True CacheSizeMegs=32 GridEnabled=True SnapVertices=False SnapDistance=1.000000 GridSize=(X=4.000000,Y=4.000000,Z=4.000000) RotGridEnabled=True RotGridSize=(Pitch=1024,Yaw=1024,Roll=1024) GameCommandLine=-log FovAngleDegrees=90.000000 GodMode=True AutoSave=True AutoSaveTimeMinutes=5 AutoSaveIndex=6 UseAxisIndicator=True MatineeCurveDetail=0.1 ShowIntWarnings=False UseSizingBox=True RenderDevice=D3DDrv.D3DRenderDevice AudioDevice=ALAudio.ALAudioSubsystem NetworkDevice=IpDrv.TcpNetDriver DemoRecordingDevice=Engine.DemoRecDriver Console=Engine.Console Language=ute AlwaysShowTerrain=False UseActorRotationGizmo=False LoadEntirePackageWhenSaving=0 EditPackages=Core EditPackages=Engine EditPackages=Fire EditPackages=Editor EditPackages=UnrealEd EditPackages=IpDrv EditPackages=UWeb EditPackages=GamePlay EditPackages=UnrealGame EditPackages=XGame_rc EditPackages=XEffects EditPackages=XWeapons_rc EditPackages=XPickups_rc EditPackages=XPickups EditPackages=XGame EditPackages=XWeapons EditPackages=XInterface EditPackages=XAdmin EditPackages=XWebAdmin EditPackages=Vehicles EditPackages=BonusPack EditPackages=SkaarjPack_rc EditPackages=SkaarjPack EditPackages=UTClassic EditPackages=UT2k4Assault EditPackages=Onslaught EditPackages=GUI2K4 EditPackages=UT2k4AssaultFull EditPackages=OnslaughtFull EditPackages=xVoting EditPackages=StreamlineFX EditPackages=UTV2004c EditPackages=UTV2004s CutdownPackages=Core CutdownPackages=Editor CutdownPackages=Engine CutdownPackages=Fire CutdownPackages=GamePlay CutdownPackages=GUI2K4 CutdownPackages=IpDrv CutdownPackages=UT2K4Assault CutdownPackages=Onslaught CutdownPackages=UnrealEd CutdownPackages=UnrealGame CutdownPackages=UTClassic CutdownPackages=UWeb CutdownPackages=Vehicles CutdownPackages=XAdmin CutdownPackages=XEffects CutdownPackages=XGame CutdownPackages=XGame_rc CutdownPackages=XInterface CutdownPackages=XPickups CutdownPackages=XPickups_rc CutdownPackages=XWeapons CutdownPackages=XWeapons_rc CutdownPackages=XWebAdmin CutdownPackages=XVoting [UWeb.WebServer] Applications[0]=xWebAdmin.UTServerAdmin ApplicationPaths[0]=/ServerAdmin Applications[1]=xWebAdmin.UTImageServer ApplicationPaths[1]=/images bEnabled=True ListenPort=80 [Engine.Console] ConsoleHotKey=9 TimePerTitle=30.000000 TimePerDemo=60.000000 TimePerSoak=3600.000000 TimeTooIdle=0.000000 DemoLevels[0]=DM-Curse3 DemoLevels[1]=DM-Antalus DemoLevels[2]=CTF-Chrome DemoLevels[3]=DOM-SunTemple DemoLevels[4]=BR-Endagra TimeBeforeReboot=5.000000 DemoLevels[5]= DemoLevels[6]= DemoLevels[7]= DemoLevels[8]= DemoLevels[9]= DemoLevels[10]= DemoLevels[11]= DemoLevels[12]= DemoLevels[13]= DemoLevels[14]= DemoLevels[15]= DemoLevels[16]= DemoLevels[17]= DemoLevels[18]= DemoLevels[19]= DemoLevels[20]= DemoLevels[21]= DemoLevels[22]= DemoLevels[23]= DemoLevels[24]= DemoLevels[25]= DemoLevels[26]= DemoLevels[27]= DemoLevels[28]= DemoLevels[29]= DemoLevels[30]= DemoLevels[31]= DemoLevels[32]= DemoLevels[33]= DemoLevels[34]= DemoLevels[35]= DemoLevels[36]= DemoLevels[37]= DemoLevels[38]= DemoLevels[39]= DemoLevels[40]= DemoLevels[41]= DemoLevels[42]= DemoLevels[43]= DemoLevels[44]= DemoLevels[45]= DemoLevels[46]= DemoLevels[47]= DemoLevels[48]= DemoLevels[49]= DemoLevels[50]= DemoLevels[51]= DemoLevels[52]= DemoLevels[53]= DemoLevels[54]= DemoLevels[55]= DemoLevels[56]= DemoLevels[57]= DemoLevels[58]= DemoLevels[59]= DemoLevels[60]= DemoLevels[61]= DemoLevels[62]= DemoLevels[63]= [Engine.AccessControl] AdminPassword=admin GamePassword= bBanByID=True LoginDelaySeconds=0.000000 IPPolicies=ACCEPT;* [Engine.GameInfo] GoreLevel=1 MaxSpectators=2 MaxPlayers=16 AutoAim=1.000000 GameSpeed=1.000000 bChangeLevels=True bStartUpLocked=False bNoBots=False bAttractAlwaysFirstPerson=False NumMusicFiles=13 bEnableStatLogging=false HUDType=Engine.Hud MaxLives=0 TimeLimit=0 GoalScore=0 GameStatsClass=IpDrv.MasterServerGameStats SecurityClass=UnrealGame.UnrealSecurity AccessControlClass=Engine.AccessControl VotingHandlerType=xVoting.xVotingHandler MaxIdleTime=0.000000 bWeaponStay=False bAllowWeaponThrowing=True bAllowBehindView=False bAdminCanPause=False bWeaponShouldViewShake=True bLowGore=False bLargeGameVOIP=False GameDifficulty=4.000000 ResetTimeDelay=0 MaplistHandlerType= ServerSkillLevel= [Engine.AmbientSound] AmbientVolume=0.25 [Engine.LevelInfo] PhysicsDetailLevel=PDL_High MeshLODDetailLevel=MDL_Ultra bLowSoundDetail=False DecalStayScale=2.000000 bNeverPrecache=false bShouldPreload=True bDesireSkinPreload=True bKickLiveIdlers=False MaxClientFrameRate=90.000000 MaxTimeMargin=1.000000 TimeMarginSlack=1.350000 MinTimeMargin=-1.000000 [XInterface.ExtendedConsole] ConsoleHotKey=192 NeedPasswordMenuClass=GUI2K4.UT2K4GetPassword bSpeechMenuUseMouseWheel=True bSpeechMenuUseLetters=False SMOriginX=0.010000 SMOriginY=0.300000 LetterKeys[0]=IK_Q LetterKeys[1]=IK_W LetterKeys[2]=IK_E LetterKeys[3]=IK_R LetterKeys[4]=IK_A LetterKeys[5]=IK_S LetterKeys[6]=IK_D LetterKeys[7]=IK_F LetterKeys[8]=IK_Z LetterKeys[9]=IK_X MusicManagerClassName=GUI2K4.StreamPlayer MaxScrollbackSize=128 PasswordPromptMenu= ChatMenuClass=GUI2K4.UT2K4InGameChat StatsPromptMenuClass=GUI2K4.UT2K4StatsPrompt WaitingGameClassName= ServerInfoMenu=GUI2K4.UT2K4ServerInfo bDemoJogKeys=True Favorites=(ServerID=0,IP="lorenzstr.no-ip.info",Port=7777,QueryPort=7778,ServerName="Unknown Server") SavedPasswords=(Server="lorenzstr.no-ip.info",Password="foobar") SavedPasswords=(Server="84.152.88.27",Password="foobar") [XGame.xDeathMatch] HUDType=XInterface.HudBDeathMatch MaxLives=0 TimeLimit=12 GoalScore=20 bTeamScoreRound=False bPlayersMustBeReady=False bAllowTaunts=True bForceRespawn=False bWeaponStay=true bCustomPreload=False NetWait=5 bAdjustSkill=False bAllowTrans=False SpawnProtectionTime=2.000000 LateEntryLives=1 LoginMenuClass=GUI2K4.UT2K4PlayerLoginMenu bAllowPrivateChat=True bAllowWeaponThrowing=True ResetTimeDelay=0 [XGame.xTeamGame] HUDType=XInterface.HudBTeamDeathMatch MaxLives=0 TimeLimit=20 GoalScore=60 bTeamScoreRound=False bPlayersMustBeReady=False bAllowTaunts=True FriendlyFireScale=0 MaxTeamSize=16 bForceRespawn=False bWeaponStay=true [XGame.xCTFGame] HUDType=XInterface.HudBCaptureTheFlag MaxLives=0 TimeLimit=20 GoalScore=3 bTeamScoreRound=False bPlayersMustBeReady=False bAllowTaunts=True FriendlyFireScale=0.000000 MaxTeamSize=16 bForceRespawn=False bWeaponStay=true bAllowNonTeamChat=False NetWait=5 bAdjustSkill=False bAllowTrans=True SpawnProtectionTime=2.000000 LateEntryLives=1 LoginMenuClass=GUI2K4.UT2K4PlayerLoginMenu bAllowPrivateChat=True bAllowWeaponThrowing=True ResetTimeDelay=0 [XGame.xDoubleDom] HUDType=XInterface.HudBDoubleDomination MaxLives=0 TimeLimit=20 GoalScore=3 bTeamScoreRound=False bPlayersMustBeReady=False bAllowTaunts=True TimeToScore=10 TimeDisabled=10 FriendlyFireScale=0 MaxTeamSize=16 bForceRespawn=False bWeaponStay=true [XGame.xBombingRun] HUDType=XInterface.HudBBombingRun MaxLives=0 TimeLimit=20 GoalScore=15 bTeamScoreRound=False bPlayersMustBeReady=False bAllowTaunts=True FriendlyFireScale=0 MaxTeamSize=16 bForceRespawn=False bWeaponStay=true [Engine.MaplistManager] Games=(GameType="BonusPack.xLastManStandingGame",ActiveMaplist="Default LMS") Games=(GameType="BonusPack.xMutantGame",ActiveMaplist="Default MUT") Games=(GameType="Onslaught.ONSOnslaughtGame",ActiveMaplist="Default ONS") Games=(GameType="SkaarjPack.Invasion",ActiveMaplist="Default INV") Games=(GameType="UT2k4Assault.ASGameInfo",ActiveMaplist="Default AS") Games=(GameType="XGame.xBombingRun",ActiveMaplist="Default BR") Games=(GameType="XGame.xCTFGame",ActiveMaplist="Default CTF") Games=(GameType="XGame.xDeathMatch",ActiveMaplist="Default DM") Games=(GameType="XGame.xDoubleDom",ActiveMaplist="Default DOM2") Games=(GameType="XGame.xTeamGame",ActiveMaplist="Default TDM") Games=(GameType="XGame.xVehicleCTFGame",ActiveMaplist="Default VCTF") Games=(GameType="XGame.InstagibCTF",ActiveMaplist="Default ICTF") Games=(GameType="Jailbreak.Jailbreak",ActiveMaplist="Default JB") [DefaultDM MaplistRecord] DefaultTitle=Default DM DefaultGameType=XGame.xDeathMatch DefaultActive=1 DefaultMaps=DM-Curse4 DefaultMaps=DM-Corrugation DefaultMaps=DM-1on1-Albatross DefaultMaps=DM-1on1-Desolation DefaultMaps=DM-1on1-Idoma DefaultMaps=DM-1on1-Irondust DefaultMaps=DM-1on1-Mixer DefaultMaps=DM-1on1-Roughinery DefaultMaps=DM-1on1-Spirit DefaultMaps=DM-1on1-Squader DefaultMaps=DM-1on1-Trite [DefaultTDM MaplistRecord] DefaultTitle=Default TDM DefaultGameType=XGame.xTeamGame DefaultActive=0 DefaultMaps=DM-RRAJIGAR DefaultMaps=DM-RANKIN DefaultMaps=DM-CORRUGATION DefaultMaps=DM-DE-GRENDELKEEP DefaultMaps=DM-DE-IRONIC DefaultMaps=DM-DE-OSIRIS2 DefaultMaps=DM-GESTALT DefaultMaps=DM-IRONDEITY DefaultMaps=DM-METALLURGY DefaultMaps=DM-Deck17 DefaultMaps=DM-Antalus DefaultMaps=DM-Asbestos DefaultMaps=DM-Curse4 [1on1TeamDeathmatch MaplistRecord] DefaultTitle=1 on 1 Team Deathmatch DefaultGameType=XGame.xTeamGame DefaultActive=0 DefaultMaps=DM-1on1-Albatross DefaultMaps=DM-1on1-Crash DefaultMaps=DM-1on1-Desolation DefaultMaps=DM-1on1-Idoma DefaultMaps=DM-1on1-Irondust DefaultMaps=DM-1on1-Mixer DefaultMaps=DM-1on1-Roughinery DefaultMaps=DM-1on1-Serpentine DefaultMaps=DM-1on1-Spirit DefaultMaps=DM-1on1-Squader DefaultMaps=DM-1on1-Trite [1on1Deathmatch MaplistRecord] DefaultTitle=1 on 1 Deathmatch DefaultGameType=XGame.xDeathMatch DefaultActive=0 DefaultMaps=DM-1on1-Albatross DefaultMaps=DM-1on1-Crash DefaultMaps=DM-1on1-Desolation DefaultMaps=DM-1on1-Idoma DefaultMaps=DM-1on1-Irondust DefaultMaps=DM-1on1-Mixer DefaultMaps=DM-1on1-Roughinery DefaultMaps=DM-1on1-Serpentine DefaultMaps=DM-1on1-Spirit DefaultMaps=DM-1on1-Squader DefaultMaps=DM-1on1-Trite [XInterface.MapListDeathMatch] MapNum=1 Maps=DM-Curse4 Maps=DM-Corrugation Maps=DM-1on1-Albatross Maps=DM-1on1-Desolation Maps=DM-1on1-Idoma Maps=DM-1on1-Irondust Maps=DM-1on1-Mixer Maps=DM-1on1-Roughinery Maps=DM-1on1-Spirit Maps=DM-1on1-Squader Maps=DM-1on1-Trite [XInterface.MapListTeamDeathMatch] MapNum=0 Maps=DM-RRAJIGAR Maps=DM-RANKIN Maps=DM-CORRUGATION Maps=DM-DE-GRENDELKEEP Maps=DM-DE-IRONIC Maps=DM-DE-OSIRIS2 Maps=DM-GESTALT Maps=DM-IRONDEITY Maps=DM-METALLURGY Maps=DM-Deck17 Maps=DM-Antalus Maps=DM-Asbestos Maps=DM-Curse4 [XInterface.MapListCaptureTheFlag] MapNum=0 Maps=CTF-ABSOLUTEZERO Maps=CTF-MOONDRAGON Maps=CTF-GRASSYKNOLL Maps=CTF-COLOSSUS Maps=CTF-SMOTE Maps=CTF-DOUBLEDAMMAGE Maps=CTF-AVARIS Maps=CTF-BRIDGEOFFATE Maps=CTF-FaceClassic Maps=CTF-CHROME Maps=CTF-Citadel Maps=CTF-Orbital2 [XInterface.MapListDoubleDomination] MapNum=0 Maps=DOM-ATLANTIS Maps=DOM-ACCESS Maps=DOM-ASWAN Maps=DOM-JUNKYARD Maps=DOM-RENASCENT Maps=DOM-SUNTEMPLE Maps=DOM-SCORCHEDEARTH [XInterface.MapListBombingRun] MapNum=0 Maps=BR-TWINTOMBS Maps=BR-BRIDGEOFFATE Maps=BR-CANYON Maps=BR-COLOSSUS Maps=BR-SERENITY Maps=BR-SkyLine Maps=BR-Anubis [BonusPack.MapListMutant] Maps=DM-RRAJIGAR Maps=DM-RANKIN Maps=DM-CORRUGATION Maps=DM-DE-GRENDELKEEP Maps=DM-DE-IRONIC Maps=DM-DE-OSIRIS2 Maps=DM-GESTALT Maps=DM-IRONDEITY Maps=DM-METALLURGY Maps=DM-Deck17 Maps=DM-Antalus Maps=DM-Asbestos Maps=DM-Curse4 [BonusPack.MapListLastManStanding] Maps=DM-RRAJIGAR Maps=DM-RANKIN Maps=DM-CORRUGATION Maps=DM-DE-GRENDELKEEP Maps=DM-DE-IRONIC Maps=DM-DE-OSIRIS2 Maps=DM-GESTALT Maps=DM-IRONDEITY Maps=DM-METALLURGY Maps=DM-Deck17 Maps=DM-Antalus Maps=DM-Asbestos Maps=DM-Curse4 [Onslaught.ONSMapListOnslaught] Maps=ONS-TORLAN?LinkSetup=Default Maps=ONS-ARCTICSTRONGHOLD?LinkSetup=Default Maps=ONS-CROSSFIRE?LinkSetup=Default Maps=ONS-DRIA?LinkSetup=Default Maps=ONS-SEVERANCE?LinkSetup=Default [Skaarjpack.MapListSkaarjInvasion] Maps=DM-RRAJIGAR Maps=DM-RANKIN Maps=DM-CORRUGATION Maps=DM-DE-GRENDELKEEP Maps=DM-DE-IRONIC Maps=DM-DE-OSIRIS2 Maps=DM-GESTALT Maps=DM-IRONDEITY Maps=DM-METALLURGY Maps=DM-Deck17 Maps=DM-Antalus Maps=DM-Asbestos [UT2K4Assault.ASMapList] MapNum=1 Maps=AS-CONVOY Maps=AS-FALLENCITY Maps=AS-MOTHERSHIP Maps=AS-GLACIER Maps=AS-ROBOTFACTORY Maps=AS-JUNKYARD [DefaultLMS MaplistRecord] DefaultTitle=Default LMS DefaultGameType=BonusPack.xLastManStandingGame DefaultActive=0 DefaultMaps=DM-RRAJIGAR DefaultMaps=DM-RANKIN DefaultMaps=DM-CORRUGATION DefaultMaps=DM-DE-GRENDELKEEP DefaultMaps=DM-DE-IRONIC DefaultMaps=DM-DE-OSIRIS2 DefaultMaps=DM-GESTALT DefaultMaps=DM-IRONDEITY DefaultMaps=DM-METALLURGY DefaultMaps=DM-Deck17 DefaultMaps=DM-Antalus DefaultMaps=DM-Asbestos DefaultMaps=DM-Curse4 [DefaultMUT MaplistRecord] DefaultTitle=Default MUT DefaultGameType=BonusPack.xMutantGame DefaultActive=0 DefaultMaps=DM-RRAJIGAR DefaultMaps=DM-RANKIN DefaultMaps=DM-CORRUGATION DefaultMaps=DM-DE-GRENDELKEEP DefaultMaps=DM-DE-IRONIC DefaultMaps=DM-DE-OSIRIS2 DefaultMaps=DM-GESTALT DefaultMaps=DM-IRONDEITY DefaultMaps=DM-METALLURGY DefaultMaps=DM-Deck17 DefaultMaps=DM-Antalus DefaultMaps=DM-Asbestos DefaultMaps=DM-Curse4 [DefaultONS MaplistRecord] DefaultTitle=Default ONS DefaultGameType=Onslaught.ONSOnslaughtGame DefaultActive=0 DefaultMaps=ONS-TORLAN?LinkSetup=Default DefaultMaps=ONS-ARCTICSTRONGHOLD?LinkSetup=Default DefaultMaps=ONS-CROSSFIRE?LinkSetup=Default DefaultMaps=ONS-DRIA?LinkSetup=Default DefaultMaps=ONS-SEVERANCE?LinkSetup=Default [DefaultINV MaplistRecord] DefaultTitle=Default INV DefaultGameType=SkaarjPack.Invasion DefaultActive=0 DefaultMaps=DM-RRAJIGAR DefaultMaps=DM-RANKIN DefaultMaps=DM-CORRUGATION DefaultMaps=DM-DE-GRENDELKEEP DefaultMaps=DM-DE-IRONIC DefaultMaps=DM-DE-OSIRIS2 DefaultMaps=DM-GESTALT DefaultMaps=DM-IRONDEITY DefaultMaps=DM-METALLURGY DefaultMaps=DM-Deck17 DefaultMaps=DM-Antalus DefaultMaps=DM-Asbestos [DefaultAS MaplistRecord] DefaultTitle=Default AS DefaultGameType=UT2k4Assault.ASGameInfo DefaultActive=1 DefaultMaps=AS-CONVOY DefaultMaps=AS-FALLENCITY DefaultMaps=AS-MOTHERSHIP DefaultMaps=AS-GLACIER DefaultMaps=AS-ROBOTFACTORY DefaultMaps=AS-JUNKYARD [DefaultICTF MaplistRecord] DefaultTitle=Default ICTF DefaultGameType=XGame.InstagibCTF DefaultActive=0 DefaultMaps=CTF-ABSOLUTEZERO DefaultMaps=CTF-MOONDRAGON DefaultMaps=CTF-GRASSYKNOLL DefaultMaps=CTF-COLOSSUS DefaultMaps=CTF-SMOTE DefaultMaps=CTF-DOUBLEDAMMAGE DefaultMaps=CTF-AVARIS DefaultMaps=CTF-BRIDGEOFFATE DefaultMaps=CTF-FaceClassic DefaultMaps=CTF-CHROME DefaultMaps=CTF-Citadel DefaultMaps=CTF-Orbital2 [DefaultBR MaplistRecord] DefaultTitle=Default BR DefaultGameType=XGame.xBombingRun DefaultActive=0 DefaultMaps=BR-TWINTOMBS DefaultMaps=BR-BRIDGEOFFATE DefaultMaps=BR-CANYON DefaultMaps=BR-COLOSSUS DefaultMaps=BR-SERENITY DefaultMaps=BR-SkyLine DefaultMaps=BR-Anubis [DefaultCTF MaplistRecord] DefaultTitle=Default CTF DefaultGameType=XGame.xCTFGame DefaultActive=0 DefaultMaps=CTF-ABSOLUTEZERO DefaultMaps=CTF-MOONDRAGON DefaultMaps=CTF-GRASSYKNOLL DefaultMaps=CTF-COLOSSUS DefaultMaps=CTF-SMOTE DefaultMaps=CTF-DOUBLEDAMMAGE DefaultMaps=CTF-AVARIS DefaultMaps=CTF-BRIDGEOFFATE DefaultMaps=CTF-FaceClassic DefaultMaps=CTF-CHROME DefaultMaps=CTF-Citadel DefaultMaps=CTF-Orbital2 [DefaultDOM2 MaplistRecord] DefaultTitle=Default DOM2 DefaultGameType=XGame.xDoubleDom DefaultActive=0 DefaultMaps=DOM-ATLANTIS DefaultMaps=DOM-ACCESS DefaultMaps=DOM-ASWAN DefaultMaps=DOM-JUNKYARD DefaultMaps=DOM-RENASCENT DefaultMaps=DOM-SUNTEMPLE DefaultMaps=DOM-SCORCHEDEARTH [DefaultVCTF MaplistRecord] DefaultTitle=Default VCTF DefaultGameType=XGame.xVehicleCTFGame DefaultActive=0 [UnrealGame.DeathMatch] MinNetPlayers=1 RestartWait=30 bTournament=False bAutoNumBots=False bColoredDMSkins=False bPlayersMustBeReady=False bWaitForNetPlayers=False bAllowPlayerLights=False bForceDefaultCharacter=False NamePrefixes[0]=Mr_ NamePrefixes[1]= NamePrefixes[2]=The_Real_ NamePrefixes[3]=Evil_ NamePrefixes[4]= NamePrefixes[5]=Owns_ NamePrefixes[6]= NamePrefixes[7]=Evil_ NamePrefixes[8]= NamePrefixes[9]= NameSuffixes[0]= NameSuffixes[1]=_is_lame NameSuffixes[2]= NameSuffixes[3]= NameSuffixes[4]=_sucks NameSuffixes[5]= NameSuffixes[6]=_OwnsYou NameSuffixes[7]= NameSuffixes[8]=_jr NameSuffixes[9]='s_clone [UnrealGame.UnrealMPGameInfo] BotMode=1 MinPlayers=6 EndTimeDelay=4.000000 BotRatio=1.000000 [Engine.VoiceChatReplicationInfo] bEnableVoiceChat=True bAllowLocalBroadcast=True MaxChatters=0 LocalBroadcastRange=1000.000000 DefaultBroadcastRadius=20.000000 VoIPInternetCodecs=CODEC_48NB VoIPLANCodecs=CODEC_48NB VoIPLANCodecs=CODEC_96WB [Engine.BroadcastHandler] bMuteSpectators=False bPartitionSpectators=False [xVoting.xVotingHandler] VoteTimeLimit=70 ScoreBoardDelay=5 bAutoOpen=True MidGameVotePercent=50 bScoreMode=False bAccumulationMode=False bEliminationMode=False MinMapCount=2 MapVoteHistoryType=xVoting.MapVoteHistory_INI RepeatLimit=4 DefaultGameConfig=0 bDefaultToCurrentGameType=True bMapVote=False bKickVote=False bMatchSetup=False KickPercent=51 bAnonymousKicking=True MapListLoaderType=xVoting.DefaultMapListLoader ServerNumber=1 CurrentGameConfig=0 [xVoting.DefaultMapListLoader] bUseMapList=False MapNamePrefixes= [Jailbreak.JBMapList] Maps=JB-Addien-Dwy-Gold Maps=JB-BabylonTemple-Gold Maps=JB-CastleBreak-Gold Maps=JB-Cosmos Maps=JB-Poseidon-Gold Maps=JB-Oasis Maps=JB-Cavern Maps=JB-MoonCraters-Gold Maps=JB-Aswan Maps=JB-SavoIsland-Gold Maps=JB-NoSense-Gold Maps=JB-Conduit-Gold Maps=JB-IndusRage2-Gold Maps=JB-Arlon-Gold Maps=JB-SubZero Maps=JB-Solamander-Gold MapNum=0 [DefaultJB MaplistRecord] DefaultTitle=Default JB DefaultGameType=Jailbreak.Jailbreak DefaultActive=0 DefaultMaps=JB-Addien-Dwy-Gold DefaultMaps=JB-BabylonTemple-Gold DefaultMaps=JB-CastleBreak-Gold DefaultMaps=JB-Cosmos DefaultMaps=JB-Poseidon-Gold DefaultMaps=JB-Oasis DefaultMaps=JB-Cavern DefaultMaps=JB-MoonCraters-Gold DefaultMaps=JB-Aswan DefaultMaps=JB-SavoIsland-Gold DefaultMaps=JB-NoSense-Gold DefaultMaps=JB-Conduit-Gold DefaultMaps=JB-IndusRage2-Gold DefaultMaps=JB-Arlon-Gold DefaultMaps=JB-SubZero DefaultMaps=JB-Solamander-Gold [Jailbreak.Jailbreak] Addons=JBAddonAvenger.JBAddonAvenger,JBAddonCelebration.JBAddonCelebration,JBAddonLlama.JBAddonLlama,JBAddonProtection.JBAddonProtection bEnableJailFights=True bEnableScreens=True bEnableSpectatorDeathCam=True bFavorHumansForArena=False bEnableWebScoreboard=True bEnableWebAdminExtension=True WebScoreboardClass=Jailbreak.JBWebApplicationScoreboard WebScoreboardPath=/scoreboard bAllowNonTeamChat=False FriendlyFireScale=0.000000 NetWait=5 bForceRespawn=False bAdjustSkill=False bAllowTaunts=True bAllowTrans=False SpawnProtectionTime=2.000000 LateEntryLives=1 LoginMenuClass=GUI2K4.UT2K4PlayerLoginMenu bAllowPrivateChat=True bWeaponStay=True bAllowWeaponThrowing=True ResetTimeDelay=0 GoalScore=1 MaxLives=0 TimeLimit=20 [UnrealGame.TeamGame] bBalanceTeams=True bPlayersBalanceTeams=True [Jailbreak.JBInteractionKeys] AutoBoundKeys= [UT2k4Assault.ASGameInfo] RoundLimit=1 RoundTimeLimit=14 PracticeTimeLimit=0 ReinforcementsFreq=7 bAllowNonTeamChat=False FriendlyFireScale=0.000000 NetWait=15 bForceRespawn=False bAdjustSkill=False bAllowTaunts=True bAllowTrans=False SpawnProtectionTime=3.000000 LateEntryLives=1 LoginMenuClass=GUI2K4.UT2K4SinglePlayerLoginMenu bAllowPrivateChat=True bWeaponStay=True bAllowWeaponThrowing=True ResetTimeDelay=8 GoalScore=0 MaxLives=0 TimeLimit=0 [IpDrv.UdpGamespyQuery] MinNetVer=0 OldQueryPortNumber=7787 bRestartServerOnPortSwap=True bDebugPortSwaps=True [Onslaught.ONSOnslaughtGame] OvertimeCoreDrainPerSec=20 bRandSetupAfterReset=False bSwapSidesAfterReset=True bAllowNonTeamChat=False FriendlyFireScale=1.000000 NetWait=15 bForceRespawn=False bAdjustSkill=False bAllowTaunts=True bAllowTrans=False SpawnProtectionTime=2.000000 LateEntryLives=1 LoginMenuClass=GUI2K4.UT2K4OnslaughtLoginMenu bAllowPrivateChat=True bWeaponStay=True bAllowWeaponThrowing=True ResetTimeDelay=11 GoalScore=3 MaxLives=0 TimeLimit=20
Da drin such mal was bestimmtes von dem du nicht genau weißt wie es heißt, hab ich schon ein paar mal gemacht! Also ohne Baumstruktur kommt für mich mangels Ordnung nichts in Frage. Also fällt conf und ini komplett raus. XML find ich eigentlich ganz gut lesbar, ich würde als Nachteil eher sehen, dass es sauviel Platz braucht im Vergleich zu anderen Lösungen. Zu dem Lisp-Zeug was du vorschlägst (hat es wirklich was mit der Sprache zu tun? Geht es ohne Lisp nicht?) kann ich mangels Wissen jetzt nichts sagen.
-
@Optimizer
und wie sähe die Datei in XML aus?
-
So, dass die hunderttausend Sachen (hoffentlich) sinnvoll gruppiert sind. Klar, weniger wird es nicht, wenn es so viel zum Konfigurieren gibt, dann ist es so. Aber wenn ein übergeordneter Node schon mal nix ist, scrollst du du so lange runter, bis die Einrückung wieder zurückgeht, ist doch geil.
Also ich finde sowas schon übersichtlicher...
-
Optimizer schrieb:
So, dass die hunderttausend Sachen (hoffentlich) sinnvoll gruppiert sind. Klar, weniger wird es nicht, wenn es so viel zum Konfigurieren gibt, dann ist es so. Aber wenn ein übergeordneter Node schon mal nix ist, scrollst du du so lange runter, bis die Einrückung wieder zurückgeht, ist doch geil.
Also ich finde sowas schon übersichtlicher...
die sind doch auch so gruppiert. Wie du sagst, die Nodes werden nicht weniger, dafür kommt mehr Text. Ich weiß nicht ob mehr Text wirklich eine Hilfe gegen Unübersichtlichkeit einer Datei ist. Aber da wir hier keinen Vergleich haben, können wir beide nur spekulieren.