Quake 1 PAK dateien Entpacker von ??? |
Also hab mal ne Code erstellt womit man PAK dateien von Quake 1 und 2 auslesen/entpacken kann. Das ding ist gut um den ordner und ein besser übersicht zu haben :) [code:1:d2d51982c5] ; ----------------------------------------------------------------------------------------------------- ; Quake - Data Pack Code ; Source Code by Devastator ; Sequence Basic - http://sequence.rockt.de/ ; ----------------------------------------------------------------------------------------------------- Type PakFile Field KopfZeile$ Field PakBank End Type Type ExportFiles Field File$ Field SrcDir$ End Type ; ----------------------------------------------------------------------------------------------------- ; Ladet eine Pak in den Speicher ; PakDatei.PakFile=LoadPakFile(Datei$) ; ----------------------------------------------------------------------------------------------------- Function Load_PakFile.PakFile(File$) If Instr(File$,".")=0 Then File$=File$+".pak" If FileType(File$)=0 Then RuntimeError "PAK File not found !!" FileS=FileSize(File$)+1 Temp.PakFile=New PakFile TempPakBank=CreateBank(FileS) Filein=OpenFile(File$) ReadBytes TempPakBank,Filein,0,FileS CloseFile Filein For z=0 To 3 Byte=PeekByte(TempPakBank,z) FileErkennung$=FileErkennung$+Chr$(Byte) Next If FileErkennung$<>"PACK" Then RuntimeError File$+" hat das falsche Format" HeadOffset=PeekInt(TempPakBank,4) HeadSize=PeekInt(TempPakBank,8) HeadSize=HeadOffset+HeadSize Repeat HeadStart=HeadOffset HeadEnde=HeadOffset+64-8 FileName$="" For Packet=HeadStart To HeadEnde Char=PeekByte(TempPakBank,Packet) If Char>0 Then FileName$=FileName$+Chr$(Char): Else Exit Next HeadOffset=HeadOffset+56 FileOffset=PeekInt(TempPakBank,HeadOffset) Size=PeekInt(TempPakBank,HeadOffset+4) HeadOffset=HeadOffset+8 Tempkopfzeile=Tempkopfzeile+Lower$(FileName$)+Chr$(34) Tempkopfzeile=Tempkopfzeile+FileOffset+"|" Tempkopfzeile=Tempkopfzeile+Size+"?" If HeadOffset=>HeadSize Then Exit Forever Tempkopfzeile=Replace$(Tempkopfzeile,"/","") Return Temp End Function ; ----------------------------------------------------------------------------------------------------- ; Exportiert eine Datei aus der Pak Datei ; ExportPakFile PakBank,Datei$(,Zum Verzeichniss) ; ----------------------------------------------------------------------------------------------------- Function Export_PakFile(Temp.PakFile,file$,ToDir$="") file$=Lower$(file$) ScanFile=Instr(Tempkopfzeile,file$+Chr$(34)) If ScanFile=0 Then Return Else SuchDir$=ToDir$+file$ Repeat SucheDirs=Instr(SuchDir$,"") If SucheDirs>0 Then CheckVerz$=Left$(SuchDir$,SucheDirs-1) If FileType(CheckVerz$)<>2 Then CreateDir Dest$+LastVerz$+CheckVerz$ SuchDir$=Replace$(SuchDir$,CheckVerz$+"","") LastVerz$=LastVerz$+CheckVerz$+"" Else Exit EndIf Forever export.exportfiles=New exportfiles:exportfile=file$:exportsrcdir=ToDir$ KopfZeile$=Mid$(Tempkopfzeile,ScanFile) Kopf=Instr(KopfZeile$,Chr$(34)) Offset=Instr(KopfZeile$,"|") Size=Instr(KopfZeile$,"?") Fileout=WriteFile(ToDir$+file$) WriteBytes TempPakBank,Fileout,Mid$(KopfZeile$,Kopf+1,Offset-Kopf),Mid$(KopfZeile$,Offset+1,Size-Offset) CloseFile Fileout EndIf End Function ; ----------------------------------------------------------------------------------------------------- ; Prüft ob die Gewählte Datei in der Pak Datei vorhaden ist ; ExportPakFile PakBank,Datei$ ; ----------------------------------------------------------------------------------------------------- Function Exist_PakFile%(Temp.PakFile,file$) ScanFile=Instr(Tempkopfzeile,file$+Chr$(34)) If ScanFile=0 Then Return 0:Else Return 1 End Function ; ----------------------------------------------------------------------------------------------------- ; Prüft zu zuerst ob die Datei in einen Ordner vorhaden ist wenn sie es nicht ist wird sie von der ; Pak Datei Entpackt und das Verzecihniss wird dann automatisch zurück geliefert. ; GrafikSound=LoadImage(LocalFile$(Datei$,SourceDir$)) ; ----------------------------------------------------------------------------------------------------- Function Local_File$(ScanFile$,SrcDir$) If FileType(ScanFile$) Return ScanFile$ Else File$=Lower$(Replace$(ScanFile$,SrcDir$+"","")) For PakFiles.PakFile=Each PakFile If Exist_PakFile(PakFiles,File$) TempDir$=SystemProperty$("TEMPDIR") If FileType(TempDir$+File$) Return TempDir$+File$ Else Export_PakFile PakFiles,File$,TempDir$ Return TempDir$+File$ EndIf ; Else ; RuntimeError ScanFile$+" konnte nicht gefunden werden" EndIf Next EndIf End Function ; ----------------------------------------------------------------------------------------------------- ; Löscht alle Dateien aus den Temp Verzeichniss die mit LocalFile Entpackt wurden sind ; DeleteExportPak ; ----------------------------------------------------------------------------------------------------- Function Delete_ExportPak() For export.exportfiles=Each exportfiles DebugLog exportsrcdir+exportfile DeleteFile exportsrcdir+exportfile Lang=Len(exportfile) Repeat If Lang=0 Then Exit If Mid$(exportfile,Lang,1)="" Then DeleteDir exportsrcdir+Left$(exportfile,Lang-1) Lang=Lang-1 Forever Delete export Next End Function ; ----------------------------------------------------------------------------------------------------- ; Listet eine Pak Datei auf ; ListPakFile PakBank,Zeigen,LogDatei$ ; ----------------------------------------------------------------------------------------------------- Function List_PakFile(Temp.PakFile,Hide=1,LogFile$="") KopfZeile$=Tempkopfzeile If LogFile$<>"" Then LogOut=WriteFile(LogFile$) Repeat ScanFile=Instr(KopfZeile$,file$+Chr$(34)) If ScanFile=0 Exit Else ScanSize=Instr(KopfZeile$,"?") If Hide=1 Then Print Left$(KopfZeile$,ScanFile-1) If LogFile$<>"" Then WriteLine LogOut,Left$(KopfZeile$,ScanFile-1) KopfZeile$=Mid$(KopfZeile$,ScanSize+1) EndIf Forever If LogFile$<>"" Then CloseFile LogOut End Function [/code:1:d2d51982c5] Wer ein paar fragen hat, soll sie nur stellen :D |
von ??? |
Moin. Ehm... dir ist schon klar, dass du eben nen ZIP Entpacker gecodet hast? Denn eine PAK datei von Quake ist ja nichts anderes als ne ZIP file ... cu, ST. |
von ??? |
Ist doch auch gut :) |
von ??? |
Moin. Ich meinen meinen letzten Post natürlich Positiv. Den einzigsten ZIP entpacker den ich für BB kenne ist auf BlitzBasic.com und als DLL vorhanden. Aber wenn ich mir den Quellcode so ansehe, dann muss das ein älteres ZIP Format sein, dass Quake benutzt. cu, ST. |
von ??? |
Ich frag mich bloss was du damit sagen willst ST ? das es nicht zu gebrauchen ist oder was ? Auser dem PAK ist kein ZIP Archiv sondern halt ein Daten Archiv bei den ZIP dateien werden die Dateien verkleiner so das die datei kleiner wird. Und bei der PAK datei werden sie einfach so wie sie sind gepackt. Und ne PAK Archiv hat garnichts mit ZIP zu tun. ZIP gabs schon vorher als PAK. |
von |
Moin. hm... sicher? Kann sein das ich mich irre, aber Heavy Metal FAKK (oder wies hieß) ist ja mit Quake 3 gemacht worden. Und da konnte ich eine Pack Datei mit WinZip Entpacken. Außerdem sagte ich nicht, dass es von Nachteil wäre. Ich sagte hier nur, dass es sogar Supi ist. Aber ich glaube, dass du recht hast. Vieleicht entpackt dein packer ja nur die Quake1 Daten oder so. Also gebrauchen kann man so was immer. Ahja. Eine Frage: Gibt es auch Routinen um eine PAK Datei zu erstellen? Dann könntest du ja sogar nen richtig Gutes Tool machen, damit man Quake1 Modden kann :) Interessant wärs allemal. cu, ST. |
von ??? |
nein normal will ich kein tool dafür machen es soll ja nur für rein entpacken sein. Da es sowieso schon sehr gute programme gibt die PAK dateien unterstützen und meiner meinung nach auch gut gehen. Da brauche ich bestimmt kein tool dafür raus zu bringen. Hab es eigenlich gemacht um PAK Archive in sein spiel mit einzubauen mehr net |