Compare commits

..

22 Commits

Author SHA1 Message Date
BodgeMaster 53173dd7c7 lib/zlibutil, tools/zlibutil: moving things around
This includes the following changes:
- Move the data type wrangling into the lib to make it easier to use
- Put the functions into their own `zlib` namespace
- Use ErrorOr instead of exceptions
- Error codes for compression/decompression
2024-06-10 06:29:30 +02:00
BodgeMaster 8482194b01 build system: update build commands for libs
I forgot this after changing the build system when resolving merge conflicts.
2024-06-08 23:59:55 +02:00
BodgeMaster 229392a7fe test/zlibutil: update to match changes in zlibutil, increase reliability
The following changes have been made:
- The test has been adjusted to zlibutil's changed behavior.
- The output of zlibutil isn’t checked against static data, instead it hands
  the compressed file to another decompressor. This was done because the exact
  output can change with updates to zlib itself (this appears to have happened
  in my case).
- The new test works with random data, reducing the likelihood of false passes.
- The new decompression test works with its own file for the same reason.
2024-06-08 15:59:03 +02:00
BodgeMaster a48c4dcd33 tools/zlibutil: Change CLI to act more like other compression utilities
Compression is now the implied default action, decompress with the -d flag.
2024-06-08 15:10:38 +02:00
BodgeMaster a787a89493 resources/region_files: add a zlib compressed chunk 2024-06-08 15:09:14 +02:00
BodgeMaster b9006cc6ea Build system: start moving the download handler to its own file 2024-06-08 15:09:14 +02:00
BodgeMaster eb8db35615 scripts/lib: Fix a bug in the `remove` function 2024-06-08 15:09:14 +02:00
BodgeMaster 9dd4489141 test/hexnet: remove useless (unimplemented) test 2024-06-08 15:08:37 +02:00
BodgeMaster d1c855857c Code style guidelines and resources/README: Minor documentation changes 2024-06-08 15:07:26 +02:00
BodgeMaster 8f8d51f459 lib/net/*: Move stuff around
I did this months ago with the intention to finally start implementing networking....
Yeah, that definitely panned out.

Also, Git is drunk with how it says files have been renamed, they’re just empty apart from the license notice.
2024-06-08 15:07:26 +02:00
BodgeMaster 8b13f72acc tools: Add zlibutil
Third time's the charm...
Editing this commit again to resolve merge conflicts.
- Bodge

Splitting one of Joca’s commits by topic - Bodge

Add zlibutil.cpp and zlib to the project's dependencies. - Joca
2024-06-08 15:06:50 +02:00
Joca 6ef1d401bb lib: Add zlibutil library and test script 2024-05-12 17:24:58 -03:00
Joca 1bcc5eae64 tools: Add ZLIBUTIL
Add zlibutil.cpp and zlib to the project's dependencies.
2024-03-12 22:37:09 -03:00
BodgeMaster 97b844c6d1 build system: add support for building shaders to SPIRV binaries
This adds the following to the project:
- glslc from Google’s shaderc
- src/shaders directory
- shaders are now built as part of the `build` command
- forcefully remove some files during the setup process and when cleaning
2024-01-07 20:07:33 +01:00
BodgeMaster 20857cb8c5 build system (setup_project): Comment out seemingly useless workarounds 2023-06-18 07:53:35 +02:00
BodgeMaster abc5491192 Update sockpp to version 0.8.1
This supposedly fixes a bunch of things, we’ll see...
2023-06-18 07:01:10 +02:00
BodgeMaster ad54f0a012 test/dumpnbt: Move expected output out of the script, also add another test
What was I thinking!?
2023-06-18 03:37:19 +02:00
BodgeMaster ae71322ba1 lib/nbt: Fix #80 2023-06-18 03:17:20 +02:00
BodgeMaster 01e5f5eaac lib/region: Start working on region file parser
Something is fishy with dumpnbt or lib/nbt.
Attempting to dump the extracted chunk fails, but external tools
do manage to parse it.
2023-05-29 14:47:19 +02:00
BodgeMaster 6112da2e6f lib/game: Start working on game internals
Btw: I lost the game.
2023-01-27 03:32:43 +01:00
BodgeMaster b07d6e2ff6 fossvg (client): Clean up GLFW-related code
- add some Vulkan-specific things to deal with GLFW
- get rid of useless warnings
- allow to set window size from the command line

The Window size is fixed for now because that will hopefully make
things easier in the strt. I intend to have a resizable window
in the future but getting things going is more important.
2023-01-27 01:20:29 +01:00
BodgeMaster 4247bd295a fossvg (client): Commit to using Vulkan
I have decided that we are going to use Vulkan for this. Hopefully, it works out.
This commit removes some OpenGL-specific things and adds Vulkan to the build command line.
2023-01-27 01:20:29 +01:00
45 changed files with 7759 additions and 6864 deletions

3
.gitignore vendored
View File

@ -24,6 +24,9 @@
# ignore nano's temp files
*.swp
# Ignore sublime text project files.
*.sublime-*
#vscode
.vscode

View File

@ -1,13 +1,3 @@
# WARNING: This is the Windows branch.
- Do NOT work on this branch. It is intended for building only.
- Do NOT merge back to master. This branch contains changes that would break the master branch.
- Original commits on this branch should only ever be made regarding fixes
to the build system or otherwise necessary changes to get FOSS-VG to build
and run on Windows.
- This branch will only be maintained as needed.
# FOSS-VG (FOSS Voxel Generator)
This is a WIP Minecraft clone.

View File

@ -22,10 +22,8 @@ each file.
Don't use excessive comments, use descriptive names instead.
There is no such thing as too long names (within reason, of course).
Don't have comments that go beyond 80 characters per line, preferably
slightly less.
Put comments on their own lines.
Format comments to improve readability, don't have long single-line comments.
Indent by four spaces.

Binary file not shown.

View File

@ -0,0 +1,122 @@
[0: Compound]:
|Header: 3 bytes
|Payload: 232 bytes
|Total: 235 bytes
|Length: 4
|
|[3: List] int8 arrays:
| |Header: 14 bytes
| |Payload: 29 bytes
| |Total: 43 bytes
| |Contained Type: Array of 8 Bit Integers
| |Length: 3
| |
| |[22: Array of 8 Bit Integers]:
| | |Payload: 8 bytes
| | |Total: 8 bytes
| | |Length: 4
| | 'Values:
| | |13
| | |37
| | |52
| | '81
| |
| |[30: Array of 8 Bit Integers]:
| | |Payload: 8 bytes
| | |Total: 8 bytes
| | |Length: 4
| | 'Values:
| | |80
| | |0
| | |81
| | '35
| |
| '[38: Array of 8 Bit Integers]:
| |Payload: 8 bytes
| |Total: 8 bytes
| |Length: 4
| 'Values:
| |0
| |0
| |34
| '-65
|
|
|[46: List] int32 arrays:
| |Header: 15 bytes
| |Payload: 97 bytes
| |Total: 112 bytes
| |Contained Type: Array of 32 Bit Integers
| |Length: 3
| |
| |[66: Array of 32 Bit Integers]:
| | |Payload: 16 bytes
| | |Total: 16 bytes
| | |Length: 3
| | 'Values:
| | |13859
| | |7677676
| | '1337
| |
| |[82: Array of 32 Bit Integers]:
| | |Payload: 68 bytes
| | |Total: 68 bytes
| | |Length: 16
| | 'Values:
| | |1
| | |2
| | |4
| | |8
| | |16
| | |32
| | |64
| | |128
| | |256
| | |512
| | |1024
| | |2048
| | |4096
| | |8192
| | |16384
| | '32768
| |
| '[150: Array of 32 Bit Integers]:
| |Payload: 8 bytes
| |Total: 8 bytes
| |Length: 1
| 'Values:
| '-100000
|
|
|[158: List] int64 arrays:
| |Header: 15 bytes
| |Payload: 61 bytes
| |Total: 76 bytes
| |Contained Type: Array of 64 Bit Integers
| |Length: 2
| |
| |[178: Array of 64 Bit Integers]:
| | |Payload: 28 bytes
| | |Total: 28 bytes
| | |Length: 3
| | 'Values:
| | |9999999998
| | |0
| | '77777666666666
| |
| '[206: Array of 64 Bit Integers]:
| |Payload: 28 bytes
| |Total: 28 bytes
| |Length: 3
| 'Values:
| |-2141414141414141
| |7680
| '900
|
|
'[234: End]:
|Header: 1 byte
|Payload: 0 bytes
'Total: 1 byte

View File

@ -0,0 +1,6 @@
[0: 64 Bit Integer] test:
|Header: 7 bytes
|Payload: 8 bytes
|Total: 15 bytes
'Value: 9223372036854775807

View File

@ -0,0 +1,12 @@
[0: 64 Bit Integer] test:
|Header: 7 bytes
|Payload: 8 bytes
|Total: 15 bytes
'Value: 9223372036854775807
[15: 32 Bit Integer] int32:
|Header: 8 bytes
|Payload: 4 bytes
|Total: 12 bytes
'Value: 1866009202

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,592 @@
[0: Compound]:
|Header: 3 bytes
|Payload: 792 bytes
|Total: 795 bytes
|Length: 3
|
|[3: List] 60:
| |Header: 5 bytes
| |Payload: 222 bytes
| |Total: 227 bytes
| |Contained Type: List
| |Length: 5
| |
| |[13: List]:
| | |Payload: 81 bytes
| | |Total: 81 bytes
| | |Contained Type: String
| | |Length: 3
| | |
| | |[18: String]:
| | | |Payload: 18 bytes
| | | |Total: 18 bytes
| | | 'Value: Du bist so dumm,
| | |
| | |[36: String]:
| | | |Payload: 38 bytes
| | | |Total: 38 bytes
| | | 'Value: Du wirfst nen Stein aufn Boden
| | |
| | '[74: String]:
| | |Payload: 20 bytes
| | |Total: 20 bytes
| | 'Value: und triffst nicht.
| |
| |
| |[94: List]:
| | |Payload: 12 bytes
| | |Total: 12 bytes
| | |Contained Type: 8 Bit Integer
| | |Length: 7
| | |
| | |[99: 8 Bit Integer]:
| | | |Payload: 1 byte
| | | |Total: 1 byte
| | | 'Value: 115
| | |
| | |[100: 8 Bit Integer]:
| | | |Payload: 1 byte
| | | |Total: 1 byte
| | | 'Value: 35
| | |
| | |[101: 8 Bit Integer]:
| | | |Payload: 1 byte
| | | |Total: 1 byte
| | | 'Value: 7
| | |
| | |[102: 8 Bit Integer]:
| | | |Payload: 1 byte
| | | |Total: 1 byte
| | | 'Value: -3
| | |
| | |[103: 8 Bit Integer]:
| | | |Payload: 1 byte
| | | |Total: 1 byte
| | | 'Value: 56
| | |
| | |[104: 8 Bit Integer]:
| | | |Payload: 1 byte
| | | |Total: 1 byte
| | | 'Value: 105
| | |
| | '[105: 8 Bit Integer]:
| | |Payload: 1 byte
| | |Total: 1 byte
| | 'Value: 125
| |
| |
| |[106: List]:
| | |Payload: 5 bytes
| | |Total: 5 bytes
| | |Contained Type: End
| | 'Length: 0
| |
| |[111: List]:
| | |Payload: 77 bytes
| | |Total: 77 bytes
| | |Contained Type: Compound
| | |Length: 3
| | |
| | |[116: Compound]:
| | | |Payload: 6 bytes
| | | |Total: 6 bytes
| | | |Length: 2
| | | |
| | | |[116: 8 Bit Integer] 3:
| | | | |Header: 4 bytes
| | | | |Payload: 1 byte
| | | | |Total: 5 bytes
| | | | 'Value: 105
| | | |
| | | '[121: End]:
| | | |Header: 1 byte
| | | |Payload: 0 bytes
| | | 'Total: 1 byte
| | |
| | |
| | |[122: Compound]:
| | | |Payload: 38 bytes
| | | |Total: 38 bytes
| | | |Length: 3
| | | |
| | | |[122: String] 600:
| | | | |Header: 6 bytes
| | | | |Payload: 5 bytes
| | | | |Total: 11 bytes
| | | | 'Value: 800
| | | |
| | | |[133: List] cookie:
| | | | |Header: 9 bytes
| | | | |Payload: 17 bytes
| | | | |Total: 26 bytes
| | | | |Contained Type: String
| | | | |Length: 3
| | | | |
| | | | |[147: String]:
| | | | | |Payload: 5 bytes
| | | | | |Total: 5 bytes
| | | | | 'Value: eat
| | | | |
| | | | |[152: String]:
| | | | | |Payload: 4 bytes
| | | | | |Total: 4 bytes
| | | | | 'Value: it
| | | | |
| | | | '[156: String]:
| | | | |Payload: 3 bytes
| | | | |Total: 3 bytes
| | | | 'Value: !
| | | |
| | | |
| | | '[159: End]:
| | | |Header: 1 byte
| | | |Payload: 0 bytes
| | | 'Total: 1 byte
| | |
| | |
| | '[160: Compound]:
| | |Payload: 28 bytes
| | |Total: 28 bytes
| | |Length: 2
| | |
| | |[160: Compound]:
| | | |Header: 3 bytes
| | | |Payload: 24 bytes
| | | |Total: 27 bytes
| | | |Length: 2
| | | |
| | | |[163: Compound] e:
| | | | |Header: 4 bytes
| | | | |Payload: 19 bytes
| | | | |Total: 23 bytes
| | | | |Length: 3
| | | | |
| | | | |[167: 32 Bit Integer] a:
| | | | | |Header: 4 bytes
| | | | | |Payload: 4 bytes
| | | | | |Total: 8 bytes
| | | | | 'Value: 544502633
| | | | |
| | | | |[175: Compound] f:
| | | | | |Header: 4 bytes
| | | | | |Payload: 6 bytes
| | | | | |Total: 10 bytes
| | | | | |Length: 2
| | | | | |
| | | | | |[179: Compound] o:
| | | | | | |Header: 4 bytes
| | | | | | |Payload: 1 byte
| | | | | | |Total: 5 bytes
| | | | | | |Length: 1
| | | | | | |
| | | | | | '[183: End]:
| | | | | | |Header: 1 byte
| | | | | | |Payload: 0 bytes
| | | | | | 'Total: 1 byte
| | | | | |
| | | | | |
| | | | | '[184: End]:
| | | | | |Header: 1 byte
| | | | | |Payload: 0 bytes
| | | | | 'Total: 1 byte
| | | | |
| | | | |
| | | | '[185: End]:
| | | | |Header: 1 byte
| | | | |Payload: 0 bytes
| | | | 'Total: 1 byte
| | | |
| | | |
| | | '[186: End]:
| | | |Header: 1 byte
| | | |Payload: 0 bytes
| | | 'Total: 1 byte
| | |
| | |
| | '[187: End]:
| | |Header: 1 byte
| | |Payload: 0 bytes
| | 'Total: 1 byte
| |
| |
| |
| '[188: List]:
| |Payload: 42 bytes
| |Total: 42 bytes
| |Contained Type: List
| |Length: 2
| |
| |[193: List]:
| | |Payload: 20 bytes
| | |Total: 20 bytes
| | |Contained Type: String
| | |Length: 5
| | |
| | |[198: String]:
| | | |Payload: 3 bytes
| | | |Total: 3 bytes
| | | 'Value: a
| | |
| | |[201: String]:
| | | |Payload: 3 bytes
| | | |Total: 3 bytes
| | | 'Value: b
| | |
| | |[204: String]:
| | | |Payload: 3 bytes
| | | |Total: 3 bytes
| | | 'Value: c
| | |
| | |[207: String]:
| | | |Payload: 3 bytes
| | | |Total: 3 bytes
| | | 'Value: d
| | |
| | '[210: String]:
| | |Payload: 3 bytes
| | |Total: 3 bytes
| | 'Value: e
| |
| |
| '[213: List]:
| |Payload: 17 bytes
| |Total: 17 bytes
| |Contained Type: 32 Bit Integer
| |Length: 3
| |
| |[218: 32 Bit Integer]:
| | |Payload: 4 bytes
| | |Total: 4 bytes
| | 'Value: 457829
| |
| |[222: 32 Bit Integer]:
| | |Payload: 4 bytes
| | |Total: 4 bytes
| | 'Value: 300
| |
| '[226: 32 Bit Integer]:
| |Payload: 4 bytes
| |Total: 4 bytes
| 'Value: 60
|
|
|
|
|[230: Compound] compound_level_1:
| |Header: 19 bytes
| |Payload: 545 bytes
| |Total: 564 bytes
| |Length: 5
| |
| |[249: List] 100:
| | |Header: 6 bytes
| | |Payload: 291 bytes
| | |Total: 297 bytes
| | |Contained Type: Compound
| | |Length: 4
| | |
| | |[260: Compound]:
| | | |Payload: 6 bytes
| | | |Total: 6 bytes
| | | |Length: 2
| | | |
| | | |[260: 8 Bit Integer] 3:
| | | | |Header: 4 bytes
| | | | |Payload: 1 byte
| | | | |Total: 5 bytes
| | | | 'Value: 3
| | | |
| | | '[265: End]:
| | | |Header: 1 byte
| | | |Payload: 0 bytes
| | | 'Total: 1 byte
| | |
| | |
| | |[266: Compound]:
| | | |Payload: 125 bytes
| | | |Total: 125 bytes
| | | |Length: 4
| | | |
| | | |[266: Array of 8 Bit Integers] 600:
| | | | |Header: 6 bytes
| | | | |Payload: 16 bytes
| | | | |Total: 22 bytes
| | | | |Length: 12
| | | | 'Values:
| | | | |69
| | | | |36
| | | | |67
| | | | |66
| | | | |40
| | | | |-121
| | | | |98
| | | | |-46
| | | | |21
| | | | |101
| | | | |104
| | | | '97
| | | |
| | | |[288: 64 Bit Integer] eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee:
| | | | |Header: 85 bytes
| | | | |Payload: 8 bytes
| | | | |Total: 93 bytes
| | | | 'Value: 317827579944
| | | |
| | | |[381: 16 Bit Integer] nose:
| | | | |Header: 7 bytes
| | | | |Payload: 2 bytes
| | | | |Total: 9 bytes
| | | | 'Value: 12547
| | | |
| | | '[390: End]:
| | | |Header: 1 byte
| | | |Payload: 0 bytes
| | | 'Total: 1 byte
| | |
| | |
| | |[391: Compound]:
| | | |Payload: 154 bytes
| | | |Total: 154 bytes
| | | |Length: 3
| | | |
| | | |[391: List] 681:
| | | | |Header: 6 bytes
| | | | |Payload: 8 bytes
| | | | |Total: 14 bytes
| | | | |Contained Type: 8 Bit Integer
| | | | |Length: 3
| | | | |
| | | | |[402: 8 Bit Integer]:
| | | | | |Payload: 1 byte
| | | | | |Total: 1 byte
| | | | | 'Value: 3
| | | | |
| | | | |[403: 8 Bit Integer]:
| | | | | |Payload: 1 byte
| | | | | |Total: 1 byte
| | | | | 'Value: 3
| | | | |
| | | | '[404: 8 Bit Integer]:
| | | | |Payload: 1 byte
| | | | |Total: 1 byte
| | | | 'Value: 5
| | | |
| | | |
| | | |[405: Compound] moar:
| | | | |Header: 7 bytes
| | | | |Payload: 132 bytes
| | | | |Total: 139 bytes
| | | | |Length: 2
| | | | |
| | | | |[412: Compound] nesting:
| | | | | |Header: 10 bytes
| | | | | |Payload: 121 bytes
| | | | | |Total: 131 bytes
| | | | | |Length: 2
| | | | | |
| | | | | |[422: Compound] go:
| | | | | | |Header: 5 bytes
| | | | | | |Payload: 115 bytes
| | | | | | |Total: 120 bytes
| | | | | | |Length: 2
| | | | | | |
| | | | | | |[427: Compound] brrrrr:
| | | | | | | |Header: 9 bytes
| | | | | | | |Payload: 105 bytes
| | | | | | | |Total: 114 bytes
| | | | | | | |Length: 7
| | | | | | | |
| | | | | | | |[436: 16 Bit Integer] anyway:
| | | | | | | | |Header: 9 bytes
| | | | | | | | |Payload: 2 bytes
| | | | | | | | |Total: 11 bytes
| | | | | | | | 'Value: 12547
| | | | | | | |
| | | | | | | |[447: List] data:
| | | | | | | | |Header: 7 bytes
| | | | | | | | |Payload: 21 bytes
| | | | | | | | |Total: 28 bytes
| | | | | | | | |Contained Type: 32 Bit Integer
| | | | | | | | |Length: 4
| | | | | | | | |
| | | | | | | | |[459: 32 Bit Integer]:
| | | | | | | | | |Payload: 4 bytes
| | | | | | | | | |Total: 4 bytes
| | | | | | | | | 'Value: 10
| | | | | | | | |
| | | | | | | | |[463: 32 Bit Integer]:
| | | | | | | | | |Payload: 4 bytes
| | | | | | | | | |Total: 4 bytes
| | | | | | | | | 'Value: 808464643
| | | | | | | | |
| | | | | | | | |[467: 32 Bit Integer]:
| | | | | | | | | |Payload: 4 bytes
| | | | | | | | | |Total: 4 bytes
| | | | | | | | | 'Value: 645
| | | | | | | | |
| | | | | | | | '[471: 32 Bit Integer]:
| | | | | | | | |Payload: 4 bytes
| | | | | | | | |Total: 4 bytes
| | | | | | | | 'Value: 1337
| | | | | | | |
| | | | | | | |
| | | | | | | |[475: 8 Bit Integer] here:
| | | | | | | | |Header: 7 bytes
| | | | | | | | |Payload: 1 byte
| | | | | | | | |Total: 8 bytes
| | | | | | | | 'Value: 3
| | | | | | | |
| | | | | | | |[483: Double] is:
| | | | | | | | |Header: 5 bytes
| | | | | | | | |Payload: 8 bytes
| | | | | | | | |Total: 13 bytes
| | | | | | | | 'Value: 7.29293e-304
| | | | | | | |
| | | | | | | |[496: 32 Bit Integer] so:
| | | | | | | | |Header: 5 bytes
| | | | | | | | |Payload: 4 bytes
| | | | | | | | |Total: 9 bytes
| | | | | | | | 'Value: 808464643
| | | | | | | |
| | | | | | | |[505: Array of 32 Bit Integers] some:
| | | | | | | | |Header: 7 bytes
| | | | | | | | |Payload: 28 bytes
| | | | | | | | |Total: 35 bytes
| | | | | | | | |Length: 6
| | | | | | | | 'Values:
| | | | | | | | |3865431
| | | | | | | | |230597146
| | | | | | | | |2147483647
| | | | | | | | |-1870208349
| | | | | | | | |-1195067710
| | | | | | | | '-2031966525
| | | | | | | |
| | | | | | | '[540: End]:
| | | | | | | |Header: 1 byte
| | | | | | | |Payload: 0 bytes
| | | | | | | 'Total: 1 byte
| | | | | | |
| | | | | | |
| | | | | | '[541: End]:
| | | | | | |Header: 1 byte
| | | | | | |Payload: 0 bytes
| | | | | | 'Total: 1 byte
| | | | | |
| | | | | |
| | | | | '[542: End]:
| | | | | |Header: 1 byte
| | | | | |Payload: 0 bytes
| | | | | 'Total: 1 byte
| | | | |
| | | | |
| | | | '[543: End]:
| | | | |Header: 1 byte
| | | | |Payload: 0 bytes
| | | | 'Total: 1 byte
| | | |
| | | |
| | | '[544: End]:
| | | |Header: 1 byte
| | | |Payload: 0 bytes
| | | 'Total: 1 byte
| | |
| | |
| | '[545: Compound]:
| | |Payload: 1 byte
| | |Total: 1 byte
| | |Length: 1
| | |
| | '[545: End]:
| | |Header: 1 byte
| | |Payload: 0 bytes
| | 'Total: 1 byte
| |
| |
| |
| |[546: Compound] compound_level_2a:
| | |Header: 20 bytes
| | |Payload: 1 byte
| | |Total: 21 bytes
| | |Length: 1
| | |
| | '[566: End]:
| | |Header: 1 byte
| | |Payload: 0 bytes
| | 'Total: 1 byte
| |
| |
| |[567: Compound] compound_level_2b:
| | |Header: 20 bytes
| | |Payload: 191 bytes
| | |Total: 211 bytes
| | |Length: 3
| | |
| | |[587: Float] 300:
| | | |Header: 6 bytes
| | | |Payload: 4 bytes
| | | |Total: 10 bytes
| | | 'Value: 1.89896e+28
| | |
| | |[597: List] 900:
| | | |Header: 6 bytes
| | | |Payload: 174 bytes
| | | |Total: 180 bytes
| | | |Contained Type: String
| | | |Length: 6
| | | |
| | | |[608: String]:
| | | | |Payload: 7 bytes
| | | | |Total: 7 bytes
| | | | 'Value: aaaaa
| | | |
| | | |[615: String]:
| | | | |Payload: 30 bytes
| | | | |Total: 30 bytes
| | | | 'Value: bbbbbbbbbbbbbbbbbbbbbbbbbbbb
| | | |
| | | |[645: String]:
| | | | |Payload: 6 bytes
| | | | |Total: 6 bytes
| | | | 'Value: nose
| | | |
| | | |[651: String]:
| | | | |Payload: 13 bytes
| | | | |Total: 13 bytes
| | | | 'Value: hello there
| | | |
| | | |[664: String]:
| | | | |Payload: 37 bytes
| | | | |Total: 37 bytes
| | | | 'Value: Eat more bricks, theyre healthy.
| | | |
| | | '[701: String]:
| | | |Payload: 76 bytes
| | | |Total: 76 bytes
| | | 'Value: ŧ€æ ̣←¶ĸæ↓ŧŧþ€ł„ ̣€æ€“¢↓ø→ł¶€¶„ŋ
| | |
| | |
| | '[777: End]:
| | |Header: 1 byte
| | |Payload: 0 bytes
| | 'Total: 1 byte
| |
| |
| |[778: List] eeeeeee:
| | |Header: 10 bytes
| | |Payload: 5 bytes
| | |Total: 15 bytes
| | |Contained Type: End
| | 'Length: 0
| |
| '[793: End]:
| |Header: 1 byte
| |Payload: 0 bytes
| 'Total: 1 byte
|
|
'[794: End]:
|Header: 1 byte
|Payload: 0 bytes
'Total: 1 byte

View File

@ -0,0 +1,78 @@
[0: Compound]:
|Header: 3 bytes
|Payload: 2395 bytes
|Total: 2398 bytes
|Length: 2
|
|[3: List] servers:
| |Header: 10 bytes
| |Payload: 2384 bytes
| |Total: 2394 bytes
| |Contained Type: Compound
| |Length: 2
| |
| |[18: Compound]:
| | |Payload: 1184 bytes
| | |Total: 1184 bytes
| | |Length: 4
| | |
| | |[18: String] ip:
| | | |Header: 5 bytes
| | | |Payload: 14 bytes
| | | |Total: 19 bytes
| | | 'Value: minecraft.ip
| | |
| | |[37: String] name:
| | | |Header: 7 bytes
| | | |Payload: 20 bytes
| | | |Total: 27 bytes
| | | 'Value: Survival0 Internal
| | |
| | |[64: String] icon:
| | | |Header: 7 bytes
| | | |Payload: 1130 bytes
| | | |Total: 1137 bytes
| | | 'Value: iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADFUlEQVR4Xt2bPW4UQRCFx9qUA+wBkJB8ElIkbmAJn4GYhNQ38AmcEBORcA8OQdjQbfeq9pvq6und/pv9pCeL/qv3amakHS9elsY45w7ucg48bxcwRS1YZyr++7uj4Ybcsf4wvBm668jYRtDNKOirOTQwC/TZBBadDfqtCovNCn1XgUVmh/6vgofvBea4CB66N5inCB62V5hrEzwk4qdaqSVLCdwsCdN/f1RXpmwVmDMJN0bClGK+lozSVWBOFW6ShGlhtpZ6NcCzWLjMi01Y8mb0829XTfLcDqRfoLiShCVKAyIMtlXy3B6cp37DXXj1NRjwbP2f90Ecl+d3YH0XcAUJS5QGlGqSBqzvAi4gYUlhAyIc1yTP78FF4a0G3L8cT5LhI1xPsUYPihuQCq81ICdJHJN1elClATI4xbUMLhnWAJf5vX00dW0DPNxLsVYHDtkqNCUDeRiaDSAMPbgBLltFu/1JHH/69G4Vylovdf/1GNT9MeAA0RqQUqoBmmLgqOcvH4KmagBvSZqWyjWA62NgijVbY1agGZqVYkCK61NizdaYFeTtSKMt1fMxMCvM2AA/VioLczYaiWZ6yXoE5PwWaWdIzNnSYrWlmY+e2DRNqTMk5uzMDeA6GZpzFuYsOzpCJIwpzaL8J9GrG5DCH/rr5/dqypmUbG1AVO5sdZZXYQZd481CnQ2blG6OEkMwoKUcfsXqdTg24PHh4ybRcKkeH76d/Ts+vy/H9XPMgFtk8Prf8DgahhSjoyQtlnpT4p0I4a0G8EqnxKK1pTXA/8yJe0kI71EmViZGSlrUvDE051KcGuDBRNjMK50Si9aWtKeF1JT7HHAW3oPJ6SS9MawluVeyEJf4asxP8YNLD71aWuPHS6Ww/mrMw1UePzxKKbjOksaSwiXughtDv/oRrr41mFeFm24F5kzCjbcCc5pw895hvk3wkL3CXEXwsL3BPBfBQ/cCc1wFD58d+q8Ci8wKfVeFxWaDfpvAorNAn82hgVHQV1fc2Bco+8WmJ94M3TVknuAadFsL1tkFTvneoYDmfz7/D2WFu2nv97K8AAAAAElFTkSuQmCC
| | |
| | '[1201: End]:
| | |Header: 1 byte
| | |Payload: 0 bytes
| | 'Total: 1 byte
| |
| |
| '[1202: Compound]:
| |Payload: 1195 bytes
| |Total: 1195 bytes
| |Length: 4
| |
| |[1202: String] ip:
| | |Header: 5 bytes
| | |Payload: 25 bytes
| | |Total: 30 bytes
| | 'Value: lostcave.ddnss.de:45539
| |
| |[1232: String] name:
| | |Header: 7 bytes
| | |Payload: 20 bytes
| | |Total: 27 bytes
| | 'Value: Survival0 External
| |
| |[1259: String] icon:
| | |Header: 7 bytes
| | |Payload: 1130 bytes
| | |Total: 1137 bytes
| | 'Value: iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADFUlEQVR4Xt2bPW4UQRCFx9qUA+wBkJB8ElIkbmAJn4GYhNQ38AmcEBORcA8OQdjQbfeq9pvq6und/pv9pCeL/qv3amakHS9elsY45w7ucg48bxcwRS1YZyr++7uj4Ybcsf4wvBm668jYRtDNKOirOTQwC/TZBBadDfqtCovNCn1XgUVmh/6vgofvBea4CB66N5inCB62V5hrEzwk4qdaqSVLCdwsCdN/f1RXpmwVmDMJN0bClGK+lozSVWBOFW6ShGlhtpZ6NcCzWLjMi01Y8mb0829XTfLcDqRfoLiShCVKAyIMtlXy3B6cp37DXXj1NRjwbP2f90Ecl+d3YH0XcAUJS5QGlGqSBqzvAi4gYUlhAyIc1yTP78FF4a0G3L8cT5LhI1xPsUYPihuQCq81ICdJHJN1elClATI4xbUMLhnWAJf5vX00dW0DPNxLsVYHDtkqNCUDeRiaDSAMPbgBLltFu/1JHH/69G4Vylovdf/1GNT9MeAA0RqQUqoBmmLgqOcvH4KmagBvSZqWyjWA62NgijVbY1agGZqVYkCK61NizdaYFeTtSKMt1fMxMCvM2AA/VioLczYaiWZ6yXoE5PwWaWdIzNnSYrWlmY+e2DRNqTMk5uzMDeA6GZpzFuYsOzpCJIwpzaL8J9GrG5DCH/rr5/dqypmUbG1AVO5sdZZXYQZd481CnQ2blG6OEkMwoKUcfsXqdTg24PHh4ybRcKkeH76d/Ts+vy/H9XPMgFtk8Prf8DgahhSjoyQtlnpT4p0I4a0G8EqnxKK1pTXA/8yJe0kI71EmViZGSlrUvDE051KcGuDBRNjMK50Si9aWtKeF1JT7HHAW3oPJ6SS9MawluVeyEJf4asxP8YNLD71aWuPHS6Ww/mrMw1UePzxKKbjOksaSwiXughtDv/oRrr41mFeFm24F5kzCjbcCc5pw895hvk3wkL3CXEXwsL3BPBfBQ/cCc1wFD58d+q8Ci8wKfVeFxWaDfpvAorNAn82hgVHQV1fc2Bco+8WmJ94M3TVknuAadFsL1tkFTvneoYDmfz7/D2WFu2nv97K8AAAAAElFTkSuQmCC
| |
| '[2396: End]:
| |Header: 1 byte
| |Payload: 0 bytes
| 'Total: 1 byte
|
|
|
'[2397: End]:
|Header: 1 byte
|Payload: 0 bytes
'Total: 1 byte

View File

@ -0,0 +1,223 @@
[0: Compound]:
|Header: 3 bytes
|Payload: 475 bytes
|Total: 478 bytes
|Length: 15
|
|[3: String] Spaces and special characters are allowed in tag names, right?:
| |Header: 65 bytes
| |Payload: 24 bytes
| |Total: 89 bytes
| 'Value: Idk. Lets find out.
|
|[92: Compound] compound:
| |Header: 11 bytes
| |Payload: 45 bytes
| |Total: 56 bytes
| |Length: 3
| |
| |[103: 32 Bit Integer] some_number:
| | |Header: 14 bytes
| | |Payload: 4 bytes
| | |Total: 18 bytes
| | 'Value: -754506943
| |
| |[121: String] some_text:
| | |Header: 12 bytes
| | |Payload: 14 bytes
| | |Total: 26 bytes
| | 'Value: eat a cookie
| |
| '[147: End]:
| |Header: 1 byte
| |Payload: 0 bytes
| 'Total: 1 byte
|
|
|[148: Double] double:
| |Header: 9 bytes
| |Payload: 8 bytes
| |Total: 17 bytes
| 'Value: 623594
|
|[165: Float] float:
| |Header: 8 bytes
| |Payload: 4 bytes
| |Total: 12 bytes
| 'Value: 35.2678
|
|[177: 16 Bit Integer] int16:
| |Header: 8 bytes
| |Payload: 2 bytes
| |Total: 10 bytes
| 'Value: 2000
|
|[187: 32 Bit Integer] int32:
| |Header: 8 bytes
| |Payload: 4 bytes
| |Total: 12 bytes
| 'Value: 10101010
|
|[199: Array of 32 Bit Integers] int32_array:
| |Header: 14 bytes
| |Payload: 20 bytes
| |Total: 34 bytes
| |Length: 4
| 'Values:
| |398452796
| |43259
| |2147483647
| '1634890337
|
|[233: 64 Bit Integer] int64:
| |Header: 8 bytes
| |Payload: 8 bytes
| |Total: 16 bytes
| 'Value: 810001800766
|
|[249: Array of 64 Bit Integers] int64_array:
| |Header: 14 bytes
| |Payload: 44 bytes
| |Total: 58 bytes
| |Length: 5
| 'Values:
| |239865
| |23586749
| |9223372036854775807
| |188944201329624
| '3116157694992754
|
|[307: 8 Bit Integer] int8:
| |Header: 7 bytes
| |Payload: 1 byte
| |Total: 8 bytes
| 'Value: 100
|
|[315: Array of 8 Bit Integers] int8_array:
| |Header: 13 bytes
| |Payload: 12 bytes
| |Total: 25 bytes
| |Length: 8
| 'Values:
| |113
| |53
| |119
| |98
| |84
| |100
| |-11
| '50
|
|[340: List] list_int8:
| |Header: 12 bytes
| |Payload: 10 bytes
| |Total: 22 bytes
| |Contained Type: 8 Bit Integer
| |Length: 5
| |
| |[357: 8 Bit Integer]:
| | |Payload: 1 byte
| | |Total: 1 byte
| | 'Value: 65
| |
| |[358: 8 Bit Integer]:
| | |Payload: 1 byte
| | |Total: 1 byte
| | 'Value: 96
| |
| |[359: 8 Bit Integer]:
| | |Payload: 1 byte
| | |Total: 1 byte
| | 'Value: 78
| |
| |[360: 8 Bit Integer]:
| | |Payload: 1 byte
| | |Total: 1 byte
| | 'Value: 127
| |
| '[361: 8 Bit Integer]:
| |Payload: 1 byte
| |Total: 1 byte
| 'Value: -6
|
|
|[362: List] list_strings:
| |Header: 15 bytes
| |Payload: 77 bytes
| |Total: 92 bytes
| |Contained Type: String
| |Length: 12
| |
| |[382: String]:
| | |Payload: 8 bytes
| | |Total: 8 bytes
| | 'Value: Pacman
| |
| |[390: String]:
| | |Payload: 5 bytes
| | |Total: 5 bytes
| | 'Value: ate
| |
| |[395: String]:
| | |Payload: 5 bytes
| | |Total: 5 bytes
| | 'Value: all
| |
| |[400: String]:
| | |Payload: 5 bytes
| | |Total: 5 bytes
| | 'Value: the
| |
| |[405: String]:
| | |Payload: 6 bytes
| | |Total: 6 bytes
| | 'Value: dots
| |
| |[411: String]:
| | |Payload: 4 bytes
| | |Total: 4 bytes
| | 'Value: so
| |
| |[415: String]:
| | |Payload: 5 bytes
| | |Total: 5 bytes
| | 'Value: now
| |
| |[420: String]:
| | |Payload: 8 bytes
| | |Total: 8 bytes
| | 'Value: hes
| |
| |[428: String]:
| | |Payload: 8 bytes
| | |Total: 8 bytes
| | 'Value: coming
| |
| |[436: String]:
| | |Payload: 5 bytes
| | |Total: 5 bytes
| | 'Value: for
| |
| |[441: String]:
| | |Payload: 5 bytes
| | |Total: 5 bytes
| | 'Value: the
| |
| '[446: String]:
| |Payload: 8 bytes
| |Total: 8 bytes
| 'Value: words.
|
|
|[454: String] string:
| |Header: 9 bytes
| |Payload: 14 bytes
| |Total: 23 bytes
| 'Value: Hello World!
|
'[477: End]:
|Header: 1 byte
|Payload: 0 bytes
'Total: 1 byte

View File

@ -59,3 +59,9 @@ Usage: `check_endianness > header_file`
Note that, while this tool should in theory be able to detect
PDP and Honeywell-316-style endianness, the FOSS-VG project itself
does not support these.
## region_files
Exactly what the name says. At this point just a random region file I grabbed
from Minecraft, will probably contain synthetic files for test cases in the
future as well.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,90 @@
if [ "$1" = "-v" ]; then
VERBOSE=true
shift
else
VERBOSE=false
fi
if [ "$1" = "-n" ]; then
DECOMPRESS=false
shift
else
DECOMPRESS=true
fi
if [ ! -f "$1" ]; then
echo "Usage: $0 [-v] [-n] FILE"
echo " -v display raw content and NBT dump"
echo " -n don't decompress"
exit 1
fi
# pointer data
OFFSET_HEX="0x$(dd bs=1 if="$1" count=3 2>/dev/null | hexdump -e '3/1 "%02x" "\n"')"
OFFSET="$(baseconvert -d $OFFSET_HEX)"
echo " offset: $OFFSET ($OFFSET_HEX)"
LENGTH_HEX="0x$(dd bs=1 if="$1" count=1 skip=3 2>/dev/null | hexdump -e '1/1 "%02x" "\n"')"
LENGTH="$(baseconvert -d $LENGTH_HEX)"
echo " length: $LENGTH ($LENGTH_HEX)"
#TODO: last modified
# chunk
DATA="$(dd if="$1" bs=4096 count=$LENGTH skip=$OFFSET 2>/dev/null | hexdump -v -e '16/1 "%02x" "\n"' | tr -d '
')"
# blob header
# bs=2 because each byte is two digits hex
COMPRESSED_LENGTH_HEX="0x$(dd bs=2 count=4 2> /dev/null <<< $DATA)"
COMPRESSED_LENGTH="$(baseconvert -d $COMPRESSED_LENGTH_HEX)"
echo " compressed length in bytes: $COMPRESSED_LENGTH ($COMPRESSED_LENGTH_HEX)"
FORMAT_HEX="0x$(dd bs=2 skip=4 count=1 2> /dev/null <<< $DATA)"
case $FORMAT_HEX in
"0x01")
FORMAT="gzip"
function UNCOMPRESS {
gzip -dc
}
;;
"0x02")
FORMAT="zlib"
function UNCOMPRESS {
cat > /tmp/chunk_zlib_decompress
python3 <<< "
import zlib,sys
a = open('/tmp/chunk_zlib_decompress', 'rb')
data = a.read()
a.close()
sys.stdout.buffer.write(zlib.decompress(data))
sys.stdout.buffer.flush()
"
rm /tmp/chunk_zlib_decompress
}
;;
*)
FORMAT="unknown"
function UNCOMPRESS {
false
}
;;
esac
echo " format: $FORMAT ($FORMAT_HEX)"
if $DECOMPRESS; then
dd if="$1" bs=4096 count=$LENGTH skip=$OFFSET 2>/dev/null | dd bs=1 skip=5 count=$(($COMPRESSED_LENGTH-1)) 2>/dev/null | UNCOMPRESS > /tmp/chunk_uncompressed_nbt
else
dd if="$1" bs=4096 count=$LENGTH skip=$OFFSET 2>/dev/null | dd bs=1 skip=5 count=$(($COMPRESSED_LENGTH-1)) 2>/dev/null > /tmp/chunk_compressed_nbt
fi
if $VERBOSE; then
echo "Raw chunk data:"
echo "$DATA"
echo "NBT dump:"
#TODO: use pipes instead of a file
#TODO: fix this up to work with both compressed and uncompressed NBT
dumpnbt /tmp/chunk_uncompressed_nbt
rm /tmp/chunk_uncompressed_nbt
fi

Binary file not shown.

View File

@ -35,10 +35,19 @@ fi
# dynamically linked libraries.
echo ">>> Building libs..."
create_directory bin/lib
for lib in $(find ./src/lib -name "*.cpp"); do
COMPILE_COMMAND="$CXX_WITH_FLAGS -I ./include -fPIC -shared -o $(sed -e 's/^.\/src/.\/bin/;s/cpp$/so/' <<< $lib) $lib"
echo $COMPILE_COMMAND
$COMPILE_COMMAND &
COMPILE_COMMANDS=(
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -o ./bin/lib/net/connection.so ./src/lib/net/connection.cpp"
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -o ./bin/lib/cli.so ./src/lib/cli.cpp"
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -o ./bin/lib/file.so ./src/lib/file.cpp"
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -o ./bin/lib/game/block.so ./src/lib/game/block.cpp"
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -o ./bin/lib/game/entity.so ./src/lib/game/entity.cpp"
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -o ./bin/lib/nbt.so ./src/lib/nbt.cpp"
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -o ./bin/lib/region.so ./src/lib/region.cpp"
"$CXX_WITH_FLAGS -I ./include -fPIC -shared -l:libz.so -o ./bin/lib/zlibutil.so ./src/lib/zlibutil.cpp"
)
for command in ${!COMPILE_COMMANDS[@]}; do
echo "${COMPILE_COMMANDS[command]}"
${COMPILE_COMMANDS[command]} &
$WAIT_ANYWAY
done
@ -55,15 +64,16 @@ wait
# How to run a tool: specify the library path to use for the dynamic linker
# when running a program
# Example: LD_LIBRARY_PATH=bin/lib bin/tools/dumpnbt
echo ">>> Building tools..."
echo ">>> Building programs..."
create_directory bin/tools
# add compile commands to this array
COMPILE_COMMANDS=(
"$CXX_WITH_FLAGS src/tools/dumpnbt.cpp -I./include -Lbin/lib -l:nbt.so -l:cli.so -o bin/tools/dumpnbt"
"$CXX_WITH_FLAGS src/tools/arraydump.cpp -I./include -Lbin/lib -l:file.so -l:cli.so -o bin/tools/arraydump"
"$CXX_WITH_FLAGS src/tools/baseconvert.cpp -I./include -Lbin/lib -l:cli.so -o bin/tools/baseconvert"
"$CXX_WITH_FLAGS src/tools/zlibutil.cpp -I./include -Lbin/lib -l:cli.so -l:file.so -l:zlibutil.so -l:libz.so -o bin/tools/zlibutil"
"$CXX_WITH_FLAGS -pthread src/tools/hexnet.cpp -I./include -Lbin/lib -l:cli.so -l:libsockpp.so -o bin/tools/hexnet"
"$CXX_WITH_FLAGS src/fossvg.cpp -I./include -Lbin/lib -l:cli.so -lglfw -o bin/fossvg"
"$CXX_WITH_FLAGS -DFOSSVG_DEBUG src/fossvg.cpp -I./include -Lbin/lib -l:file.so -l:cli.so -lglfw -lvulkan -o bin/fossvg"
"$CXX_WITH_FLAGS src/fossvgd.cpp -I./include -Lbin/lib -l:cli.so -o bin/fossvgd"
)
for command in ${!COMPILE_COMMANDS[@]}; do
@ -73,3 +83,21 @@ for command in ${!COMPILE_COMMANDS[@]}; do
done
wait
echo ">>> Compiling shaders..."
create_directory bin/shaders
for shader in $(find ./src/shaders -name "*.vsh"); do
COMPILE_COMMAND="dependencies/shaderc/bin/glslc -o $(sed -e 's/^.\/src/.\/bin/;s/vsh$/vsh.spv/' <<< $shader) -fshader-stage=vertex $shader"
echo $COMPILE_COMMAND
$COMPILE_COMMAND &
$WAIT_ANYWAY
done
for shader in $(find ./src/shaders -name "*.fsh"); do
COMPILE_COMMAND="dependencies/shaderc/bin/glslc -o $(sed -e 's/^.\/src/.\/bin/;s/fsh$/fsh.spv/' <<< $shader) -fshader-stage=fragment $shader"
echo $COMPILE_COMMAND
$COMPILE_COMMAND &
$WAIT_ANYWAY
done
wait

View File

@ -29,16 +29,17 @@ create_directory ./bin/lib/net
create_directory ./include
if uname -s | tr [:upper:] [:lower:] | grep cygwin >/dev/null; then
ln -vs ../../dependencies/sockpp-0.7.1/build/cygsockpp-0.dll bin/lib/libsockpp.so
ln -vs ../../dependencies/sockpp-0.7.1/build/cygsockpp-0.dll bin/lib/
ln -vs ../../dependencies/sockpp-0.8.1/build/cygsockpp-0.dll bin/lib/libsockpp.so
ln -vs ../../dependencies/sockpp-0.8.1/build/cygsockpp-0.dll bin/lib/
else
ln -vs ../../dependencies/sockpp-0.7.1/build/libsockpp.so bin/lib/
ln -vs ../../dependencies/sockpp-0.7.1/build/libsockpp.so.0 bin/lib/
ln -vs ../../dependencies/sockpp-0.7.1/build/libsockpp.so.0.7.1 bin/lib/
ln -vs ../../dependencies/sockpp-0.8.1/build/libsockpp.so bin/lib/
ln -vs ../../dependencies/sockpp-0.8.1/build/libsockpp.so.0 bin/lib/
ln -vs ../../dependencies/sockpp-0.8.1/build/libsockpp.so.0.8.1 bin/lib/
fi
ln -vs ../dependencies/sockpp-0.7.1/include/sockpp/ ./include/
ln -vs ../dependencies/sockpp-0.8.1/include/sockpp/ ./include/
ln -vs ../dependencies/tiny-utf8-4.4.3/include/tinyutf8/ ./include/
ln -vs ../dependencies/zlib-1.3.1/ ./include/zlib
create_file ./bin/.placeholder
create_file ./include/.placeholder

View File

@ -17,6 +17,7 @@
source scripts/lib.sh
#TODO: move this to download.sh
echo ">>> Checking download cache for unneeded or corrupted files..."
for file in $(ls .download_cache); do
#TODO: remove if unknown shasum
@ -35,6 +36,6 @@ done
echo "
>>> Cleaning dependencies..."
remove ./dependencies
remove -f ./dependencies
create_directory ./dependencies
create_file ./dependencies/.placeholder

61
scripts/download.sh Executable file
View File

@ -0,0 +1,61 @@
if [ "$#" -lt 3 -o "$#" -gt 3 ]; then
echo "Usage: $0 URL DESTINATION SHA256SUM"
exit 1
fi
source scripts/lib.sh
URL="$1"
DESTINATION="$2"
SHA256SUM="$3"
if command -v wget >/dev/null 2>&1; then
USE_WGET=yes
else
if command -v curl >/dev/null 2>&1; then
USE_WGET=no
else
echo "Found neither wget nor curl. Aborting."
exit 1
fi
fi
if [ ! -d .download_cache ]; then
echo "Cache directory missing."
create_directory .download_cache
fi
#TODO: keep track of which cached file is downloaded to which destination
#TODO: when downloading a file with a new hash to the same destination, mark the old one as no longer in use
#TODO: if there is an even older one for the same download path, delete it
#TODO: remove cache maintenance from clean_dependencies
if [ -f ".download_cache/$SHA256SUM" ]; then
if check_sha256 ".download_cache/$SHA256SUM" "$SHA256SUM"; then
echo "Using locally cached file for $DESTINATION"
cp ".download_cache/$SHA256SUM" "$DESTINATION"
exit 0
else
echo "Locally cached file for $DESTINATION is corrupted."
rm ".download_cache/$SHA256SUM"
$0 "$URL" "$DESTINATION" "$SHA256SUM"
exit $?
fi
else
echo -n "Downloading $URL to $DESTINATION... "
if [ $USE_WGET = yes ]; then
wget -O ".download_cache/$SHA256SUM" "$URL" >/dev/null 2>&1
else
curl -L "$URL" --output ".download_cache/$SHA256SUM" >/dev/null 2>&1
fi
if check_sha256 ".download_cache/$SHA256SUM" "$SHA256SUM"; then
cp ".download_cache/$SHA256SUM" "$DESTINATION"
echo "done."
exit 0
else
echo "error."
echo "Checksum verification failed. Your download is either corrupted or the file has been altered. Removing file."
rm ".download_cache/$SHA256SUM"
exit 1
fi
fi

15
scripts/lib.sh Normal file → Executable file
View File

@ -57,11 +57,18 @@ fi
# `rm -v` only prints the names of the removed things instead of a more
# comprehensible message like "removing NAME".
function remove {
echo "Removing $1..."
if [ -d "$1" ]; then
rm -rv "$1"
local USE_FORCE=""
if [ "$1" = "-f" ]; then
USE_FORCE="f"
shift
echo "Forcefully removing $1..."
else
rm -v "$1"
echo "Removing $1..."
fi;
if [ -d "$1" ]; then
rm -"$USE_FORCE"rv "$1"
else
rm -"$USE_FORCE"v "$1"
fi
}

View File

@ -17,68 +17,19 @@
source scripts/lib.sh
echo -n "Wget or curl? "
if command -v wget >/dev/null 2>&1; then
USE_WGET=yes
echo "wget"
else
if command -v curl >/dev/null 2>&1; then
USE_WGET=no
echo "curl"
else
echo "Found neither wget nor curl. Aborting."
exit 1
fi
fi
function download {
URL="$1"
DESTINATION="$2"
SHA256SUM="$3"
if [ ! -d .download_cache ]; then
echo "Cache directory missing."
create_directory .download_cache
fi
if [ -f ".download_cache/$SHA256SUM" ]; then
if check_sha256 ".download_cache/$SHA256SUM" "$SHA256SUM"; then
echo "Using locally cached file for $DESTINATION"
cp ".download_cache/$SHA256SUM" "$DESTINATION"
return 0
else
echo "Locally cached file for $DESTINATION is corrupted."
rm ".download_cache/$SHA256SUM"
download "$URL" "$DESTINATION" "$SHA256SUM"
return $?
fi
else
echo -n "Downloading $URL to $DESTINATION... "
if [ $USE_WGET = yes ]; then
wget -O ".download_cache/$SHA256SUM" "$URL" >/dev/null 2>&1
else
curl -L "$URL" --output ".download_cache/$SHA256SUM" >/dev/null 2>&1
fi
if check_sha256 ".download_cache/$SHA256SUM" "$SHA256SUM"; then
cp ".download_cache/$SHA256SUM" "$DESTINATION"
echo "done."
return 0
else
echo "error."
echo "Checksum verification failed. Your download is either corrupted or the file has been altered. Removing file."
rm ".download_cache/$SHA256SUM"
return 1
fi
fi
}
scripts/clean.sh
scripts/clean_dependencies.sh
set -e # failures are not acceptable here
create_directory dependencies/tmp
download https://github.com/DuffsDevice/tiny-utf8/archive/refs/tags/v4.4.3.tar.gz dependencies/tmp/tiny-utf8.tar.gz 8e3f61651909c9f3105d3501932a96aa65733127fb6e7cf94cb1b0a2dff42c8f
download https://github.com/fpagliughi/sockpp/archive/refs/tags/v0.7.1.tar.gz dependencies/tmp/sockpp.tar.gz 2e023528bebbd2ac083fc91fbe6d5c4158c3336bedbcff48f594f3b28f53b940
scripts/download.sh https://github.com/DuffsDevice/tiny-utf8/archive/refs/tags/v4.4.3.tar.gz dependencies/tmp/tiny-utf8.tar.gz 8e3f61651909c9f3105d3501932a96aa65733127fb6e7cf94cb1b0a2dff42c8f
scripts/download.sh https://github.com/fpagliughi/sockpp/archive/refs/tags/v0.8.1.tar.gz dependencies/tmp/sockpp.tar.gz a8aedff8bd8c1da530b91be650352008fddabc9f1df0d19701d76cbc359c8651
scripts/download.sh https://www.zlib.net/zlib-1.3.1.tar.xz dependencies/tmp/zlib.tar.xz 38ef96b8dfe510d42707d9c781877914792541133e1870841463bfa73f883e32
#TODO: figure out how to cache shaderc
#also TODO: target a specific commit
git clone --branch known-good https://github.com/google/shaderc.git dependencies/tmp/shaderc
#scripts/download.sh https://github.com/google/shaderc/archive/refs/tags/v2023.7.tar.gz dependencies/tmp/shaderc.tar.gz 681e1340726a0bf46bea7e31f10cbfe78e01e4446a35d90fedc2b78d400fcdeb
echo -n ">>> Extracting tiny-utf8... "
gzip -d dependencies/tmp/tiny-utf8.tar.gz
@ -90,13 +41,60 @@ gzip -d dependencies/tmp/sockpp.tar.gz
tar -xf dependencies/tmp/sockpp.tar -C dependencies
echo "done"
echo ">>> Building sockpp... "
pushd dependencies/sockpp-0.7.1/ >/dev/null 2>&1
echo -n ">>> Extracting zlib... "
xz -d dependencies/tmp/zlib.tar.xz
tar -xf dependencies/tmp/zlib.tar -C dependencies
echo "done"
cmake -G "MinGW Makefiles" -Bbuild .
cmake --build build
echo ">>> Building sockpp..."
pushd dependencies/sockpp-0.8.1/ >/dev/null 2>&1
if uname -s | tr [:upper:] [:lower:] | grep cygwin >/dev/null; then
echo "Adding Cygwin workaound for building sockpp."
#for FILE in "$(find ./ -type f)"; do
# sed -i -e 's/_WIN32/PLEASE_DO_NOT_DEFINE_THIS_MACRO/g' $FILE
#done
#mv ./include/sockpp/socket.h ./include/sockpp/socket.h_original
#echo '#include <sys/time.h>
##include "socket.h_original"' > ./include/sockpp/socket.h
sed -i -e 's/SO_REUSEPORT/SO_REUSEADDR/g' ./src/acceptor.cpp
#CFLAGS="-D_XOPEN_SOURCE=700" CXXFLAGS="-D_XOPEN_SOURCE=700" cmake -Bbuild
#CFLAGS="-D_XOPEN_SOURCE=700" CXXFLAGS="-D_XOPEN_SOURCE=700" cmake --build build
cmake -Bbuild .
cmake --build build
else
cmake -Bbuild .
cmake --build build
fi
popd >/dev/null 2>&1
echo ">>> done"
echo ">>> Dealing with shaderc shenanigans..."
pushd dependencies/tmp/shaderc
echo "Getting sources using the provided script..."
./update_shaderc_sources.py
SHADERC_BUILD="build-$(dd if=/dev/urandom bs=1 count=5 2>/dev/null | base32)"
echo "Creating and entering directory $SHADERC_BUILD."
mkdir "$SHADERC_BUILD"
cd "$SHADERC_BUILD"
echo "Running CMake..."
CXXFLAGS="-Wno-error" cmake -GNinja -DCMAKE_BUILD_TYPE=Release ../src/
echo "Running Ninja..."
ninja
popd >/dev/null 2>&1
#if needed copy more relevant files to dependencies/shaderc
echo "Copying binary to dependencies/shaderc/bin..."
mkdir -vp dependencies/shaderc/bin
cp -v "dependencies/tmp/shaderc/$SHADERC_BUILD/glslc/glslc" dependencies/shaderc/bin
echo ">>> done"
echo ">>> Building zlib..."
pushd dependencies/zlib-1.3.1/
./configure
make
popd
echo "done"
echo ">>> Cleaning up..."
remove dependencies/tmp
remove -f dependencies/tmp

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +0,0 @@
#!/usr/bin/env bash
# Copyright 2022, FOSS-VG Developers and Contributers
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# version 3 along with this program.
# If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
echo "################################################################################
Testing hexnet
################################################################################"
echo "Test not yet implemented."
#TODO: implement unit test after merging back with master

46
scripts/test/zlibutil.sh Executable file
View File

@ -0,0 +1,46 @@
#!/usr/bin/env bash
echo "================================================================================"
echo "Testing \`zlibutil\`:"
echo "--------------------------------------------------------------------------------"
TMPDIR="$(mktemp -d -t fossvg-zlibutil-XXXXX)"
TMPDATA="$(dd if=/dev/urandom bs=33 count=1 2>/dev/null | base64)"
echo -n "Compression test... "
echo -n "$TMPDATA" >> "$TMPDIR/compress"
zlibutil "$TMPDIR/compress"
python3 <<< "
import zlib, sys
tmpfile = open('$TMPDIR/compress.zz', 'rb')
data = tmpfile.read()
tmpfile.close()
try:
if zlib.decompress(data)==b'$TMPDATA':
print('PASS')
else:
print('FAIL: Wrong data.')
except:
print('FAIL: Exception.')
"
echo -n "Decompression test... "
#TODO: create a compressed file using another implementation (Python)
python3 <<< "
import zlib
tmpfile = open('$TMPDIR/decompress.zz', 'wb')
tmpfile.write(zlib.compress(b'$TMPDATA'))
tmpfile.close()
"
zlibutil -d "$TMPDIR/decompress.zz"
if [ "$(cat "$TMPDIR/decompress")" = "$TMPDATA" ]; then
echo "PASS"
else
echo "FAIL"
fi
rm -r "$TMPDIR"
echo "================================================================================"

View File

@ -13,7 +13,7 @@
# version 3 along with this program.
# If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
echo ">>> Loading Windows-specific shell environment for FOSS-VG development..."
echo ">>> Loading shell environment for FOSS-VG development..."
export PROJECT_BASE_DIR="$( cd -- "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 ; pwd -P )"
echo "Project base directory is $PROJECT_BASE_DIR"
@ -42,13 +42,19 @@ function build {
echo "Added aliases and functions."
export PATH="$PROJECT_BASE_DIR/bin:$PROJECT_BASE_DIR/bin/tools:$PROJECT_BASE_DIR/scripts/tools:$PATH"
# Windows workaround:
# Windows doesn't have LD_LIBRARY_PATH and searches for libraries on PATH instead.
export PATH="$PROJECT_BASE_DIR/bin/lib:$PATH"
if uname -s | tr [:upper:] [:lower:] | grep cygwin >/dev/null; then
echo "Adding Cygwin workaound for library path."
export PATH="$PROJECT_BASE_DIR/bin/lib:$PATH"
fi
echo "PATH is $PATH"
if [ -z "$LD_LIBRARY_PATH" ]; then
export LD_LIBRARY_PATH="$PROJECT_BASE_DIR"/bin/lib
else
export LD_LIBRARY_PATH="$PROJECT_BASE_DIR"/bin/lib:"$LD_LIBRARY_PATH"
fi
echo "LD_LIBRARY_PATH is $LD_LIBRARY_PATH"
echo ">>> Checking for dependencies..."
MISSING_DEPS=0

View File

@ -21,7 +21,10 @@
#include <cstdint>
#include <string>
#include <GLFW/glfw3.h>
#define GLFW_INCLUDE_VULKAN
extern "C" {
#include <GLFW/glfw3.h>
}
#include "./lib/cli.hpp"
@ -29,24 +32,27 @@
#define EXIT_RUNTIME 1
#define EXIT_USAGE 2
uint32_t windowWidth = 1366;
uint32_t windowHeight = 768;
//TODO: check the TODO above glfwInit() in void main()
// #### Callbacks ##############################################################
void cursorPositionCallback(GLFWwindow* window, double x, double y) {
void cursorPositionCallback([[maybe_unused]] GLFWwindow* window, [[maybe_unused]] double x, [[maybe_unused]] double y) {
}
void keyCallback(GLFWwindow* window, int32_t key, int32_t scancode, int32_t action, int32_t mods) {
void keyCallback([[maybe_unused]] GLFWwindow* window, [[maybe_unused]] int32_t key, [[maybe_unused]] int32_t scancode, [[maybe_unused]] int32_t action, [[maybe_unused]] int32_t mods) {
}
void textInputCallback(GLFWwindow* window, uint32_t codepoint) {
void textInputCallback([[maybe_unused]] GLFWwindow* window, [[maybe_unused]] uint32_t codepoint) {
}
void cursorEnterLeaveCallback(GLFWwindow* window, int32_t entered) {
void cursorEnterLeaveCallback([[maybe_unused]] GLFWwindow* window, [[maybe_unused]] int32_t entered) {
}
void mouseButtonCallback(GLFWwindow* window, int32_t button, int32_t action, int32_t mods) {
void mouseButtonCallback([[maybe_unused]] GLFWwindow* window, [[maybe_unused]] int32_t button, [[maybe_unused]] int32_t action, [[maybe_unused]] int32_t mods) {
}
void scrollCallback(GLFWwindow* window, double x, double y) {
void scrollCallback([[maybe_unused]] GLFWwindow* window, [[maybe_unused]] double x, [[maybe_unused]] double y) {
}
// #### End Callbacks ##########################################################
@ -55,6 +61,8 @@ int main(int argc, char* argv[]) {
flags.push_back(CLI::Flag('h', "help", "print help and exit"));
flags.push_back(CLI::Flag('l', "license", "print license information and exit"));
std::vector<CLI::Option> options;
options.push_back(CLI::Option('x', "window-width", "PIXELS", "window width on startup"));
options.push_back(CLI::Option('y', "window-height", "PIXELS", "window height on startup"));
std::vector<CLI::Argument> arguments;
CLI::ArgumentsParser cliParser = CLI::ArgumentsParser(argc, argv, flags, options, arguments, "FOSS-VG Client");
@ -88,6 +96,14 @@ int main(int argc, char* argv[]) {
return EXIT_USAGE;
}
if (cliParser.getOption("window-width").errorCode != ErrorCodes::NOT_PRESENT) {
windowWidth = std::stoi(cliParser.getOption("window-width").value);
}
if (cliParser.getOption("window-height").errorCode != ErrorCodes::NOT_PRESENT) {
windowHeight = std::stoi(cliParser.getOption("window-height").value);
}
// TODO: Find a better place for this
// Ideally, the window management and rendering portion of FOSS-VG should
@ -99,9 +115,11 @@ int main(int argc, char* argv[]) {
return EXIT_RUNTIME;
}
//TODO: allow to set startup window size using CLI options
uint32_t windowWidth = 1366;
uint32_t windowHeight = 768;
// do not create OpenGL context
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
//TODO: add a version macro
// (for example Git commit hash passed on the compiler command line)
std::string windowTitle = "FOSS-VG";
@ -113,9 +131,6 @@ int main(int argc, char* argv[]) {
return EXIT_RUNTIME;
}
// What dis do? It was in a tutorial.
glfwMakeContextCurrent(window);
glfwSetCursorPosCallback(window, cursorPositionCallback);
glfwSetKeyCallback(window, keyCallback);
glfwSetCharCallback(window, textInputCallback);
@ -124,12 +139,10 @@ int main(int argc, char* argv[]) {
glfwSetScrollCallback(window, scrollCallback);
while (!glfwWindowShouldClose(window)) {
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
}

View File

@ -17,6 +17,11 @@
#include <cstdint>
//TODO: needed macros:
// TRY: takes a variable, a function call, and the ErrorOr return type of the calling function - intended to automatically unwrap the ErrorOr data type or propagate the error upwards
// RAISE: takes an error code and optionally a message to produce something like `return ErrorOr<T>(true, errorCode, file, lineNumber, message)`
template <typename T>
struct ErrorOr {
bool isError;
@ -100,6 +105,9 @@ namespace ErrorCodes {
// when too much data is available
const uint8_t OVERFLOW = 13;
const uint8_t COMPRESSION = 14;
const uint8_t DECOMPRESSION = 15;
const uint8_t UNIMPLEMENTED = 254;
const uint8_t UNKNOWN = 255;

0
src/lib/game/block.cpp Normal file
View File

103
src/lib/game/block.hpp Normal file
View File

@ -0,0 +1,103 @@
#pragma once
#include <cstdint>
namespace block {
// For internal use only. These are examples, we will probably need
// a different way of assigning IDs in the future but a list should
// be fine for now, I guess.
// I dont know how Minecraft assigns its IDs or if it even matters
// given that it has used string IDs for a while now. We just need an
// internal way to distinguish between classes.
namespace ids {
const uint16_t AIR = 0;
const uint16_t STONE = 1;
}
// These are intended to be combined using bitwise OR.
namespace collisionBehavior {
// Let the block handle it.
// A function on the relevant block class will deal with it.
const uint8_t UNKNOWN = 0b00000000;
// Collision box inhibits movement?
// (stone or stone slab)
const uint8_t SOLID = 0b00000001;
// Does collision box fill entire block?
// (stone or grass block)
//
// The shape of the collision box is part of the relevant block class
// when this bit is unset.
const uint8_t FULL_BLOCK = 0b00000010;
const uint8_t SOLID_FULL_BLOCK = SOLID | FULL_BLOCK;
// Slow down entities when inside the block?
// (vines or soulsand)
//
// Entities are considered to be inside a given block when rounding
// their coordinates results in the coordinates of the block.
//
// The amount of slowdown is controlled by a function on the relevant
// block class.
const uint8_t SLOWDOWN = 0b00000100;
// Slow down entities when touching the collision box of the block?
// (honey block)
//
// The amount of slowdown is controlled by a function on the relevant
// block class.
const uint8_t SURFACE_SLOWDOWN = 0b00001000;
// Deal damage when entities are inside it?
// (berry bush)
//
// Entities are considered to be inside a given block when rounding
// their coordinates results in the coordinates of the block.
//
// The amount of damage is controlled by a function on the relevant
// block class.
const uint8_t DAMAGE = 0b00010000;
// Deal damage when entities touch the collision box?
// (magma block)
//
// The amount of damage is controlled by a function on the relevant
// block class.
const uint8_t SURFACE_DAMAGE = 0b00010000;
// Is the block bouncy?
// (bed or slime block)
//
// The bounciness of the block is handled by the relevant block class.
const uint8_t BOUNCY = 0b00100000;
}
class Generic {
private:
public:
virtual uint16_t id() = 0;
virtual uint8_t collisionBehavior() = 0;
//TODO: (not pure) virtual functions for collision box, slowdown, damage, bounciness, etc.
//TODO: (not pure) virtual function for hitbox (defaults to full block)
}
class Air {
public:
uint16_t id() {
return ids::AIR;
}
uint8_t collisionBehavior() {
// is a full block but doesn't collide or anything else
return collisionBehavior::FULL_BLOCK;
}
}
BlockGeneric* getNewBlockFromID(uint16_t id) {
//TODO
}
}

0
src/lib/game/entity.cpp Normal file
View File

0
src/lib/game/entity.hpp Normal file
View File

View File

@ -1311,7 +1311,8 @@ namespace NBT {
goto returnError;
}
contents.push_back(new Tag::Int8Array("", nextArray.value));
*processedDataSize += (uint64_t) nextArray.value.size();
// +4 for the header of the array
*processedDataSize += (uint64_t) nextArray.value.size() + 4;
}
break;
}
@ -1370,7 +1371,8 @@ namespace NBT {
goto returnError;
}
contents.push_back(new Tag::Int32Array("", nextArray.value));
*processedDataSize += (uint64_t) nextArray.value.size() * 4;
// +4 for the header of the array
*processedDataSize += (uint64_t) nextArray.value.size() * 4 + 4;
}
break;
}
@ -1382,7 +1384,8 @@ namespace NBT {
goto returnError;
}
contents.push_back(new Tag::Int64Array("", nextArray.value));
*processedDataSize += (uint64_t) nextArray.value.size() * 8;
// +4 for the header of the array
*processedDataSize += (uint64_t) nextArray.value.size() * 8 + 4;
}
break;
}
@ -1627,7 +1630,8 @@ namespace NBT {
if (nextArray.isError) {
return false;
}
*processedDataSize += (uint64_t) nextArray.value.size();
// +4 for the header of the array
*processedDataSize += (uint64_t) nextArray.value.size() + 4;
}
return true;
}
@ -1678,7 +1682,8 @@ namespace NBT {
if (nextArray.isError) {
return false;
}
*processedDataSize += (uint64_t) nextArray.value.size() * 4;
// +4 for the header of the array
*processedDataSize += (uint64_t) nextArray.value.size() * 4 + 4;
}
return true;
}
@ -1688,7 +1693,8 @@ namespace NBT {
if (nextArray.isError) {
return false;
}
*processedDataSize += (uint64_t) nextArray.value.size() * 8;
// +4 for the header of the array
*processedDataSize += (uint64_t) nextArray.value.size() * 8 + 4;
}
return true;
}

View File

@ -0,0 +1,42 @@
// Copyright 2022, FOSS-VG Developers and Contributers
//
// Author(s):
// BodgeMaster
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// version 3 along with this program.
// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
#pragma once
#include <string>
#include "../error.hpp"
namespace network {
struct Connection {
}
// host could be a hostname or address
ErrorOr<Connection> connect(std::string host);
void disconnect(Connection);
// start listening for incoming connections
ErrorOrVoid startListening();
// stop listening for new incoming connections but keep existing
// connections open
void stopListening();
// stop listening for incoming connections and disconnect all
void stopCommunication();
ErrorOr<Connection> acceptNextIncoming();
}

16
src/lib/net/tcp_server.h Normal file
View File

@ -0,0 +1,16 @@
// Copyright 2022, FOSS-VG Developers and Contributers
//
// Author(s):
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// version 3 along with this program.
// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html

17
src/lib/region.cpp Normal file
View File

@ -0,0 +1,17 @@
// Copyright 2023, FOSS-VG Developers and Contributers
//
// Author(s):
// BodgeMaster
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// version 3 along with this program.
// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html

57
src/lib/region.hpp Normal file
View File

@ -0,0 +1,57 @@
// Copyright 2023, FOSS-VG Developers and Contributers
//
// Author(s):
// BodgeMaster
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// version 3 along with this program.
// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
// File structure:
// 4K table of uint32_t: pointing to chunks
// -> 24bit offset, 8 bit length
// -> both offset and length are multiplied by 4096 to get the real value
// -> lowest valid offset = 2
// -> chunk is not present if pointer=0
// -> chunk calculation: ((x % 32) + (z % 32) * 32) * 4
// -> what about negative chunks?
// 4k table of uint32_t: last modified timestamps
// individual chunks
// -> 5 byte header
// -> 4 byte length
// -> 1 byte compression type: 0?? 1->gzip 2->zlib
// -> extension idea: support for other compression algorithms
// - lzma
// - xz
// - lz4
// - zstd
// -> compressed NBT data
#pragma once
#include <cstdint>
class Region {
uint32_t storagePointers[1024];
uint32_t lastModifiedTimestamps[1024];
// Chunk coordinates are uint8_t here bc they are 0<=x<32.
uint32_t* coordsToStoragePointer(uint8_t x, uint8_t z) {
return &storagePointers[z*32 + x];
}
// Chunk coordinates are uint8_t here bc they are 0<=x<32.
uint32_t* coordsToLastModified(uint8_t x, uint8_t z) {
return &lastModifiedTimestamps[z*32 + x];
}
}

116
src/lib/zlibutil.cpp Normal file
View File

@ -0,0 +1,116 @@
// Copyright 2022, FOSS-VG Developers and Contributers
//
// Author(s):
// Jocadbz
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// version 3 along with this program.
// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
// includes vector and error.hpp
#include "zlibutil.hpp"
#include <zlib/zlib.h>
#include <cstring>
#define EXIT_SUCCESS 0
#define EXIT_RUNTIME 1
#define EXIT_USAGE 2
#define CHUNK_SIZE 16384 // Chunk size
namespace zlib {
ErrorOr<std::vector<uint8_t>> compressData(std::vector<uint8_t> data) {
// I, too, love the fact that raw bytes are signed and therefore can have negative values. -_-
std::vector<int8_t> signedData = std::vector<int8_t>(data.begin(), data.end());
z_stream zs;
memset(&zs, 0, sizeof(zs));
if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK) {
return ErrorOr<std::vector<uint8_t>>(true, ErrorCodes::COMPRESSION);
//TODO: include error message once implemented
//throw(std::runtime_error("deflateInit failed while compressing."));
}
zs.next_in = reinterpret_cast<Bytef*>(reinterpret_cast<char*>(signedData.data()));
zs.avail_in = signedData.size();
int ret;
char outbuffer[CHUNK_SIZE];
std::vector<char> compressedData;
do {
zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
zs.avail_out = CHUNK_SIZE;
ret = deflate(&zs, Z_FINISH);
if (compressedData.size() < zs.total_out)
compressedData.insert(compressedData.end(), outbuffer, outbuffer + CHUNK_SIZE - zs.avail_out);
} while (ret == Z_OK);
deflateEnd(&zs);
if (ret != Z_STREAM_END) {
return ErrorOr<std::vector<uint8_t>>(true, ErrorCodes::COMPRESSION);
//TODO: include error message once implemented
//throw(std::runtime_error("Error while compressing: " + std::to_string(ret)));
}
return ErrorOr<std::vector<uint8_t>>(std::vector<uint8_t>(compressedData.begin(), compressedData.end()));
}
ErrorOr<std::vector<uint8_t>> decompressData(std::vector<uint8_t> data) {
// I, too, love the fact that raw bytes are signed and therefore can have negative values. -_-
std::vector<int8_t> signedData = std::vector<int8_t>(data.begin(), data.end());
z_stream zs;
memset(&zs, 0, sizeof(zs));
if (inflateInit(&zs) != Z_OK) {
return ErrorOr<std::vector<uint8_t>>(true, ErrorCodes::DECOMPRESSION);
//TODO: include error message once implemented
//throw(std::runtime_error("inflateInit failed while decompressing."));
}
zs.next_in = reinterpret_cast<Bytef*>(reinterpret_cast<char*>(signedData.data()));
zs.avail_in = signedData.size();
int ret;
char outbuffer[CHUNK_SIZE];
std::vector<char> decompressedData;
do {
zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
zs.avail_out = CHUNK_SIZE;
ret = inflate(&zs, 0);
if (decompressedData.size() < zs.total_out)
decompressedData.insert(decompressedData.end(), outbuffer, outbuffer + CHUNK_SIZE - zs.avail_out);
} while (ret == Z_OK);
inflateEnd(&zs);
if (ret != Z_STREAM_END) {
return ErrorOr<std::vector<uint8_t>>(true, ErrorCodes::DECOMPRESSION);
//TODO: include error message once implemented
//throw(std::runtime_error("Error while decompressing: " + std::to_string(ret)));
}
return ErrorOr<std::vector<uint8_t>>(std::vector<uint8_t>(decompressedData.begin(), decompressedData.end()));
}
}

27
src/lib/zlibutil.hpp Normal file
View File

@ -0,0 +1,27 @@
// Copyright 2024, FOSS-VG Developers and Contributers
//
// Author(s):
// Jocadbz
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// version 3 along with this program.
// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
#pragma once
#include <vector>
#include "error.hpp"
namespace zlib {
ErrorOr<std::vector<uint8_t>> compressData(std::vector<uint8_t> data);
ErrorOr<std::vector<uint8_t>> decompressData(std::vector<uint8_t> data);
}

0
src/shaders/.gitkeep Normal file
View File

155
src/tools/zlibutil.cpp Normal file
View File

@ -0,0 +1,155 @@
// Copyright 2024, FOSS-VG Developers and Contributers
//
// Author(s):
// Jocadbz
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// version 3 along with this program.
// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
#include <bitset>
#include <iomanip>
#include <iostream>
#include <vector>
#include <tinyutf8/tinyutf8.h>
#include <zlib/zlib.h>
#include <cstring>
#include <fstream>
#include "../lib/cli.hpp"
#include "../lib/file.hpp"
#include "../lib/zlibutil.hpp"
#include "../lib/error.hpp"
#define EXIT_SUCCESS 0
#define EXIT_RUNTIME 1
#define EXIT_USAGE 2
#define CHUNK_SIZE 16384 // Chunk size
/*
Finally, the main file
*/
int main(int argc, char* argv[]) {
std::vector<CLI::Flag> flags;
flags.push_back(CLI::Flag('d', "decompress", "descompress a file"));
std::vector<CLI::Option> options;
std::vector<CLI::Argument> arguments;
arguments.push_back(CLI::Argument("FILE", "path of the file to compress/decompress"));
CLI::ArgumentsParser cliParser = CLI::ArgumentsParser(argc, argv, flags, options, arguments, "Compress or decompress files using zlib");
if (cliParser.getFlag("help").value) {
std::cout << cliParser.getUsage() << std::endl;
return EXIT_SUCCESS;
}
if (cliParser.getFlag("license").value){
std::cout
<< "Copyright 2022, FOSS-VG Developers and Contributers\n"
<< "\n"
<< "ZlibUtil is part of the FOSS-VG development tool suite.\n"
<< "\n"
<< "This program is free software: you can redistribute it and/or modify it\n"
<< "under the terms of the GNU Affero General Public License as published\n"
<< "by the Free Software Foundation, version 3.\n"
<< "\n"
<< "This program is distributed in the hope that it will be useful,\n"
<< "but WITHOUT ANY WARRANTY; without even the implied\n"
<< "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
<< "See the GNU Affero General Public License for more details.\n"
<< "\n"
<< "You should have received a copy of the GNU Affero General Public License\n"
<< "version 3 along with this program.\n"
<< "If not, see https://www.gnu.org/licenses/agpl-3.0.en.html"
<< std::endl;
return EXIT_SUCCESS;
}
if (cliParser.wrongUsage) {
std::cout << cliParser.getUsage() << std::endl;
return EXIT_USAGE;
}
std::string filename = cliParser.getArgument(0).value;
ErrorOr<File*> filePointer = File::open(filename, 'r');
if (filePointer.isError) {
std::cout << "Failed to open file: " << filename << std::endl;
return EXIT_RUNTIME;
}
File* file = filePointer.value;
File* writeFile;
if (cliParser.getFlag("decompress").value) {
std::vector<uint8_t> bytes = file->read(file->size.value).value;
ErrorOr<std::vector<uint8_t>> decompressed = zlib::decompressData(bytes);
if (decompressed.isError) {
std::cout << "Error: Failed to decompress: " << filename << std::endl;
delete file;
// not cleaning up writeFile here bc it hasn't been created
return EXIT_RUNTIME;
}
std::string outFilename;
if (filename.length() > 3 && filename.rfind(".zz") == filename.length()-3) {
outFilename = filename.substr(0, filename.length()-3);
} else {
outFilename = filename + ".uncompressed";
}
writeFile = File::open(outFilename, 'w').value;
writeFile->write(decompressed.value);
writeFile->close();
} else {
std::vector<uint8_t> bytes = file->read(file->size.value).value;
ErrorOr<std::vector<uint8_t>> compressed = zlib::compressData(bytes);
if (compressed.isError) {
std::cout << "Error: Failed to compress: " << filename << std::endl;
delete file;
// not cleaning up writeFile here bc it hasn't been created
return EXIT_RUNTIME;
}
writeFile = File::open(filename + ".zz", 'w').value;
writeFile->write(compressed.value);
writeFile->close();
}
delete file;
delete writeFile;
}