Compare commits

...

333 Commits

Author SHA1 Message Date
419ad9c98c Minor Tweaks
All checks were successful
CI / Build (AMD64) (push) Successful in 21m44s
CI / Build (ARM64) (push) Successful in 23m2s
CI / Build (ARMHF) (push) Successful in 12m58s
CI / Test (AMD64, Server) (push) Successful in 2m22s
CI / Build Example Mods (push) Successful in 1m45s
CI / Test (ARM64, Client) (push) Successful in 5m17s
CI / Test (AMD64, Client) (push) Successful in 6m18s
CI / Test (ARM64, Server) (push) Successful in 2m14s
CI / Test (ARMHF, Client) (push) Successful in 5m29s
CI / Test (ARMHF, Server) (push) Successful in 2m24s
CI / Release (push) Has been skipped
2024-10-30 00:22:02 -04:00
a0a566f594 F3 Tweak
All checks were successful
CI / Build (AMD64) (push) Successful in 24m48s
CI / Build (ARM64) (push) Successful in 25m41s
CI / Build (ARMHF) (push) Successful in 12m51s
CI / Test (AMD64, Server) (push) Successful in 2m20s
CI / Build Example Mods (push) Successful in 1m47s
CI / Test (ARM64, Client) (push) Successful in 5m26s
CI / Test (AMD64, Client) (push) Successful in 6m13s
CI / Test (ARM64, Server) (push) Successful in 2m14s
CI / Test (ARMHF, Client) (push) Successful in 5m33s
CI / Test (ARMHF, Server) (push) Successful in 2m27s
CI / Release (push) Has been skipped
2024-10-29 22:48:23 -04:00
e6deab9664 Fix Headless Bug
All checks were successful
CI / Build (AMD64) (push) Successful in 22m58s
CI / Build (ARM64) (push) Successful in 24m39s
CI / Build (ARMHF) (push) Successful in 13m45s
CI / Test (AMD64, Server) (push) Successful in 2m28s
CI / Build Example Mods (push) Successful in 1m48s
CI / Test (ARM64, Client) (push) Successful in 5m16s
CI / Test (AMD64, Client) (push) Successful in 6m25s
CI / Test (ARM64, Server) (push) Successful in 2m12s
CI / Test (ARMHF, Client) (push) Successful in 5m27s
CI / Test (ARMHF, Server) (push) Successful in 2m28s
CI / Release (push) Has been skipped
2024-10-27 00:56:04 -04:00
69fcc6cdb3 800th Commit! Regenerating gui_blocks And Performance Fixes
Some checks failed
CI / Build (AMD64) (push) Successful in 30m19s
CI / Build (ARM64) (push) Successful in 31m19s
CI / Build (ARMHF) (push) Successful in 13m22s
CI / Test (AMD64, Client) (push) Failing after 1m21s
CI / Test (AMD64, Server) (push) Successful in 2m14s
CI / Test (ARM64, Client) (push) Failing after 2m17s
CI / Build Example Mods (push) Successful in 1m45s
CI / Test (ARM64, Server) (push) Successful in 2m14s
CI / Test (ARMHF, Client) (push) Failing after 2m27s
CI / Test (ARMHF, Server) (push) Successful in 2m24s
CI / Release (push) Has been skipped
2024-10-26 18:03:16 -04:00
ee44a0ce88 Fix Compiling On Older GCC
All checks were successful
CI / Build (AMD64) (push) Successful in 21m12s
CI / Build (ARM64) (push) Successful in 23m41s
CI / Build (ARMHF) (push) Successful in 13m47s
CI / Test (AMD64, Server) (push) Successful in 2m2s
CI / Build Example Mods (push) Successful in 1m50s
CI / Test (ARM64, Client) (push) Successful in 4m49s
CI / Test (AMD64, Client) (push) Successful in 6m21s
CI / Test (ARM64, Server) (push) Successful in 1m46s
CI / Test (ARMHF, Client) (push) Successful in 5m2s
CI / Test (ARMHF, Server) (push) Successful in 1m56s
CI / Release (push) Has been skipped
2024-10-20 18:10:17 -04:00
62d3512a38 Fix Lighting In ArmorScreen
Some checks failed
CI / Build (AMD64) (push) Successful in 26m55s
CI / Build (ARM64) (push) Successful in 29m23s
CI / Build (ARMHF) (push) Failing after 16m17s
CI / Test (AMD64, Client) (push) Has been skipped
CI / Test (AMD64, Server) (push) Has been skipped
CI / Test (ARM64, Client) (push) Has been skipped
CI / Test (ARM64, Server) (push) Has been skipped
CI / Test (ARMHF, Client) (push) Has been skipped
CI / Test (ARMHF, Server) (push) Has been skipped
CI / Build Example Mods (push) Has been skipped
CI / Release (push) Has been skipped
2024-10-20 17:19:37 -04:00
d011d76f20 Fix Shadow In ArmorScreen 2024-10-20 17:15:06 -04:00
dc7d3a5b8f Downgrade LIEF To Fix CMake 2024-10-20 17:09:15 -04:00
0f5d8730b0 Media Layer + Launching Tweaks
Some checks failed
CI / Build (AMD64) (push) Failing after 4m59s
CI / Build (ARM64) (push) Failing after 6m53s
CI / Build (ARMHF) (push) Failing after 4m46s
CI / Test (AMD64, Client) (push) Has been skipped
CI / Test (AMD64, Server) (push) Has been skipped
CI / Test (ARM64, Client) (push) Has been skipped
CI / Test (ARM64, Server) (push) Has been skipped
CI / Test (ARMHF, Client) (push) Has been skipped
CI / Test (ARMHF, Server) (push) Has been skipped
CI / Build Example Mods (push) Has been skipped
CI / Release (push) Has been skipped
2024-10-20 01:19:08 -04:00
f5da0f60e5 Fix Baby Shadows 2024-10-19 18:44:22 -04:00
fbb3152a70 Get Lighting Working!
Some checks failed
CI / Build (AMD64) (push) Successful in 21m15s
CI / Build (ARM64) (push) Successful in 23m26s
CI / Build (ARMHF) (push) Failing after 12m51s
CI / Test (AMD64, Client) (push) Has been skipped
CI / Test (AMD64, Server) (push) Has been skipped
CI / Test (ARM64, Client) (push) Has been skipped
CI / Test (ARM64, Server) (push) Has been skipped
CI / Test (ARMHF, Client) (push) Has been skipped
CI / Test (ARMHF, Server) (push) Has been skipped
CI / Build Example Mods (push) Has been skipped
CI / Release (push) Has been skipped
2024-10-19 05:19:08 -04:00
18f7d64405 Entities Have Shading! 2024-10-18 15:14:18 -04:00
1001427309 Rest Of The Tesselator 2024-10-18 01:41:59 -04:00
b2db67b4bf Custom Tesselator 2024-10-18 01:09:13 -04:00
d289f40a5e Small Changes 2024-10-17 18:49:36 -04:00
e7b0932f60 Increase Render Chunk Size 2024-10-17 18:02:46 -04:00
8bc335b479 Update Changelog 2024-10-15 14:03:16 -04:00
73b3cd10af Vignette
All checks were successful
CI / Build (AMD64) (push) Successful in 20m26s
CI / Build (ARM64) (push) Successful in 21m46s
CI / Build (ARMHF) (push) Successful in 12m9s
CI / Test (AMD64, Server) (push) Successful in 2m28s
CI / Build Example Mods (push) Successful in 1m41s
CI / Test (ARM64, Client) (push) Successful in 4m49s
CI / Test (AMD64, Client) (push) Successful in 6m21s
CI / Test (ARM64, Server) (push) Successful in 1m45s
CI / Test (ARMHF, Client) (push) Successful in 5m1s
CI / Test (ARMHF, Server) (push) Successful in 1m56s
CI / Release (push) Has been skipped
2024-10-15 13:38:22 -04:00
463ede508e Reduce Code Duplication
All checks were successful
CI / Build (AMD64) (push) Successful in 22m4s
CI / Build (ARM64) (push) Successful in 23m28s
CI / Build (ARMHF) (push) Successful in 12m50s
CI / Test (AMD64, Server) (push) Successful in 2m20s
CI / Build Example Mods (push) Successful in 1m53s
CI / Test (ARM64, Client) (push) Successful in 4m48s
CI / Test (AMD64, Client) (push) Successful in 6m17s
CI / Test (ARM64, Server) (push) Successful in 1m44s
CI / Test (ARMHF, Client) (push) Successful in 5m1s
CI / Test (ARMHF, Server) (push) Successful in 1m55s
CI / Release (push) Has been skipped
2024-10-09 10:43:44 -04:00
0c92551e8a Improve HOOK()
All checks were successful
CI / Build (AMD64) (push) Successful in 22m29s
CI / Build (ARM64) (push) Successful in 23m48s
CI / Build (ARMHF) (push) Successful in 13m55s
CI / Test (AMD64, Server) (push) Successful in 2m20s
CI / Build Example Mods (push) Successful in 1m41s
CI / Test (ARM64, Client) (push) Successful in 4m47s
CI / Test (AMD64, Client) (push) Successful in 6m15s
CI / Test (ARM64, Server) (push) Successful in 1m43s
CI / Test (ARMHF, Client) (push) Successful in 4m59s
CI / Test (ARMHF, Server) (push) Successful in 1m57s
CI / Release (push) Has been skipped
2024-10-07 10:18:16 -04:00
6388663b6c Switch To Desktop OpenGL 1.5
All checks were successful
CI / Build (AMD64) (push) Successful in 22m37s
CI / Build (ARM64) (push) Successful in 24m55s
CI / Build (ARMHF) (push) Successful in 14m14s
CI / Test (AMD64, Server) (push) Successful in 2m24s
CI / Build Example Mods (push) Successful in 1m46s
CI / Test (ARM64, Client) (push) Successful in 4m49s
CI / Test (ARM64, Server) (push) Successful in 1m44s
CI / Test (AMD64, Client) (push) Successful in 6m42s
CI / Test (ARMHF, Client) (push) Successful in 5m0s
CI / Test (ARMHF, Server) (push) Successful in 1m56s
CI / Release (push) Has been skipped
2024-10-05 23:52:44 -04:00
5668dcc852 Render Entity Shadows
All checks were successful
CI / Build (AMD64) (push) Successful in 20m58s
CI / Build (ARM64) (push) Successful in 22m46s
CI / Build (ARMHF) (push) Successful in 12m48s
CI / Test (AMD64, Server) (push) Successful in 1m56s
CI / Build Example Mods (push) Successful in 1m55s
CI / Test (ARM64, Client) (push) Successful in 4m43s
CI / Test (AMD64, Client) (push) Successful in 6m15s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (ARMHF, Client) (push) Successful in 4m55s
CI / Test (ARMHF, Server) (push) Successful in 1m55s
CI / Release (push) Has been skipped
2024-10-03 20:29:24 -04:00
d4ab0099f0 Tweak 3D Items
All checks were successful
CI / Build (AMD64) (push) Successful in 21m25s
CI / Build (ARM64) (push) Successful in 23m3s
CI / Build (ARMHF) (push) Successful in 12m33s
CI / Test (AMD64, Server) (push) Successful in 2m26s
CI / Build Example Mods (push) Successful in 1m42s
CI / Test (ARM64, Client) (push) Successful in 4m43s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (AMD64, Client) (push) Successful in 6m23s
CI / Test (ARMHF, Client) (push) Successful in 4m53s
CI / Test (ARMHF, Server) (push) Successful in 1m53s
CI / Release (push) Has been skipped
2024-10-03 16:22:53 -04:00
3d8525a321 3D Items!
All checks were successful
CI / Build (AMD64) (push) Successful in 22m53s
CI / Build (ARM64) (push) Successful in 24m14s
CI / Build (ARMHF) (push) Successful in 12m41s
CI / Test (AMD64, Server) (push) Successful in 2m31s
CI / Build Example Mods (push) Successful in 1m44s
CI / Test (ARM64, Client) (push) Successful in 4m44s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (AMD64, Client) (push) Successful in 6m24s
CI / Test (ARMHF, Client) (push) Successful in 4m55s
CI / Test (ARMHF, Server) (push) Successful in 1m53s
CI / Release (push) Has been skipped
2024-10-03 05:17:12 -04:00
b11cc95e50 Fix ChatPacket Reading
All checks were successful
CI / Build (AMD64) (push) Successful in 21m59s
CI / Build (ARM64) (push) Successful in 22m55s
CI / Build (ARMHF) (push) Successful in 12m22s
CI / Test (AMD64, Server) (push) Successful in 2m31s
CI / Build Example Mods (push) Successful in 1m40s
CI / Test (ARM64, Client) (push) Successful in 4m45s
CI / Test (AMD64, Client) (push) Successful in 6m22s
CI / Test (ARM64, Server) (push) Successful in 1m41s
CI / Test (ARMHF, Client) (push) Successful in 4m55s
CI / Test (ARMHF, Server) (push) Successful in 1m53s
CI / Release (push) Has been skipped
2024-10-01 20:44:50 -04:00
661cfd02ad Expand Debug Info
All checks were successful
CI / Build (AMD64) (push) Successful in 22m49s
CI / Build (ARM64) (push) Successful in 24m50s
CI / Build (ARMHF) (push) Successful in 14m3s
CI / Test (AMD64, Server) (push) Successful in 2m30s
CI / Build Example Mods (push) Successful in 1m46s
CI / Test (ARM64, Client) (push) Successful in 4m44s
CI / Test (AMD64, Client) (push) Successful in 6m24s
CI / Test (ARM64, Server) (push) Successful in 1m40s
CI / Test (ARMHF, Client) (push) Successful in 4m56s
CI / Test (ARMHF, Server) (push) Successful in 1m53s
CI / Release (push) Has been skipped
2024-09-30 22:00:19 -04:00
66f4f11a68 Tweak Debug Screen 2024-09-30 13:13:02 -04:00
52ca5bb734 Show Seed In Debug Info
All checks were successful
CI / Build (AMD64) (push) Successful in 21m35s
CI / Build (ARM64) (push) Successful in 25m4s
CI / Build (ARMHF) (push) Successful in 17m8s
CI / Test (AMD64, Server) (push) Successful in 2m19s
CI / Build Example Mods (push) Successful in 1m49s
CI / Test (ARM64, Client) (push) Successful in 4m43s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (AMD64, Client) (push) Successful in 6m32s
CI / Test (ARMHF, Client) (push) Successful in 4m55s
CI / Test (ARMHF, Server) (push) Successful in 1m52s
CI / Release (push) Has been skipped
2024-09-30 00:45:53 -04:00
916902ab68 Changes Needed For Hodgepodge
Some checks failed
CI / Test (ARMHF, Server) (push) Blocked by required conditions
CI / Release (push) Blocked by required conditions
CI / Build (AMD64) (push) Successful in 21m47s
CI / Build (ARM64) (push) Successful in 22m39s
CI / Build (ARMHF) (push) Successful in 12m54s
CI / Test (AMD64, Server) (push) Successful in 2m37s
CI / Build Example Mods (push) Successful in 1m43s
CI / Test (ARM64, Client) (push) Successful in 4m43s
CI / Test (ARM64, Server) (push) Successful in 1m40s
CI / Test (AMD64, Client) (push) Successful in 6m32s
CI / Test (ARMHF, Client) (push) Has been cancelled
2024-09-30 00:03:52 -04:00
9bdde40f3f Click Buttons On Mouse Down
All checks were successful
CI / Build (AMD64) (push) Successful in 21m21s
CI / Build (ARM64) (push) Successful in 22m44s
CI / Build (ARMHF) (push) Successful in 14m2s
CI / Test (AMD64, Server) (push) Successful in 2m45s
CI / Build Example Mods (push) Successful in 1m52s
CI / Test (ARM64, Client) (push) Successful in 4m44s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (AMD64, Client) (push) Successful in 6m46s
CI / Test (ARMHF, Client) (push) Successful in 4m54s
CI / Test (ARMHF, Server) (push) Successful in 1m53s
CI / Release (push) Has been skipped
2024-09-29 00:49:03 -04:00
cbca78ec16 Try To Fix server.properties Generation
All checks were successful
CI / Build (AMD64) (push) Successful in 20m39s
CI / Build (ARM64) (push) Successful in 22m28s
CI / Build (ARMHF) (push) Successful in 12m40s
CI / Test (AMD64, Server) (push) Successful in 2m23s
CI / Build Example Mods (push) Successful in 1m42s
CI / Test (ARM64, Client) (push) Successful in 4m44s
CI / Test (AMD64, Client) (push) Successful in 6m19s
CI / Test (ARM64, Server) (push) Successful in 1m40s
CI / Test (ARMHF, Client) (push) Successful in 4m53s
CI / Test (ARMHF, Server) (push) Successful in 1m51s
CI / Release (push) Has been skipped
2024-09-23 21:35:20 -04:00
65190afe73 Fix Rare Segfault 2024-09-23 21:22:43 -04:00
be3ccae7c1 Hide Block Outline When GUI Is Hidden
All checks were successful
CI / Build (AMD64) (push) Successful in 21m34s
CI / Build (ARM64) (push) Successful in 22m47s
CI / Build (ARMHF) (push) Successful in 12m18s
CI / Test (AMD64, Server) (push) Successful in 2m23s
CI / Build Example Mods (push) Successful in 1m42s
CI / Test (ARM64, Client) (push) Successful in 4m46s
CI / Test (AMD64, Client) (push) Successful in 6m23s
CI / Test (ARM64, Server) (push) Successful in 1m42s
CI / Test (ARMHF, Client) (push) Successful in 4m57s
CI / Test (ARMHF, Server) (push) Successful in 1m53s
CI / Release (push) Has been skipped
2024-09-23 18:52:15 -04:00
00d193e732 Fix Bad Error
All checks were successful
CI / Build (AMD64) (push) Successful in 20m7s
CI / Build (ARM64) (push) Successful in 22m2s
CI / Build (ARMHF) (push) Successful in 12m34s
CI / Test (AMD64, Server) (push) Successful in 2m24s
CI / Build Example Mods (push) Successful in 1m42s
CI / Test (ARM64, Client) (push) Successful in 4m41s
CI / Test (AMD64, Client) (push) Successful in 6m15s
CI / Test (ARM64, Server) (push) Successful in 1m38s
CI / Test (ARMHF, Client) (push) Successful in 4m53s
CI / Test (ARMHF, Server) (push) Successful in 1m49s
CI / Release (push) Has been skipped
2024-09-22 22:22:32 -04:00
65ee4d8a78 Shrink Icon For Flatpak
All checks were successful
CI / Build (AMD64) (push) Successful in 21m8s
CI / Build (ARM64) (push) Successful in 23m43s
CI / Build (ARMHF) (push) Successful in 16m16s
CI / Test (AMD64, Server) (push) Successful in 2m26s
CI / Build Example Mods (push) Successful in 1m41s
CI / Test (ARM64, Client) (push) Successful in 4m41s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (AMD64, Client) (push) Successful in 6m22s
CI / Test (ARMHF, Client) (push) Successful in 4m53s
CI / Test (ARMHF, Server) (push) Successful in 1m51s
CI / Release (push) Has been skipped
2024-09-22 21:21:53 -04:00
3598fbc922 Revert Bad Idea
All checks were successful
CI / Build (AMD64) (push) Successful in 23m55s
CI / Build (ARM64) (push) Successful in 27m9s
CI / Build (ARMHF) (push) Successful in 13m59s
CI / Test (AMD64, Server) (push) Successful in 2m26s
CI / Build Example Mods (push) Successful in 1m42s
CI / Test (ARM64, Client) (push) Successful in 4m43s
CI / Test (AMD64, Client) (push) Successful in 6m21s
CI / Test (ARM64, Server) (push) Successful in 2m27s
CI / Test (ARMHF, Client) (push) Successful in 4m57s
CI / Test (ARMHF, Server) (push) Successful in 1m52s
CI / Release (push) Has been skipped
2024-09-22 20:25:59 -04:00
b5e9a91f75 Test Crafting Remainder
Some checks failed
CI / Build (ARMHF) (push) Waiting to run
CI / Test (AMD64, Client) (push) Blocked by required conditions
CI / Test (AMD64, Server) (push) Blocked by required conditions
CI / Test (ARM64, Client) (push) Blocked by required conditions
CI / Test (ARM64, Server) (push) Blocked by required conditions
CI / Test (ARMHF, Client) (push) Blocked by required conditions
CI / Test (ARMHF, Server) (push) Blocked by required conditions
CI / Build Example Mods (push) Blocked by required conditions
CI / Release (push) Blocked by required conditions
CI / Build (AMD64) (push) Has been cancelled
CI / Build (ARM64) (push) Has been cancelled
2024-09-22 20:02:40 -04:00
18c6247e0c Fix Button Hovering 2024-09-22 19:39:42 -04:00
c525d69dc3 New Logo + Background! 2024-09-22 19:28:51 -04:00
72eb1945cf Update Processor
All checks were successful
CI / Build (AMD64) (push) Successful in 21m15s
CI / Build (ARM64) (push) Successful in 23m6s
CI / Build (ARMHF) (push) Successful in 14m20s
CI / Test (AMD64, Server) (push) Successful in 2m49s
CI / Test (ARM64, Client) (push) Successful in 4m41s
CI / Build Example Mods (push) Successful in 2m12s
CI / Test (ARM64, Server) (push) Successful in 1m40s
CI / Test (AMD64, Client) (push) Successful in 7m22s
CI / Test (ARMHF, Client) (push) Successful in 4m54s
CI / Test (ARMHF, Server) (push) Successful in 1m51s
CI / Release (push) Has been skipped
2024-09-21 02:54:11 -04:00
5ca2a63b5e Allow Custom Commands 2024-09-21 02:30:06 -04:00
72e2c4947d Update Runtime
All checks were successful
CI / Build (AMD64) (push) Successful in 24m34s
CI / Build (ARM64) (push) Successful in 27m3s
CI / Build (ARMHF) (push) Successful in 16m43s
CI / Test (AMD64, Server) (push) Successful in 2m33s
CI / Build Example Mods (push) Successful in 1m50s
CI / Test (ARM64, Client) (push) Successful in 4m41s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (AMD64, Client) (push) Successful in 6m45s
CI / Test (ARMHF, Client) (push) Successful in 4m53s
CI / Test (ARMHF, Server) (push) Successful in 1m51s
CI / Release (push) Has been skipped
2024-09-21 01:55:10 -04:00
be1f3bf50e Fix Chat Example Mod 2024-09-21 01:49:47 -04:00
e2c82071c7 Server Changes 2024-09-21 01:46:52 -04:00
9bb6b86c73 Some Tweaks
Some checks failed
CI / Build (AMD64) (push) Successful in 26m51s
CI / Build (ARM64) (push) Successful in 29m30s
CI / Build (ARMHF) (push) Successful in 17m33s
CI / Test (AMD64, Server) (push) Successful in 2m40s
CI / Build Example Mods (push) Failing after 1m31s
CI / Test (ARM64, Client) (push) Successful in 4m46s
CI / Test (ARM64, Server) (push) Successful in 1m39s
CI / Test (AMD64, Client) (push) Successful in 6m41s
CI / Test (ARMHF, Client) (push) Successful in 4m55s
CI / Test (ARMHF, Server) (push) Successful in 1m51s
CI / Release (push) Has been skipped
2024-09-21 00:23:30 -04:00
c0156336df Modding Changes 2024-09-20 21:30:47 -04:00
f1fe1c140c More Feature Flags!
All checks were successful
CI / Build (AMD64) (push) Successful in 20m43s
CI / Build (ARM64) (push) Successful in 22m49s
CI / Build (ARMHF) (push) Successful in 13m5s
CI / Test (AMD64, Server) (push) Successful in 2m12s
CI / Build Example Mods (push) Successful in 1m40s
CI / Test (ARM64, Client) (push) Successful in 4m1s
CI / Test (ARM64, Server) (push) Successful in 59s
CI / Test (AMD64, Client) (push) Successful in 6m9s
CI / Test (ARMHF, Client) (push) Successful in 4m13s
CI / Test (ARMHF, Server) (push) Successful in 1m12s
CI / Release (push) Has been skipped
2024-08-25 18:14:30 -04:00
8ef6e0885a Split Up misc.cpp
All checks were successful
CI / Build (AMD64) (push) Successful in 21m28s
CI / Build (ARM64) (push) Successful in 23m24s
CI / Build (ARMHF) (push) Successful in 13m9s
CI / Test (AMD64, Server) (push) Successful in 2m14s
CI / Build Example Mods (push) Successful in 1m41s
CI / Test (ARM64, Client) (push) Successful in 4m2s
CI / Test (ARM64, Server) (push) Successful in 59s
CI / Test (AMD64, Client) (push) Successful in 6m14s
CI / Test (ARMHF, Client) (push) Successful in 4m15s
CI / Test (ARMHF, Server) (push) Successful in 1m11s
CI / Release (push) Has been skipped
2024-08-25 17:06:12 -04:00
c5937e6794 Way Too Many Changes
All checks were successful
CI / Build (AMD64) (push) Successful in 20m54s
CI / Build (ARM64) (push) Successful in 23m4s
CI / Build (ARMHF) (push) Successful in 13m7s
CI / Test (AMD64, Server) (push) Successful in 2m20s
CI / Build Example Mods (push) Successful in 1m38s
CI / Test (ARM64, Client) (push) Successful in 4m1s
CI / Test (ARM64, Server) (push) Successful in 59s
CI / Test (AMD64, Client) (push) Successful in 6m10s
CI / Test (ARMHF, Client) (push) Successful in 4m15s
CI / Test (ARMHF, Server) (push) Successful in 1m12s
CI / Release (push) Has been skipped
2024-08-24 00:30:06 -04:00
07f5e188f7 Bug Fixes & Improvements
All checks were successful
CI / Build (AMD64) (push) Successful in 19m40s
CI / Build (ARM64) (push) Successful in 22m32s
CI / Build (ARMHF) (push) Successful in 13m16s
CI / Test (AMD64, Server) (push) Successful in 1m44s
CI / Build Example Mods (push) Successful in 1m40s
CI / Test (ARM64, Client) (push) Successful in 4m0s
CI / Test (ARM64, Server) (push) Successful in 58s
CI / Test (AMD64, Client) (push) Successful in 5m57s
CI / Test (ARMHF, Client) (push) Successful in 4m12s
CI / Test (ARMHF, Server) (push) Successful in 1m9s
CI / Release (push) Has been skipped
2024-08-23 05:18:20 -04:00
18b25486e7 Fix Door Item Issues
All checks were successful
CI / Build (AMD64) (push) Successful in 21m15s
CI / Build (ARM64) (push) Successful in 23m6s
CI / Build (ARMHF) (push) Successful in 12m59s
CI / Test (AMD64, Server) (push) Successful in 2m2s
CI / Build Example Mods (push) Successful in 1m40s
CI / Test (ARM64, Client) (push) Successful in 4m1s
CI / Test (ARM64, Server) (push) Successful in 59s
CI / Test (AMD64, Client) (push) Successful in 6m9s
CI / Test (ARMHF, Client) (push) Successful in 4m13s
CI / Test (ARMHF, Server) (push) Successful in 1m9s
CI / Release (push) Has been skipped
2024-08-22 23:43:32 -04:00
72372c7457 Small Fixes
All checks were successful
CI / Build (AMD64) (push) Successful in 21m1s
CI / Build (ARM64) (push) Successful in 22m8s
CI / Build (ARMHF) (push) Successful in 12m3s
CI / Test (AMD64, Server) (push) Successful in 2m16s
CI / Test (ARM64, Client) (push) Successful in 4m4s
CI / Build Example Mods (push) Successful in 2m10s
CI / Test (ARM64, Server) (push) Successful in 58s
CI / Test (AMD64, Client) (push) Successful in 6m13s
CI / Test (ARMHF, Client) (push) Successful in 4m15s
CI / Test (ARMHF, Server) (push) Successful in 1m11s
CI / Release (push) Has been skipped
2024-08-21 18:19:07 -04:00
63e2525ee9 Improve Build Time
All checks were successful
CI / Build (AMD64) (push) Successful in 22m8s
CI / Build (ARM64) (push) Successful in 24m56s
CI / Build (ARMHF) (push) Successful in 14m9s
CI / Test (AMD64, Server) (push) Successful in 2m14s
CI / Build Example Mods (push) Successful in 1m45s
CI / Test (ARM64, Client) (push) Successful in 4m2s
CI / Test (ARM64, Server) (push) Successful in 58s
CI / Test (AMD64, Client) (push) Successful in 6m21s
CI / Test (ARMHF, Client) (push) Successful in 4m16s
CI / Test (ARMHF, Server) (push) Successful in 1m14s
CI / Release (push) Has been skipped
2024-08-02 01:03:20 -04:00
98c4ee306d It Works!
Some checks failed
CI / Build (AMD64) (push) Successful in 15m58s
CI / Build (ARM64) (push) Successful in 15m18s
CI / Build (ARMHF) (push) Successful in 21m35s
CI / Test (ARM64, Client) (push) Successful in 4m0s
CI / Test (ARM64, Server) (push) Successful in 58s
CI / Test (AMD64, Client) (push) Successful in 5m12s
CI / Test (AMD64, Server) (push) Successful in 1m21s
CI / Build Example Mods (push) Failing after 1m3s
CI / Test (ARMHF, Client) (push) Successful in 4m11s
CI / Test (ARMHF, Server) (push) Successful in 1m10s
CI / Release (push) Has been skipped
2024-07-17 06:42:58 -04:00
5f2923b789 Merge PR + WIP Refactor
Co-authored-by: Bigjango13 <bigjango13@gmail.com>
2024-07-17 03:44:44 -04:00
036d0a0653 Tweak
All checks were successful
CI / Build (ARM64) (push) Successful in 19m29s
CI / Build (AMD64) (push) Successful in 20m22s
CI / Build (ARMHF) (push) Successful in 10m0s
CI / Test (AMD64, Server) (push) Successful in 2m22s
CI / Build Example Mods (push) Successful in 1m31s
CI / Test (ARM64, Client) (push) Successful in 4m1s
CI / Test (ARM64, Server) (push) Successful in 58s
CI / Test (AMD64, Client) (push) Successful in 6m16s
CI / Test (ARMHF, Client) (push) Successful in 4m13s
CI / Test (ARMHF, Server) (push) Successful in 1m10s
CI / Release (push) Has been skipped
2024-07-16 13:46:37 -04:00
e837610380 Fix Example Mods (Again)
All checks were successful
CI / Build (AMD64) (push) Successful in 18m43s
CI / Build (ARM64) (push) Successful in 20m13s
CI / Build (ARMHF) (push) Successful in 11m29s
CI / Test (ARM64, Client) (push) Successful in 3m52s
CI / Build Example Mods (push) Successful in 1m49s
CI / Test (ARM64, Server) (push) Successful in 50s
CI / Test (AMD64, Client) (push) Successful in 6m48s
CI / Test (ARMHF, Client) (push) Successful in 4m2s
CI / Test (ARMHF, Server) (push) Successful in 1m0s
CI / Test (AMD64, Server) (push) Successful in 1m21s
CI / Release (push) Has been skipped
2024-07-15 03:09:19 -04:00
88f59d951a References! References Everywhere! 2024-07-15 03:05:05 -04:00
0521b540fd Fix Example Mods
All checks were successful
CI / Build (ARM64) (push) Successful in 19m6s
CI / Build (AMD64) (push) Successful in 19m41s
CI / Build (ARMHF) (push) Successful in 12m0s
CI / Test (AMD64, Server) (push) Successful in 2m27s
CI / Test (ARM64, Client) (push) Successful in 3m51s
CI / Build Example Mods (push) Successful in 1m34s
CI / Test (ARM64, Server) (push) Successful in 49s
CI / Test (AMD64, Client) (push) Successful in 6m20s
CI / Test (ARMHF, Client) (push) Successful in 4m3s
CI / Test (ARMHF, Server) (push) Successful in 59s
CI / Release (push) Has been skipped
2024-07-14 22:12:08 -04:00
d2b07f7661 minecraft.h/.cpp Changes
Some checks failed
CI / Build (AMD64) (push) Successful in 18m38s
CI / Build (ARM64) (push) Successful in 18m36s
CI / Build (ARMHF) (push) Successful in 9m42s
CI / Test (AMD64, Server) (push) Successful in 2m16s
CI / Build Example Mods (push) Failing after 1m20s
CI / Test (ARM64, Client) (push) Successful in 3m50s
CI / Test (ARM64, Server) (push) Successful in 48s
CI / Test (AMD64, Client) (push) Successful in 6m4s
CI / Test (ARMHF, Client) (push) Successful in 4m3s
CI / Test (ARMHF, Server) (push) Successful in 1m3s
CI / Release (push) Has been skipped
2024-07-14 05:06:27 -04:00
688bee1aaa Use PerformanceTestChunkSource In Benchmark 2024-07-11 00:29:53 -04:00
d4c0f54245 Multidraw
All checks were successful
CI / Build (ARM64) (push) Successful in 18m30s
CI / Build (AMD64) (push) Successful in 19m1s
CI / Build (ARMHF) (push) Successful in 12m21s
CI / Test (AMD64, Server) (push) Successful in 2m15s
CI / Build Example Mods (push) Successful in 1m17s
CI / Test (ARM64, Client) (push) Successful in 3m51s
CI / Test (ARM64, Server) (push) Successful in 48s
CI / Test (AMD64, Client) (push) Successful in 5m25s
CI / Test (ARMHF, Client) (push) Successful in 4m1s
CI / Test (ARMHF, Server) (push) Successful in 1m2s
CI / Release (push) Has been skipped
2024-07-10 23:15:58 -04:00
f08afbf654 Allow Skipping Page-Size Check
All checks were successful
CI / Build (ARM64) (push) Successful in 19m0s
CI / Build (AMD64) (push) Successful in 19m11s
CI / Build (ARMHF) (push) Successful in 11m45s
CI / Test (AMD64, Server) (push) Successful in 2m7s
CI / Build Example Mods (push) Successful in 1m17s
CI / Test (ARM64, Client) (push) Successful in 3m45s
CI / Test (ARM64, Server) (push) Successful in 44s
CI / Test (AMD64, Client) (push) Successful in 5m12s
CI / Test (ARMHF, Client) (push) Successful in 3m57s
CI / Test (ARMHF, Server) (push) Successful in 56s
CI / Release (push) Has been skipped
2024-07-05 03:24:27 -04:00
f7bc756063 Bug Fixes + F3
All checks were successful
CI / Build (ARM64) (push) Successful in 19m24s
CI / Build (AMD64) (push) Successful in 19m50s
CI / Build (ARMHF) (push) Successful in 11m49s
CI / Test (AMD64, Server) (push) Successful in 2m17s
CI / Build Example Mods (push) Successful in 1m14s
CI / Test (ARM64, Client) (push) Successful in 3m45s
CI / Test (ARM64, Server) (push) Successful in 45s
CI / Test (AMD64, Client) (push) Successful in 5m19s
CI / Test (ARMHF, Client) (push) Successful in 3m57s
CI / Test (ARMHF, Server) (push) Successful in 57s
CI / Release (push) Has been skipped
2024-07-05 02:33:29 -04:00
7718fe5b12 Small Bug Fix
All checks were successful
CI / Build (ARM64) (push) Successful in 17m42s
CI / Build (AMD64) (push) Successful in 17m49s
CI / Build (ARMHF) (push) Successful in 11m33s
CI / Test (AMD64, Server) (push) Successful in 2m6s
CI / Build Example Mods (push) Successful in 1m18s
CI / Test (ARM64, Client) (push) Successful in 3m26s
CI / Test (ARM64, Server) (push) Successful in 26s
CI / Test (AMD64, Client) (push) Successful in 5m10s
CI / Test (ARMHF, Client) (push) Successful in 3m40s
CI / Test (ARMHF, Server) (push) Successful in 39s
CI / Release (push) Has been skipped
2024-06-21 01:32:11 -04:00
6a2ecb23ed Remove overwrite()
Some checks failed
CI / Build (ARMHF) (push) Waiting to run
CI / Test (AMD64, Client) (push) Blocked by required conditions
CI / Test (AMD64, Server) (push) Blocked by required conditions
CI / Test (ARM64, Client) (push) Blocked by required conditions
CI / Test (ARM64, Server) (push) Blocked by required conditions
CI / Test (ARMHF, Client) (push) Blocked by required conditions
CI / Test (ARMHF, Server) (push) Blocked by required conditions
CI / Build Example Mods (push) Blocked by required conditions
CI / Release (push) Blocked by required conditions
CI / Build (AMD64) (push) Has been cancelled
CI / Build (ARM64) (push) Has been cancelled
2024-06-21 01:22:33 -04:00
5e229fb6a8 Some Modernization 2024-06-21 01:19:37 -04:00
cecd61ed72 Another Small Update
All checks were successful
CI / Build (AMD64) (push) Successful in 16m24s
CI / Build (ARM64) (push) Successful in 17m13s
CI / Build (ARMHF) (push) Successful in 11m18s
CI / Test (AMD64, Server) (push) Successful in 2m24s
CI / Test (ARM64, Client) (push) Successful in 3m27s
CI / Build Example Mods (push) Successful in 1m8s
CI / Test (ARM64, Server) (push) Successful in 27s
CI / Test (AMD64, Client) (push) Successful in 5m12s
CI / Test (ARMHF, Client) (push) Successful in 3m38s
CI / Test (ARMHF, Server) (push) Successful in 37s
CI / Release (push) Has been skipped
2024-06-18 18:15:06 -04:00
57df81e425 Update
Some checks failed
CI / Build (ARMHF) (push) Waiting to run
CI / Test (AMD64, Client) (push) Blocked by required conditions
CI / Test (AMD64, Server) (push) Blocked by required conditions
CI / Test (ARM64, Client) (push) Blocked by required conditions
CI / Test (ARM64, Server) (push) Blocked by required conditions
CI / Test (ARMHF, Client) (push) Blocked by required conditions
CI / Test (ARMHF, Server) (push) Blocked by required conditions
CI / Build Example Mods (push) Blocked by required conditions
CI / Release (push) Blocked by required conditions
CI / Build (AMD64) (push) Has been cancelled
CI / Build (ARM64) (push) Has been cancelled
2024-06-18 18:03:02 -04:00
a830f66c41 Attempt #3
All checks were successful
CI / Build (AMD64) (push) Successful in 21m6s
CI / Build (ARM64) (push) Successful in 21m9s
CI / Build (ARMHF) (push) Successful in 11m6s
CI / Test (AMD64, Server) (push) Successful in 2m17s
CI / Test (ARM64, Client) (push) Successful in 3m26s
CI / Build Example Mods (push) Successful in 1m9s
CI / Test (ARM64, Server) (push) Successful in 25s
CI / Test (AMD64, Client) (push) Successful in 5m3s
CI / Test (ARMHF, Client) (push) Successful in 3m38s
CI / Test (ARMHF, Server) (push) Successful in 38s
CI / Release (push) Has been skipped
2024-06-17 20:10:03 -04:00
6fb1c8d59a Icon Fix Attempt #2
All checks were successful
CI / Build (ARM64) (push) Successful in 20m54s
CI / Build (AMD64) (push) Successful in 21m17s
CI / Build (ARMHF) (push) Successful in 11m7s
CI / Test (AMD64, Server) (push) Successful in 2m28s
CI / Test (ARM64, Client) (push) Successful in 3m27s
CI / Build Example Mods (push) Successful in 1m12s
CI / Test (ARM64, Server) (push) Successful in 26s
CI / Test (AMD64, Client) (push) Successful in 5m6s
CI / Test (ARMHF, Client) (push) Successful in 3m39s
CI / Test (ARMHF, Server) (push) Successful in 36s
CI / Release (push) Has been skipped
2024-06-17 19:10:25 -04:00
6740eb595e Fix Icon Path
Some checks failed
CI / Test (AMD64, Client) (push) Blocked by required conditions
CI / Test (AMD64, Server) (push) Blocked by required conditions
CI / Test (ARM64, Client) (push) Blocked by required conditions
CI / Test (ARM64, Server) (push) Blocked by required conditions
CI / Test (ARMHF, Client) (push) Blocked by required conditions
CI / Test (ARMHF, Server) (push) Blocked by required conditions
CI / Build Example Mods (push) Blocked by required conditions
CI / Release (push) Blocked by required conditions
CI / Build (AMD64) (push) Successful in 20m47s
CI / Build (ARM64) (push) Successful in 20m51s
CI / Build (ARMHF) (push) Has been cancelled
2024-06-17 18:40:07 -04:00
99a7407404 Some Docs Changes 2024-06-17 18:35:38 -04:00
0977f557b8 Rename Header 2024-06-17 18:17:24 -04:00
3b5149abff Environmental Variable & Logging Refactor
Some checks failed
CI / Test (AMD64, Client) (push) Blocked by required conditions
CI / Test (AMD64, Server) (push) Blocked by required conditions
CI / Test (ARM64, Client) (push) Blocked by required conditions
CI / Test (ARM64, Server) (push) Blocked by required conditions
CI / Test (ARMHF, Client) (push) Blocked by required conditions
CI / Test (ARMHF, Server) (push) Blocked by required conditions
CI / Build Example Mods (push) Blocked by required conditions
CI / Release (push) Blocked by required conditions
CI / Build (ARM64) (push) Successful in 19m47s
CI / Build (AMD64) (push) Successful in 20m4s
CI / Build (ARMHF) (push) Has been cancelled
2024-06-17 18:09:30 -04:00
b2db6bcfd2 Some Clean Up
All checks were successful
CI / Build (ARM64) (push) Successful in 18m10s
CI / Build (AMD64) (push) Successful in 18m50s
CI / Build (ARMHF) (push) Successful in 11m16s
CI / Test (AMD64, Server) (push) Successful in 2m7s
CI / Build Example Mods (push) Successful in 1m8s
CI / Test (ARM64, Client) (push) Successful in 3m27s
CI / Test (ARM64, Server) (push) Successful in 27s
CI / Test (AMD64, Client) (push) Successful in 5m2s
CI / Test (ARMHF, Client) (push) Successful in 3m38s
CI / Test (ARMHF, Server) (push) Successful in 39s
CI / Release (push) Has been skipped
2024-06-16 00:49:03 -04:00
36fe263ede Revert servers.txt Change
All checks were successful
CI / Build (ARM64) (push) Successful in 18m15s
CI / Build (AMD64) (push) Successful in 19m6s
CI / Build (ARMHF) (push) Successful in 12m18s
CI / Test (AMD64, Server) (push) Successful in 2m29s
CI / Test (ARM64, Client) (push) Successful in 3m26s
CI / Build Example Mods (push) Successful in 1m10s
CI / Test (ARM64, Server) (push) Successful in 26s
CI / Test (AMD64, Client) (push) Successful in 5m4s
CI / Test (ARMHF, Client) (push) Successful in 3m38s
CI / Test (ARMHF, Server) (push) Successful in 38s
CI / Release (push) Has been skipped
2024-06-16 00:04:42 -04:00
74ee75e12f Some Fixes
All checks were successful
CI / Build (AMD64) (push) Successful in 17m4s
CI / Build (ARM64) (push) Successful in 17m8s
CI / Build (ARMHF) (push) Successful in 11m6s
CI / Test (AMD64, Server) (push) Successful in 2m35s
CI / Test (ARM64, Client) (push) Successful in 3m27s
CI / Build Example Mods (push) Successful in 1m11s
CI / Test (ARM64, Server) (push) Successful in 26s
CI / Test (AMD64, Client) (push) Successful in 5m10s
CI / Test (ARMHF, Client) (push) Successful in 3m38s
CI / Test (ARMHF, Server) (push) Successful in 38s
CI / Release (push) Has been skipped
2024-06-15 10:19:18 -04:00
38d7dda1a7 The Great Unification
Some checks failed
CI / Build (AMD64) (push) Successful in 17m8s
CI / Build (ARM64) (push) Successful in 17m45s
CI / Build (ARMHF) (push) Successful in 11m24s
CI / Test (ARM64, Client) (push) Failing after 2m9s
CI / Test (AMD64, Client) (push) Failing after 2m44s
CI / Test (AMD64, Server) (push) Successful in 3m53s
CI / Test (ARM64, Server) (push) Successful in 2m17s
CI / Build Example Mods (push) Failing after 2m31s
CI / Test (ARMHF, Client) (push) Failing after 1m58s
CI / Test (ARMHF, Server) (push) Failing after 1m55s
CI / Release (push) Has been skipped
2024-06-15 08:52:15 -04:00
460cd38ddf Oops!
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 37m28s
CI / Build (AMD64, Client) (push) Successful in 37m53s
CI / Build (ARM64, Server) (push) Successful in 19m15s
CI / Build (ARM64, Client) (push) Successful in 19m55s
CI / Build (ARMHF, Server) (push) Successful in 14m11s
CI / Build (ARMHF, Client) (push) Successful in 17m56s
CI / Test (Client) (push) Successful in 18m39s
CI / Test (Server) (push) Successful in 16m3s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 10m57s
CI / Raspberry Pi Test (ARM64, Server) (push) Has been cancelled
CI / Raspberry Pi Test (ARMHF, Client) (push) Has been cancelled
CI / Raspberry Pi Test (ARMHF, Server) (push) Has been cancelled
CI / Raspberry Pi Test (ARM64, Client) (push) Has been cancelled
2024-06-14 03:26:23 -04:00
b71f6c7008 Test On RPI!
Some checks failed
CI / Build (${{ matrix.mode }}, ${{ matrix.arch }}) (ARM64, Client) (push) Has been cancelled
CI / Build (${{ matrix.mode }}, ${{ matrix.arch }}) (ARM64, Server) (push) Has been cancelled
CI / Build (${{ matrix.mode }}, ${{ matrix.arch }}) (ARMHF, Client) (push) Has been cancelled
CI / Build (${{ matrix.mode }}, ${{ matrix.arch }}) (ARMHF, Server) (push) Has been cancelled
CI / Test (${{ matrix.mode }}) (Client) (push) Has been cancelled
CI / Test (${{ matrix.mode }}) (Server) (push) Has been cancelled
CI / Raspberry Pi Test (${{ matrix.mode }}, ${{ matrix.arch }}) (ARM64, Server) (push) Has been cancelled
CI / Raspberry Pi Test (${{ matrix.mode }}, ${{ matrix.arch }}) (ARMHF, Client) (push) Has been cancelled
CI / Raspberry Pi Test (${{ matrix.mode }}, ${{ matrix.arch }}) (ARMHF, Server) (push) Has been cancelled
CI / Build Example Mods (push) Has been cancelled
CI / Release (push) Has been cancelled
CI / Raspberry Pi Test (${{ matrix.mode }}, ${{ matrix.arch }}) (ARM64, Client) (push) Has been cancelled
CI / Build (${{ matrix.mode }}, ${{ matrix.arch }}) (AMD64, Server) (push) Has been cancelled
CI / Build (${{ matrix.mode }}, ${{ matrix.arch }}) (AMD64, Client) (push) Has been cancelled
2024-06-14 03:22:01 -04:00
8bc90dae04 More Tweaks
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 18m25s
CI / Build (AMD64, Client) (push) Successful in 18m34s
CI / Build (ARM64, Client) (push) Successful in 18m27s
CI / Build (ARM64, Server) (push) Successful in 18m26s
CI / Build (ARMHF, Server) (push) Successful in 13m50s
CI / Build (ARMHF, Client) (push) Successful in 17m22s
CI / Test (Client) (push) Successful in 18m4s
CI / Test (Server) (push) Successful in 15m22s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 10m42s
2024-06-12 02:33:29 -04:00
1bf19268f0 Fix Benchmark Rotation
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 17m47s
CI / Build (AMD64, Client) (push) Successful in 18m13s
CI / Build (ARM64, Client) (push) Successful in 19m22s
CI / Build (ARM64, Server) (push) Successful in 19m4s
CI / Build (ARMHF, Server) (push) Successful in 14m45s
CI / Build (ARMHF, Client) (push) Successful in 18m25s
CI / Test (Client) (push) Successful in 19m31s
CI / Test (Server) (push) Successful in 16m35s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 11m18s
2024-06-10 18:55:22 -04:00
69a9613e4f Small Fixes
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 19m4s
CI / Build (AMD64, Client) (push) Successful in 19m36s
CI / Build (ARM64, Client) (push) Successful in 19m47s
CI / Build (ARM64, Server) (push) Successful in 19m16s
CI / Build (ARMHF, Server) (push) Successful in 14m6s
CI / Build (ARMHF, Client) (push) Successful in 17m34s
CI / Test (Client) (push) Successful in 18m39s
CI / Test (Server) (push) Successful in 15m50s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 10m42s
2024-06-08 18:00:30 -04:00
a0f32a15a7 Finally At A Nice Point
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 19m56s
CI / Build (AMD64, Client) (push) Successful in 20m12s
CI / Build (ARM64, Server) (push) Successful in 18m59s
CI / Build (ARM64, Client) (push) Successful in 19m26s
CI / Build (ARMHF, Server) (push) Failing after 4m33s
CI / Build (ARMHF, Client) (push) Failing after 4m47s
CI / Release (push) Has been skipped
CI / Test (Server) (push) Successful in 19m1s
CI / Test (Client) (push) Successful in 21m52s
CI / Build Example Mods (push) Successful in 11m17s
2024-06-08 16:30:39 -04:00
d52c16e722 Concessions To Reality 2024-06-08 04:34:46 -04:00
2d9659f273 This is a commit message. 2024-06-08 04:23:15 -04:00
3414fb817c More WIP 2024-06-08 03:55:13 -04:00
c60428c600 WIP 2024-06-08 03:09:55 -04:00
4e2437dbd6 Pipe (Part 2); This Needs Work
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 17m1s
CI / Build (AMD64, Client) (push) Successful in 17m14s
CI / Build (ARM64, Client) (push) Successful in 18m41s
CI / Build (ARM64, Server) (push) Successful in 18m34s
CI / Build (ARMHF, Server) (push) Successful in 14m6s
CI / Build (ARMHF, Client) (push) Successful in 17m37s
CI / Test (Client) (push) Successful in 18m18s
CI / Test (Server) (push) Successful in 15m44s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 10m53s
2024-06-05 21:19:39 -04:00
a1ea91ad89 It Works... Slowly
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 16m42s
CI / Build (AMD64, Client) (push) Successful in 16m57s
CI / Build (ARM64, Server) (push) Successful in 17m37s
CI / Build (ARM64, Client) (push) Successful in 18m15s
CI / Build (ARMHF, Server) (push) Successful in 13m34s
CI / Build (ARMHF, Client) (push) Successful in 17m14s
CI / Test (Client) (push) Successful in 18m10s
CI / Test (Server) (push) Successful in 15m18s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 10m41s
2024-06-05 00:17:53 -04:00
f9e0f54620 WIP Trampoline Changes 2024-06-04 18:29:13 -04:00
804c9da179 Fix Artifacts v4
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 17m41s
CI / Build (AMD64, Client) (push) Successful in 17m55s
CI / Build (ARM64, Server) (push) Successful in 18m16s
CI / Build (ARM64, Client) (push) Successful in 20m15s
CI / Build (ARMHF, Server) (push) Successful in 13m34s
CI / Build (ARMHF, Client) (push) Successful in 16m49s
CI / Test (Client) (push) Successful in 18m6s
CI / Test (Server) (push) Successful in 17m5s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 10m33s
2024-05-30 22:22:30 -04:00
cdc1a82142 CI Badge!
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (AMD64, Server) (push) Failing after 17m17s
CI / Build (AMD64, Client) (push) Failing after 17m50s
CI / Test (Client) (push) Has been cancelled
CI / Test (Server) (push) Has been cancelled
CI / Build Example Mods (push) Has been cancelled
CI / Release (push) Has been cancelled
CI / Build (ARMHF, Client) (push) Has been cancelled
CI / Build (ARMHF, Server) (push) Has been cancelled
2024-05-30 21:52:15 -04:00
04b9ad5efd Update Dependencies
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 17m48s
CI / Build (AMD64, Client) (push) Successful in 17m58s
CI / Build (ARM64, Server) (push) Successful in 19m24s
CI / Build (ARM64, Client) (push) Successful in 21m40s
CI / Build (ARMHF, Server) (push) Successful in 15m1s
CI / Build (ARMHF, Client) (push) Successful in 18m36s
CI / Test (Server) (push) Successful in 18m4s
CI / Test (Client) (push) Successful in 19m56s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 11m9s
2024-05-27 03:47:04 -04:00
8203e20971 Revert Change, I Did Bad Math
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 16m56s
CI / Build (AMD64, Client) (push) Successful in 17m14s
CI / Build (ARM64, Server) (push) Successful in 18m4s
CI / Build (ARM64, Client) (push) Successful in 20m6s
CI / Build (ARMHF, Server) (push) Successful in 13m46s
CI / Build (ARMHF, Client) (push) Successful in 16m36s
CI / Test (Server) (push) Successful in 17m6s
CI / Test (Client) (push) Successful in 19m15s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 10m46s
2024-05-24 22:23:58 -04:00
4dc69885f2 Fix
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 17m7s
CI / Build (AMD64, Client) (push) Successful in 17m26s
CI / Build (ARM64, Server) (push) Successful in 18m41s
CI / Build (ARM64, Client) (push) Successful in 20m23s
CI / Build (ARMHF, Server) (push) Successful in 13m38s
CI / Build (ARMHF, Client) (push) Successful in 16m53s
CI / Test (Client) (push) Failing after 14m36s
CI / Test (Server) (push) Failing after 15m8s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 11m12s
2024-05-24 17:52:54 -04:00
36cb84b672 Tweak QEMU Base
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Client) (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
2024-05-24 17:42:42 -04:00
f53f405bdd The Compiler Strikes Back!
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 17m14s
CI / Build (AMD64, Client) (push) Successful in 17m16s
CI / Build (ARM64, Server) (push) Successful in 18m11s
CI / Build (ARM64, Client) (push) Successful in 20m30s
CI / Build (ARMHF, Server) (push) Successful in 13m28s
CI / Build (ARMHF, Client) (push) Successful in 16m48s
CI / Test (Server) (push) Successful in 17m56s
CI / Test (Client) (push) Successful in 19m32s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 13m42s
2024-05-24 04:44:53 -04:00
60a5accff2 Fix Another Link 2024-05-22 02:57:00 -04:00
c9fafd6cd4 Use Different Discord URL
Some checks failed
CI / Build (AMD64, Client) (push) Failing after 12h35m51s
CI / Build (AMD64, Server) (push) Failing after 12h35m50s
CI / Build (ARM64, Server) (push) Successful in 13m2s
CI / Build (ARM64, Client) (push) Successful in 15m23s
CI / Build (ARMHF, Server) (push) Successful in 8m56s
CI / Build (ARMHF, Client) (push) Successful in 11m25s
CI / Release (push) Has been skipped
CI / Test (Server) (push) Successful in 14m19s
CI / Test (Client) (push) Successful in 17m15s
CI / Build Example Mods (push) Successful in 8m2s
2024-05-22 02:29:54 -04:00
668552e354 Mention Discord In Docs
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Client) (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
2024-05-22 02:23:15 -04:00
fedc006a4b Remove Reference To Deleted File
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Has been cancelled
CI / Build (AMD64, Client) (push) Has been cancelled
2024-05-22 02:15:21 -04:00
1dc23fe615 Remove Line
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Client) (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
2024-05-22 02:04:44 -04:00
ef3f8da720 One More Tweak
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Has been cancelled
CI / Build (AMD64, Client) (push) Has been cancelled
2024-05-22 01:56:35 -04:00
eca42150cb Improve Getting Started (Thanks ChatGPT!)
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Has been cancelled
CI / Build (AMD64, Client) (push) Has been cancelled
2024-05-22 01:53:36 -04:00
db45df1e52 Update Documentation
Some checks failed
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Successful in 12m36s
CI / Build (AMD64, Client) (push) Successful in 13m1s
CI / Build (ARM64, Client) (push) Has been cancelled
CI / Build (ARM64, Server) (push) Has been cancelled
2024-05-22 01:32:52 -04:00
0e44bb5f06 Add Welcome Screen 2024-05-21 19:16:19 -04:00
3088a13725 Tweak Loading
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m14s
CI / Build (AMD64, Client) (push) Successful in 12m31s
CI / Build (ARM64, Server) (push) Successful in 13m10s
CI / Build (ARM64, Client) (push) Successful in 15m41s
CI / Build (ARMHF, Server) (push) Successful in 8m59s
CI / Build (ARMHF, Client) (push) Successful in 11m26s
CI / Test (Server) (push) Successful in 13m8s
CI / Test (Client) (push) Successful in 16m47s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 8m9s
2024-05-20 16:37:55 -04:00
56d93f0150 Tweak Text Wrapping
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 13m17s
CI / Build (AMD64, Client) (push) Successful in 13m39s
CI / Build (ARM64, Server) (push) Successful in 13m37s
CI / Build (ARM64, Client) (push) Successful in 16m16s
CI / Build (ARMHF, Server) (push) Successful in 9m25s
CI / Build (ARMHF, Client) (push) Successful in 12m21s
CI / Test (Server) (push) Successful in 15m8s
CI / Test (Client) (push) Successful in 16m28s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 8m3s
2024-05-19 00:19:01 -04:00
3132f9442d Better Error Message 2024-05-18 21:25:11 -04:00
b129f0a503 Attack Of The Templates!
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 13m3s
CI / Build (AMD64, Client) (push) Successful in 13m21s
CI / Build (ARM64, Server) (push) Successful in 13m52s
CI / Build (ARM64, Client) (push) Successful in 16m29s
CI / Build (ARMHF, Server) (push) Successful in 9m26s
CI / Build (ARMHF, Client) (push) Successful in 12m33s
CI / Test (Server) (push) Successful in 14m51s
CI / Test (Client) (push) Successful in 16m35s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 8m26s
2024-05-18 18:58:39 -04:00
97bc124d72 Better Static Properties
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 14m16s
CI / Build (AMD64, Client) (push) Successful in 14m37s
CI / Build (ARM64, Server) (push) Successful in 13m0s
CI / Build (ARM64, Client) (push) Successful in 15m26s
CI / Build (ARMHF, Server) (push) Successful in 8m58s
CI / Build (ARMHF, Client) (push) Successful in 11m38s
CI / Test (Server) (push) Successful in 14m12s
CI / Test (Client) (push) Successful in 16m37s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m50s
2024-05-17 02:52:55 -04:00
b23f7f1618 Remove alloc_*() Functions 2024-05-17 00:36:28 -04:00
bbaa69edeb Tweak Reborn Info Screen
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 13m2s
CI / Build (AMD64, Client) (push) Successful in 13m22s
CI / Build (ARM64, Server) (push) Successful in 13m18s
CI / Build (ARM64, Client) (push) Successful in 15m57s
CI / Build (ARMHF, Server) (push) Successful in 9m11s
CI / Build (ARMHF, Client) (push) Successful in 12m14s
CI / Test (Server) (push) Successful in 14m14s
CI / Test (Client) (push) Successful in 16m5s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m55s
2024-05-16 21:59:51 -04:00
6cfc1a7e20 Small Tweaks
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m46s
CI / Build (AMD64, Client) (push) Successful in 13m3s
CI / Build (ARM64, Server) (push) Successful in 13m8s
CI / Build (ARM64, Client) (push) Successful in 15m26s
CI / Build (ARMHF, Server) (push) Successful in 9m10s
CI / Build (ARMHF, Client) (push) Successful in 11m55s
CI / Test (Server) (push) Successful in 14m0s
CI / Test (Client) (push) Successful in 16m6s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m55s
2024-05-16 04:07:02 -04:00
f25a2adcef Update More Methods!
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m47s
CI / Build (AMD64, Client) (push) Successful in 13m7s
CI / Build (ARM64, Server) (push) Successful in 13m7s
CI / Build (ARM64, Client) (push) Successful in 15m38s
CI / Build (ARMHF, Server) (push) Successful in 9m9s
CI / Build (ARMHF, Client) (push) Successful in 11m46s
CI / Test (Server) (push) Successful in 14m4s
CI / Test (Client) (push) Successful in 16m33s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m55s
2024-05-15 05:08:39 -04:00
6ae475785e Fix Newlines 2024-05-15 05:06:36 -04:00
51bbad15f4 Use New Method Call Style
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Client) (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
2024-05-15 05:02:19 -04:00
73454adc22 Refactor Logging
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m31s
CI / Build (AMD64, Client) (push) Successful in 12m51s
CI / Build (ARM64, Server) (push) Successful in 13m2s
CI / Build (ARM64, Client) (push) Successful in 15m33s
CI / Build (ARMHF, Server) (push) Successful in 9m14s
CI / Build (ARMHF, Client) (push) Successful in 12m4s
CI / Test (Server) (push) Successful in 14m15s
CI / Test (Client) (push) Successful in 16m20s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 8m6s
2024-05-14 01:23:16 -04:00
4d54a9d28c Refactor Launcher
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 13m26s
CI / Build (AMD64, Client) (push) Successful in 13m45s
CI / Build (ARM64, Server) (push) Successful in 14m6s
CI / Build (ARM64, Client) (push) Successful in 16m50s
CI / Build (ARMHF, Server) (push) Successful in 9m35s
CI / Build (ARMHF, Client) (push) Successful in 12m27s
CI / Test (Server) (push) Successful in 15m7s
CI / Test (Client) (push) Successful in 16m38s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Failing after 8m12s
2024-05-12 03:19:01 -04:00
d7616419bc Fix Server Build
All checks were successful
CI / Build (AMD64, Client) (push) Successful in 13m1s
CI / Build (AMD64, Server) (push) Successful in 13m30s
CI / Build (ARM64, Server) (push) Successful in 14m22s
CI / Build (ARM64, Client) (push) Successful in 15m26s
CI / Build (ARMHF, Server) (push) Successful in 9m40s
CI / Build (ARMHF, Client) (push) Successful in 12m59s
CI / Test (Client) (push) Successful in 16m15s
CI / Test (Server) (push) Successful in 13m38s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 8m16s
2024-05-11 22:06:37 -04:00
823495a811 Fix QEMU Build
Some checks failed
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Failing after 8m0s
CI / Build (AMD64, Client) (push) Successful in 12m20s
CI / Build (ARM64, Server) (push) Failing after 8m36s
CI / Build (ARM64, Client) (push) Successful in 13m48s
CI / Build (ARMHF, Client) (push) Has been cancelled
CI / Build (ARMHF, Server) (push) Has been cancelled
2024-05-11 21:43:28 -04:00
03c7c50d48 Trampoline
Some checks failed
CI / Build (AMD64, Server) (push) Failing after 7m39s
CI / Build (AMD64, Client) (push) Failing after 11m40s
CI / Build (ARM64, Server) (push) Failing after 8m50s
CI / Build (ARM64, Client) (push) Failing after 13m21s
CI / Build (ARMHF, Client) (push) Has been cancelled
CI / Build (ARMHF, Server) (push) Has been cancelled
CI / Test (Client) (push) Has been cancelled
CI / Test (Server) (push) Has been cancelled
CI / Build Example Mods (push) Has been cancelled
CI / Release (push) Has been cancelled
2024-05-11 21:14:14 -04:00
f15625ff79 UI Tweaks 2024-05-10 19:50:28 -04:00
e2d32cad21 Add QEMU Patch 2024-05-10 18:58:39 -04:00
eeef63d9ef Improve Creative Restrictions Mod
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 13m26s
CI / Build (AMD64, Client) (push) Successful in 13m47s
CI / Build (ARM64, Server) (push) Successful in 13m36s
CI / Build (ARM64, Client) (push) Successful in 14m0s
CI / Build (ARMHF, Server) (push) Successful in 9m34s
CI / Build (ARMHF, Client) (push) Successful in 12m46s
CI / Test (Client) (push) Successful in 15m57s
CI / Test (Server) (push) Successful in 13m22s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 8m19s
2024-05-09 19:03:48 -04:00
e1f0787e48 Fix Layering Iverwrites 2024-05-09 17:50:02 -04:00
37e1abbdd3 Fix Splash Animation
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 13m6s
CI / Build (AMD64, Client) (push) Successful in 13m29s
CI / Build (ARM64, Server) (push) Successful in 13m22s
CI / Build (ARM64, Client) (push) Successful in 14m9s
CI / Build (ARMHF, Server) (push) Successful in 9m25s
CI / Build (ARMHF, Client) (push) Successful in 12m41s
CI / Test (Client) (push) Successful in 16m6s
CI / Test (Server) (push) Successful in 13m40s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m59s
2024-05-09 04:19:08 -04:00
c88db307d7 Reduce Code Duplication
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Client) (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
2024-05-09 02:55:30 -04:00
75fc48da24 One Last Fix
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 13m34s
CI / Build (AMD64, Client) (push) Successful in 14m8s
CI / Build (ARM64, Client) (push) Successful in 13m53s
CI / Build (ARM64, Server) (push) Successful in 13m32s
CI / Build (ARMHF, Server) (push) Successful in 9m24s
CI / Build (ARMHF, Client) (push) Successful in 12m37s
CI / Test (Client) (push) Successful in 16m0s
CI / Test (Server) (push) Successful in 13m24s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 8m1s
2024-05-09 02:20:09 -04:00
cd39733177 Update Changelog & Fix Flatpak Detection In Info Screen
Some checks failed
CI / Build (AMD64, Client) (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
CI / Build (ARM64, Client) (push) Has been cancelled
CI / Build (ARM64, Server) (push) Has been cancelled
CI / Build (ARMHF, Client) (push) Has been cancelled
CI / Build (ARMHF, Server) (push) Has been cancelled
CI / Test (Client) (push) Has been cancelled
CI / Test (Server) (push) Has been cancelled
CI / Build Example Mods (push) Has been cancelled
CI / Release (push) Has been cancelled
2024-05-09 02:06:24 -04:00
592d6c4e63 Simplify CMake
Some checks failed
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Successful in 13m53s
CI / Build (AMD64, Client) (push) Successful in 14m25s
CI / Build (ARM64, Client) (push) Has been cancelled
CI / Build (ARM64, Server) (push) Has been cancelled
2024-05-09 01:38:57 -04:00
d519142a8a Fancy Info Screen 2024-05-09 01:25:53 -04:00
09bae1cf3e Split Up Options Mod 2024-05-08 20:18:50 -04:00
4523935d62 Fix Example Mod (Again)
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m25s
CI / Build (AMD64, Client) (push) Successful in 12m48s
CI / Build (ARM64, Server) (push) Successful in 12m48s
CI / Build (ARM64, Client) (push) Successful in 13m18s
CI / Build (ARMHF, Server) (push) Successful in 9m15s
CI / Build (ARMHF, Client) (push) Successful in 12m53s
CI / Test (Client) (push) Successful in 15m7s
CI / Test (Server) (push) Successful in 12m23s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m44s
2024-05-05 02:17:46 -04:00
Bigjango13
f3f8e342d8 More chunk symbols
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m46s
CI / Build (AMD64, Client) (push) Successful in 13m8s
CI / Build (ARM64, Client) (push) Successful in 13m13s
CI / Build (ARM64, Server) (push) Successful in 12m54s
CI / Build (ARMHF, Server) (push) Successful in 9m13s
CI / Build (ARMHF, Client) (push) Successful in 12m15s
CI / Test (Client) (push) Successful in 15m39s
CI / Test (Server) (push) Successful in 13m1s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m42s
2024-05-05 01:06:47 -04:00
Bigjango13
f010e51c3a Add ChunkSource vtable 2024-05-05 01:03:44 -04:00
Bigjango13
91ee97f005 Fix HOOKing mods 2024-05-05 01:03:43 -04:00
Bigjango13
a6b01da677 Fix Tile_lightEmission 2024-05-05 01:02:05 -04:00
Bigjango13
2549670ee4 Add TileRenderer_tesselateTorch 2024-05-05 01:00:51 -04:00
Bigjango13
d0954a22f3 More symbols, remove Entity_moveTo 2024-05-05 01:00:50 -04:00
49a54a7396 Update Symbol Processor
Some checks are pending
CI / Build (AMD64, Client) (push) Waiting to run
CI / Build (AMD64, Server) (push) Waiting to run
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
2024-05-05 00:44:37 -04:00
a305cf9e38 More Changes!
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m33s
CI / Build (AMD64, Client) (push) Successful in 12m58s
CI / Build (ARM64, Server) (push) Successful in 12m56s
CI / Build (ARM64, Client) (push) Successful in 13m35s
CI / Build (ARMHF, Server) (push) Successful in 8m51s
CI / Build (ARMHF, Client) (push) Successful in 12m9s
CI / Test (Client) (push) Successful in 15m39s
CI / Test (Server) (push) Successful in 13m16s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m43s
2024-05-04 20:46:15 -04:00
cf6989bed2 I need to sleep, here be dragons
Some checks failed
CI / Build (AMD64, Server) (push) Failing after 6m39s
CI / Build (AMD64, Client) (push) Successful in 10m47s
CI / Build (ARM64, Client) (push) Successful in 10m26s
CI / Build (ARM64, Server) (push) Failing after 6m43s
CI / Build (ARMHF, Server) (push) Failing after 6m13s
CI / Build (ARMHF, Client) (push) Successful in 11m13s
CI / Release (push) Has been skipped
CI / Test (Client) (push) Failing after 5m45s
CI / Test (Server) (push) Failing after 5m1s
CI / Build Example Mods (push) Failing after 8m54s
2024-04-03 03:19:12 -04:00
b2a7fe3eaf C++-Ification! 2024-04-02 19:22:01 -04:00
7739fb6b9b Update Dependency
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m36s
CI / Build (AMD64, Client) (push) Successful in 12m54s
CI / Build (ARM64, Server) (push) Successful in 12m14s
CI / Build (ARM64, Client) (push) Successful in 13m19s
CI / Build (ARMHF, Server) (push) Successful in 8m54s
CI / Build (ARMHF, Client) (push) Successful in 11m59s
CI / Test (Server) (push) Successful in 12m52s
CI / Test (Client) (push) Successful in 15m10s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m32s
2024-04-02 15:21:35 -04:00
f3755387e8 Improve Mouse Sensitivity On Wayland
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m9s
CI / Build (AMD64, Client) (push) Successful in 12m20s
CI / Build (ARM64, Server) (push) Successful in 12m35s
CI / Build (ARM64, Client) (push) Successful in 13m4s
CI / Build (ARMHF, Server) (push) Successful in 8m47s
CI / Build (ARMHF, Client) (push) Successful in 12m6s
CI / Test (Client) (push) Successful in 14m25s
CI / Test (Server) (push) Successful in 12m22s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m31s
2024-03-19 00:25:50 -04:00
b1b28defd5 Small Change 2024-03-19 00:12:26 -04:00
18c5d34974 Ignore CLion Files 2024-03-19 00:12:26 -04:00
Bigjango13
76a66a0ba5 Sneak in Level_setTileEntity
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 12m25s
CI / Build (AMD64, Client) (push) Successful in 12m41s
CI / Build (ARM64, Server) (push) Successful in 12m25s
CI / Build (ARM64, Client) (push) Successful in 12m56s
CI / Build (ARMHF, Server) (push) Successful in 8m51s
CI / Build (ARMHF, Client) (push) Successful in 11m57s
CI / Test (Client) (push) Successful in 14m36s
CI / Test (Server) (push) Successful in 12m32s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Failing after 7m21s
2024-03-18 21:02:01 -04:00
Bigjango13
a6ad1994de Remove left over check 2024-03-18 19:58:38 -04:00
Bigjango13
8de638eb1a Make chat history edits saved temporarily 2024-03-18 19:44:17 -04:00
Bigjango13
5e5088e3ef Move chat history into chat
- `get_death_message` is no longer static
- Fix ItemInHandRenderer_instance symbol
2024-03-10 22:46:34 -04:00
Bigjango13
a6e0cd8f13 Fix history editing bug
- Use the `get_<var>` pattern for chat's `history`.
- Make the Biome_map comment clearer
2024-03-09 13:01:52 -05:00
Bigjango13
3ff24c2a92 Add chat history
- More symbols too
- Made CUSTOM_VTABLE not static, for modders
2024-03-08 18:03:19 -05:00
d74d1501ce Update Sound Warning
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m33s
CI / Build (AMD64, Client) (push) Successful in 12m47s
CI / Build (ARM64, Server) (push) Successful in 12m35s
CI / Build (ARM64, Client) (push) Successful in 13m5s
CI / Build (ARMHF, Server) (push) Successful in 8m52s
CI / Build (ARMHF, Client) (push) Successful in 12m2s
CI / Test (Client) (push) Successful in 15m14s
CI / Test (Server) (push) Successful in 12m27s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m27s
2024-03-02 17:16:16 -05:00
fb84bcc06b GLFW 3.4!
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m58s
CI / Build (AMD64, Client) (push) Successful in 13m20s
CI / Build (ARM64, Server) (push) Successful in 15m3s
CI / Build (ARM64, Client) (push) Successful in 15m32s
CI / Build (ARMHF, Server) (push) Successful in 8m59s
CI / Build (ARMHF, Client) (push) Successful in 12m16s
CI / Test (Client) (push) Successful in 15m10s
CI / Test (Server) (push) Successful in 13m15s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m49s
2024-02-23 20:54:07 -05:00
117c5d2702 Better HiDPI Support
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Has been cancelled
CI / Build (AMD64, Client) (push) Has been cancelled
2024-02-23 20:50:56 -05:00
9556d13791 Minor Tweaks
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m42s
CI / Build (AMD64, Client) (push) Successful in 12m59s
CI / Build (ARM64, Server) (push) Successful in 12m49s
CI / Build (ARM64, Client) (push) Successful in 13m21s
CI / Build (ARMHF, Server) (push) Successful in 9m2s
CI / Build (ARMHF, Client) (push) Successful in 12m23s
CI / Test (Client) (push) Successful in 15m37s
CI / Test (Server) (push) Successful in 13m6s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m43s
2024-02-15 23:02:44 -05:00
Bigjango13
f8bd6d380b Fix invalid ItemInHandRenderer texture cache 2024-02-15 01:59:35 -05:00
Bigjango13
5d57253d56 More symbols and better patch error message 2024-02-15 01:59:34 -05:00
Bigjango13
6ac808919f More symbols! Mostly tile entity stuff 2024-02-15 01:58:38 -05:00
Bigjango13
5353bc188d Rename Entity::aabb to Entity::hitbox 2024-02-15 01:58:38 -05:00
Bigjango13
f57c0a6190 More symbols and clean up "Disable Hostile AI In Creative Mode" 2024-02-15 01:58:38 -05:00
b033912633 Also Scan .data.rel.ro
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m2s
CI / Build (AMD64, Client) (push) Successful in 12m22s
CI / Build (ARM64, Server) (push) Successful in 13m4s
CI / Build (ARM64, Client) (push) Successful in 13m36s
CI / Build (ARMHF, Server) (push) Successful in 8m37s
CI / Build (ARMHF, Client) (push) Successful in 11m27s
CI / Test (Server) (push) Successful in 12m26s
CI / Test (Client) (push) Successful in 15m7s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 7m22s
2024-02-12 00:55:50 -05:00
a2b3bb128b Bug Fixes & Low-Level Improvements
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Has been cancelled
CI / Build (AMD64, Client) (push) Has been cancelled
2024-02-12 00:44:38 -05:00
180ba9dcaf Small Changes 2024-02-11 20:35:41 -05:00
71cc24104c Add More Splashes
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 11m14s
CI / Build (AMD64, Client) (push) Successful in 11m30s
CI / Build (ARM64, Server) (push) Successful in 11m31s
CI / Build (ARM64, Client) (push) Successful in 11m51s
CI / Build (ARMHF, Server) (push) Successful in 7m54s
CI / Build (ARMHF, Client) (push) Successful in 11m11s
CI / Test (Client) (push) Successful in 14m25s
CI / Test (Server) (push) Successful in 11m49s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m54s
2024-02-08 00:59:57 -05:00
6951ebe620 Improve Performance
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 11m15s
CI / Build (AMD64, Client) (push) Successful in 11m33s
CI / Build (ARM64, Client) (push) Successful in 11m49s
CI / Build (ARM64, Server) (push) Successful in 11m35s
CI / Build (ARMHF, Server) (push) Successful in 7m50s
CI / Build (ARMHF, Client) (push) Successful in 11m3s
CI / Test (Client) (push) Successful in 14m43s
CI / Test (Server) (push) Successful in 11m40s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m48s
2024-02-08 00:34:43 -05:00
28dbb2eacd Some CMake Cleanup
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 12m44s
CI / Build (AMD64, Client) (push) Successful in 12m56s
CI / Build (ARM64, Server) (push) Successful in 11m40s
CI / Build (ARM64, Client) (push) Successful in 12m1s
CI / Build (ARMHF, Server) (push) Successful in 8m1s
CI / Build (ARMHF, Client) (push) Successful in 10m59s
CI / Test (Client) (push) Successful in 14m15s
CI / Test (Server) (push) Successful in 11m53s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m49s
2024-02-07 22:12:02 -05:00
d86018717e Split Splash Loading Into Own Function 2024-02-07 21:40:26 -05:00
db22caa50f Add Splash Text From MCPIL
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 11m15s
CI / Build (AMD64, Client) (push) Successful in 11m28s
CI / Build (ARM64, Client) (push) Successful in 11m48s
CI / Build (ARM64, Server) (push) Successful in 11m47s
CI / Build (ARMHF, Server) (push) Successful in 7m55s
CI / Build (ARMHF, Client) (push) Successful in 11m14s
CI / Test (Client) (push) Successful in 14m39s
CI / Test (Server) (push) Successful in 11m42s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m49s
2024-02-07 21:15:48 -05:00
ecbcfb2922 Split Up Animated Textures Into Three Flags
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 11m25s
CI / Build (AMD64, Client) (push) Successful in 11m46s
CI / Build (ARM64, Client) (push) Successful in 11m50s
CI / Build (ARM64, Server) (push) Successful in 11m40s
CI / Build (ARMHF, Server) (push) Successful in 7m56s
CI / Build (ARMHF, Client) (push) Successful in 11m14s
CI / Test (Client) (push) Successful in 14m25s
CI / Test (Server) (push) Successful in 11m29s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m51s
2024-02-07 19:00:55 -05:00
781377005e Update Dependencies
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 11m17s
CI / Build (AMD64, Client) (push) Successful in 11m30s
CI / Build (ARM64, Server) (push) Successful in 11m36s
CI / Build (ARM64, Client) (push) Successful in 12m0s
CI / Build (ARMHF, Server) (push) Successful in 7m57s
CI / Build (ARMHF, Client) (push) Successful in 11m18s
CI / Test (Client) (push) Successful in 14m21s
CI / Test (Server) (push) Successful in 11m49s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Has been cancelled
2024-02-07 18:04:53 -05:00
6e306e500d I Have Made This Typo Countless Times
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 10m4s
CI / Build (AMD64, Client) (push) Successful in 10m14s
CI / Build (ARM64, Server) (push) Successful in 10m12s
CI / Build (ARM64, Client) (push) Successful in 10m22s
CI / Build (ARMHF, Server) (push) Successful in 7m0s
CI / Build (ARMHF, Client) (push) Successful in 9m26s
CI / Test (Client) (push) Successful in 13m20s
CI / Test (Server) (push) Successful in 10m55s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m6s
2024-02-07 02:01:43 -05:00
7e300a6e1b Update Changelog
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Client) (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
2024-02-07 01:58:21 -05:00
f5a680af7b Add Cake (#81)
Some checks failed
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Successful in 10m3s
CI / Build (AMD64, Client) (push) Successful in 10m16s
CI / Build (ARM64, Client) (push) Has been cancelled
CI / Build (ARM64, Server) (push) Has been cancelled
Adds cake, crafting remainders, milk buckets, death messages, `misc_run_on_language_setup`, and a lot more symbols.

Co-authored-by: Bigjango13 <bigjango13@gmail.com>
Reviewed-on: minecraft-pi-reborn/minecraft-pi-reborn#81
Co-authored-by: bigjango13 <bigjango13@noreply.thebrokenrail.org>
Co-committed-by: bigjango13 <bigjango13@noreply.thebrokenrail.org>
2024-02-07 06:47:46 +00:00
Bigjango13
c62d5264a8 More consistent lookup for sounds
Some checks failed
CI / Build (AMD64, Client) (push) Has started running
CI / Build (ARM64, Client) (push) Has been cancelled
CI / Build (ARM64, Server) (push) Has been cancelled
CI / Build (ARMHF, Client) (push) Has been cancelled
CI / Build (ARMHF, Server) (push) Has been cancelled
CI / Test (Client) (push) Has been cancelled
CI / Test (Server) (push) Has been cancelled
CI / Build Example Mods (push) Has been cancelled
CI / Release (push) Has been cancelled
CI / Build (AMD64, Server) (push) Has been cancelled
2024-02-07 02:16:34 +00:00
Bigjango13
93498ce9c0 Fix load_symbol ignoring source when a previous source has already been loaded 2024-02-07 02:16:34 +00:00
90a2b0ac85 Call Ninja Directly
Some checks failed
CI / Build (ARM64, Client) (push) Waiting to run
CI / Build (ARM64, Server) (push) Waiting to run
CI / Build (ARMHF, Client) (push) Waiting to run
CI / Build (ARMHF, Server) (push) Waiting to run
CI / Test (Client) (push) Waiting to run
CI / Test (Server) (push) Waiting to run
CI / Build Example Mods (push) Waiting to run
CI / Release (push) Blocked by required conditions
CI / Build (AMD64, Server) (push) Has been cancelled
CI / Build (AMD64, Client) (push) Has been cancelled
2024-02-06 19:35:44 -05:00
Bigjango13
2d9d4a638a Move food overlay to after classic HUD
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 10m14s
CI / Build (AMD64, Client) (push) Successful in 10m26s
CI / Build (ARM64, Server) (push) Successful in 10m28s
CI / Build (ARM64, Client) (push) Successful in 10m38s
CI / Build (ARMHF, Server) (push) Successful in 7m6s
CI / Build (ARMHF, Client) (push) Successful in 9m47s
CI / Test (Client) (push) Successful in 13m41s
CI / Test (Server) (push) Successful in 11m12s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m15s
2024-02-06 18:16:21 -05:00
Bigjango13
8c265a69d9 Add Food Overlay 2024-02-06 17:53:21 -05:00
b5e9486460 Fix Script Bug
All checks were successful
CI / Build (AMD64, Client) (push) Successful in 5m45s
CI / Build (AMD64, Server) (push) Successful in 5m22s
CI / Build (ARM64, Client) (push) Successful in 5m39s
CI / Build (ARM64, Server) (push) Successful in 5m24s
CI / Build (ARMHF, Client) (push) Successful in 5m48s
CI / Build (ARMHF, Server) (push) Successful in 4m0s
CI / Test (Client) (push) Successful in 9m6s
CI / Test (Server) (push) Successful in 5m53s
CI / Build Example Mods (push) Successful in 5m58s
CI / Release (push) Has been skipped
2024-02-04 03:40:59 -05:00
7fc5638143 Fix CI (Again)
All checks were successful
CI / Build (AMD64, Server) (push) Successful in 9m45s
CI / Build (AMD64, Client) (push) Successful in 9m55s
CI / Build (ARM64, Server) (push) Successful in 9m57s
CI / Build (ARM64, Client) (push) Successful in 10m10s
CI / Build (ARMHF, Server) (push) Successful in 7m14s
CI / Build (ARMHF, Client) (push) Successful in 9m33s
CI / Test (Server) (push) Successful in 10m23s
CI / Test (Client) (push) Successful in 13m14s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Successful in 6m0s
2024-02-04 02:33:35 -05:00
7ba9daa84e Fix CI
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 9m47s
CI / Build (AMD64, Client) (push) Successful in 9m58s
CI / Build (ARM64, Server) (push) Successful in 9m50s
CI / Build (ARM64, Client) (push) Successful in 10m11s
CI / Build (ARMHF, Server) (push) Successful in 7m1s
CI / Build (ARMHF, Client) (push) Successful in 9m6s
CI / Test (Server) (push) Successful in 10m45s
CI / Test (Client) (push) Successful in 13m11s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Failing after 5m56s
2024-02-04 01:31:41 -05:00
930d0120f3 More CI Improvements
Some checks failed
CI / Build (AMD64, Server) (push) Successful in 9m46s
CI / Build (AMD64, Client) (push) Successful in 9m57s
CI / Build (ARM64, Client) (push) Successful in 10m0s
CI / Build (ARM64, Server) (push) Successful in 10m3s
CI / Build (ARMHF, Server) (push) Successful in 6m53s
CI / Build (ARMHF, Client) (push) Successful in 9m8s
CI / Test (Server) (push) Successful in 10m50s
CI / Test (Client) (push) Successful in 13m14s
CI / Release (push) Has been skipped
CI / Build Example Mods (push) Failing after 5m55s
2024-02-04 00:43:25 -05:00
31fcff13e9 CI Improvements 2024-02-04 00:36:58 -05:00
41fcc942fa JS-Based Build Script
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 10m4s
Build / Build (AMD64, Client) (push) Successful in 10m19s
Build / Build (ARM64, Client) (push) Successful in 10m11s
Build / Build (ARM64, Server) (push) Successful in 10m0s
Build / Build (ARMHF, Server) (push) Successful in 6m57s
Build / Build (ARMHF, Client) (push) Successful in 9m20s
Build / Test (Server) (push) Successful in 10m42s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 13m41s
2024-02-03 21:07:53 -05:00
ddd9226e9e Fix Button Hover 2024-02-02 22:28:57 -05:00
a336cd1c7b Improve Key Handling 2024-02-02 22:25:22 -05:00
eaf6dd2fe2 Add Peaceful Mode To Options Screen 2024-02-02 14:49:47 -05:00
99b43ddb5a Create World Screen + Scrolling Text Boxes!
Some checks failed
Build / Build (AMD64, Server) (push) Successful in 9m42s
Build / Build (AMD64, Client) (push) Successful in 9m52s
Build / Build (ARM64, Server) (push) Successful in 9m55s
Build / Build (ARM64, Client) (push) Successful in 10m20s
Build / Build (ARMHF, Server) (push) Successful in 6m59s
Build / Build (ARMHF, Client) (push) Successful in 9m9s
Build / Test (Client) (push) Failing after 10m13s
Build / Release (push) Has been skipped
Build / Test (Server) (push) Successful in 10m4s
2024-02-02 04:20:34 -05:00
4f32cfab45 Send Button In Chat
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m38s
Build / Build (AMD64, Client) (push) Successful in 10m0s
Build / Build (ARM64, Server) (push) Successful in 7m58s
Build / Build (ARM64, Client) (push) Successful in 10m35s
Build / Build (ARMHF, Client) (push) Successful in 8m50s
Build / Build (ARMHF, Server) (push) Successful in 6m45s
Build / Test (Server) (push) Successful in 10m54s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m7s
2024-02-01 14:56:16 -05:00
69211eb31d Improve Markdown Formatting 2024-02-01 03:18:47 -05:00
58713976d4 In-Game Chat
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m49s
Build / Build (AMD64, Client) (push) Successful in 10m10s
Build / Build (ARM64, Client) (push) Successful in 9m53s
Build / Build (ARM64, Server) (push) Successful in 10m0s
Build / Build (ARMHF, Server) (push) Successful in 7m7s
Build / Build (ARMHF, Client) (push) Successful in 9m14s
Build / Test (Server) (push) Successful in 11m12s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m21s
2024-02-01 03:12:24 -05:00
d175f692e0 Put Sending Full Level Behind Flag 2024-01-31 23:52:29 -05:00
6d4ff44092 Java Light Ramp (Also From ReMCPE)
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m51s
Build / Build (AMD64, Client) (push) Successful in 10m2s
Build / Build (ARM64, Server) (push) Successful in 10m4s
Build / Build (ARM64, Client) (push) Successful in 10m21s
Build / Build (ARMHF, Server) (push) Successful in 7m11s
Build / Build (ARMHF, Client) (push) Successful in 9m23s
Build / Test (Server) (push) Successful in 10m53s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m33s
2024-01-31 23:44:04 -05:00
1771919cc1 Port Fire/Lava Textures From ReMCPE
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m44s
Build / Build (AMD64, Client) (push) Successful in 9m59s
Build / Build (ARM64, Server) (push) Successful in 9m58s
Build / Build (ARM64, Client) (push) Successful in 10m28s
Build / Build (ARMHF, Server) (push) Successful in 6m56s
Build / Build (ARMHF, Client) (push) Successful in 9m28s
Build / Test (Server) (push) Successful in 11m28s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m51s
2024-01-31 22:13:20 -05:00
522cee2d3b Fix overwrite_calls_within Macro
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m54s
Build / Build (AMD64, Client) (push) Successful in 10m9s
Build / Build (ARM64, Server) (push) Successful in 10m14s
Build / Build (ARM64, Client) (push) Successful in 10m32s
Build / Build (ARMHF, Server) (push) Successful in 7m1s
Build / Build (ARMHF, Client) (push) Successful in 9m27s
Build / Test (Server) (push) Successful in 11m58s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 17m23s
2024-01-30 01:30:11 -05:00
ccc7e5b190 Fix MCPI Ignoring ♪
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m37s
Build / Build (AMD64, Client) (push) Successful in 10m3s
Build / Build (ARM64, Client) (push) Successful in 9m51s
Build / Build (ARM64, Server) (push) Successful in 9m45s
Build / Build (ARMHF, Server) (push) Successful in 6m56s
Build / Build (ARMHF, Client) (push) Successful in 9m11s
Build / Test (Server) (push) Successful in 11m45s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m54s
2024-01-28 21:48:51 -05:00
7c9d16d662 Fix Mistake
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m49s
Build / Build (AMD64, Client) (push) Successful in 10m1s
Build / Build (ARM64, Server) (push) Successful in 10m0s
Build / Build (ARM64, Client) (push) Successful in 10m13s
Build / Build (ARMHF, Server) (push) Successful in 6m59s
Build / Build (ARMHF, Client) (push) Successful in 9m21s
Build / Test (Server) (push) Successful in 11m47s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m57s
2024-01-27 17:47:43 -05:00
49f56bd90d Fix Benchmark
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 10m10s
Build / Build (AMD64, Client) (push) Successful in 10m24s
Build / Build (ARM64, Server) (push) Successful in 10m15s
Build / Build (ARM64, Client) (push) Successful in 10m35s
Build / Build (ARMHF, Server) (push) Successful in 7m7s
Build / Build (ARMHF, Client) (push) Successful in 9m43s
Build / Test (Server) (push) Successful in 11m22s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 17m22s
2024-01-23 23:00:22 -05:00
0b252faa5f Simplify Some Code
Some checks failed
Build / Build (AMD64, Server) (push) Successful in 10m14s
Build / Build (AMD64, Client) (push) Successful in 10m27s
Build / Build (ARM64, Server) (push) Successful in 10m18s
Build / Build (ARM64, Client) (push) Successful in 10m37s
Build / Build (ARMHF, Server) (push) Successful in 7m12s
Build / Build (ARMHF, Client) (push) Successful in 9m44s
Build / Test (Server) (push) Successful in 11m50s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Has been cancelled
2024-01-23 21:58:18 -05:00
Bigjango13
233e8d691b Fix Tesselator instance symbols
Some checks failed
Build / Build (AMD64, Server) (push) Successful in 10m36s
Build / Build (AMD64, Client) (push) Successful in 10m48s
Build / Build (ARM64, Server) (push) Successful in 10m27s
Build / Build (ARM64, Client) (push) Successful in 10m42s
Build / Build (ARMHF, Server) (push) Successful in 7m15s
Build / Build (ARMHF, Client) (push) Successful in 9m47s
Build / Test (Client) (push) Failing after 2m55s
Build / Release (push) Has been skipped
Build / Test (Server) (push) Failing after 1m55s
2024-01-24 01:51:57 +00:00
Bigjango13
83a282551d Add packet related symbols 2024-01-24 01:51:57 +00:00
Bigjango13
29b49ac70a More symbols 2024-01-24 01:51:57 +00:00
Bigjango13
118fc6f396 Even more symbols from other projects 2024-01-24 01:51:57 +00:00
Bigjango13
e95236023c A few more symbols 2024-01-24 01:51:57 +00:00
46241c9aa0 Expose Some Properties
Some checks failed
Build / Build (ARM64, Client) (push) Waiting to run
Build / Build (ARM64, Server) (push) Waiting to run
Build / Build (ARMHF, Client) (push) Waiting to run
Build / Build (ARMHF, Server) (push) Waiting to run
Build / Test (Client) (push) Waiting to run
Build / Test (Server) (push) Waiting to run
Build / Release (push) Blocked by required conditions
Build / Build (AMD64, Server) (push) Has been cancelled
Build / Build (AMD64, Client) (push) Has been cancelled
2024-01-23 20:51:36 -05:00
f7be586a4c Build On Bullseye 2024-01-23 18:20:14 -05:00
Bigjango13
5c5538df2f Move worldgen desync patch to misc, for LAN games
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m30s
Build / Build (AMD64, Client) (push) Successful in 9m43s
Build / Build (ARM64, Server) (push) Successful in 8m29s
Build / Build (ARM64, Client) (push) Successful in 9m17s
Build / Build (ARMHF, Server) (push) Successful in 6m41s
Build / Build (ARMHF, Client) (push) Successful in 8m46s
Build / Test (Server) (push) Successful in 10m27s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m49s
2024-01-21 19:00:01 -05:00
Bigjango13
2995d1c9ad Fix short alignment 2024-01-21 18:43:31 -05:00
Bigjango13
b9b44a62bc Fix worldgen desync (and add some symbols) 2024-01-21 18:24:06 -05:00
Bigjango13
7e546a4a09 Fix ItemInHandRenderer in symbols
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m32s
Build / Build (AMD64, Client) (push) Successful in 9m46s
Build / Build (ARM64, Server) (push) Successful in 9m2s
Build / Build (ARM64, Client) (push) Successful in 9m28s
Build / Build (ARMHF, Server) (push) Successful in 6m39s
Build / Build (ARMHF, Client) (push) Successful in 8m58s
Build / Test (Server) (push) Successful in 11m53s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m43s
2024-01-20 08:24:35 +00:00
Bigjango13
be5bcf24c4 More symbols, mostly item rendering related 2024-01-20 08:24:35 +00:00
91ff082c97 Create AppImages Using CPack
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m39s
Build / Build (AMD64, Client) (push) Successful in 9m57s
Build / Build (ARM64, Server) (push) Successful in 8m59s
Build / Build (ARM64, Client) (push) Successful in 9m17s
Build / Build (ARMHF, Server) (push) Successful in 6m35s
Build / Build (ARMHF, Client) (push) Successful in 8m47s
Build / Test (Server) (push) Successful in 11m17s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m22s
2024-01-20 02:10:18 -05:00
40cd1b0a14 Improve CMake Superbuild
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 10m14s
Build / Build (AMD64, Client) (push) Successful in 10m31s
Build / Build (ARM64, Server) (push) Successful in 9m2s
Build / Build (ARM64, Client) (push) Successful in 9m27s
Build / Build (ARMHF, Server) (push) Successful in 6m43s
Build / Build (ARMHF, Client) (push) Successful in 8m50s
Build / Test (Server) (push) Successful in 12m13s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m57s
2024-01-16 03:08:34 -05:00
5c607d96b8 Simplify CMake
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 10m2s
Build / Build (AMD64, Client) (push) Successful in 10m13s
Build / Build (ARM64, Server) (push) Successful in 9m2s
Build / Build (ARM64, Client) (push) Successful in 9m22s
Build / Build (ARMHF, Server) (push) Successful in 6m37s
Build / Build (ARMHF, Client) (push) Successful in 8m50s
Build / Test (Server) (push) Successful in 11m39s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 17m2s
2024-01-16 01:45:52 -05:00
6e9b364f81 Organize Symbols
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m53s
Build / Build (AMD64, Client) (push) Successful in 10m7s
Build / Build (ARM64, Server) (push) Successful in 9m16s
Build / Build (ARM64, Client) (push) Successful in 9m49s
Build / Build (ARMHF, Server) (push) Successful in 6m39s
Build / Build (ARMHF, Client) (push) Successful in 8m49s
Build / Test (Server) (push) Successful in 11m35s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m27s
2024-01-11 22:10:30 -05:00
67a0d3017b Fix Furnace Visual Bug
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m53s
Build / Build (AMD64, Client) (push) Successful in 10m11s
Build / Build (ARM64, Server) (push) Successful in 9m17s
Build / Build (ARM64, Client) (push) Successful in 9m34s
Build / Build (ARMHF, Server) (push) Successful in 6m24s
Build / Build (ARMHF, Client) (push) Successful in 8m42s
Build / Test (Server) (push) Successful in 11m19s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m15s
2024-01-07 04:57:16 -05:00
e4d9ee4f20 Code Style Changes 2024-01-07 03:23:43 -05:00
d32fa2d265 Add Some Symbols From MCPI-Addons
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 9m50s
Build / Build (AMD64, Client) (push) Successful in 10m5s
Build / Build (ARM64, Server) (push) Successful in 9m12s
Build / Build (ARM64, Client) (push) Successful in 9m46s
Build / Build (ARMHF, Server) (push) Successful in 6m35s
Build / Build (ARMHF, Client) (push) Successful in 8m49s
Build / Test (Server) (push) Successful in 11m0s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Successful in 16m16s
2024-01-07 02:59:04 -05:00
34c24378f3 Update Example Mods 2024-01-06 20:36:59 -05:00
b7b60876d8 Fix Item Dropping When Killing Players From The Server Console
Some checks failed
Build / Build (AMD64, Server) (push) Successful in 9m59s
Build / Build (AMD64, Client) (push) Successful in 10m15s
Build / Build (ARM64, Server) (push) Successful in 9m17s
Build / Build (ARM64, Client) (push) Successful in 9m40s
Build / Build (ARMHF, Server) (push) Successful in 6m31s
Build / Build (ARMHF, Client) (push) Successful in 9m3s
Build / Test (Server) (push) Successful in 12m4s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Failing after 17m0s
2024-01-06 18:15:52 -05:00
4dff667749 Fix Server Build
Some checks failed
Build / Build (ARMHF, Client) (push) Waiting to run
Build / Build (ARMHF, Server) (push) Waiting to run
Build / Test (Client) (push) Waiting to run
Build / Test (Server) (push) Waiting to run
Build / Release (push) Blocked by required conditions
Build / Build (AMD64, Server) (push) Successful in 10m3s
Build / Build (AMD64, Client) (push) Successful in 10m15s
Build / Build (ARM64, Client) (push) Has been cancelled
Build / Build (ARM64, Server) (push) Has been cancelled
2024-01-06 18:03:48 -05:00
aa92da6fdd WIP New Modding API
Some checks failed
Build / Build (AMD64, Server) (push) Failing after 3m17s
Build / Build (AMD64, Client) (push) Successful in 8m28s
Build / Build (ARM64, Client) (push) Successful in 8m27s
Build / Build (ARM64, Server) (push) Failing after 4m1s
Build / Build (ARMHF, Server) (push) Failing after 3m31s
Build / Build (ARMHF, Client) (push) Successful in 7m38s
Build / Release (push) Has been skipped
Build / Test (Client) (push) Failing after 5m48s
Build / Test (Server) (push) Failing after 3m9s
2024-01-06 06:30:23 -05:00
0be1f4fce8 Tweak Outline Color
All checks were successful
Build / Build (AMD64, Client) (push) Successful in 8m40s
Build / Build (AMD64, Server) (push) Successful in 8m45s
Build / Build (ARM64, Client) (push) Successful in 8m7s
Build / Build (ARM64, Server) (push) Successful in 8m1s
Build / Build (ARMHF, Server) (push) Successful in 6m33s
Build / Build (ARMHF, Client) (push) Successful in 8m48s
Build / Test (Server) (push) Successful in 11m30s
Build / Release (push) Successful in 1m1s
Build / Test (Client) (push) Successful in 16m23s
2023-12-26 19:22:50 -05:00
631cbc07d0 Simplify Scripts 2023-12-26 17:45:53 -05:00
5f8c700081 Fix CI
All checks were successful
Build / Build (AMD64, Client) (push) Successful in 7m46s
Build / Build (AMD64, Server) (push) Successful in 7m56s
Build / Build (ARM64, Client) (push) Successful in 7m42s
Build / Build (ARM64, Server) (push) Successful in 7m19s
Build / Build (ARMHF, Client) (push) Successful in 8m9s
Build / Build (ARMHF, Server) (push) Successful in 5m59s
Build / Test (Server) (push) Successful in 11m14s
Build / Release (push) Successful in 48s
Build / Test (Client) (push) Successful in 16m8s
2023-12-26 17:29:45 -05:00
ac55d7d6b3 2.5.3
Some checks failed
Build / Build (AMD64, Client) (push) Successful in 10m27s
Build / Build (AMD64, Server) (push) Successful in 10m13s
Build / Build (ARM64, Client) (push) Successful in 8m34s
Build / Build (ARM64, Server) (push) Successful in 8m28s
Build / Build (ARMHF, Server) (push) Successful in 6m33s
Build / Build (ARMHF, Client) (push) Successful in 9m15s
Build / Release (push) Successful in 51s
Build / Test (push) Failing after 16m30s
2023-12-26 02:31:22 -05:00
ef29e4fc0e Remove GL Stubs From Headless Mode 2023-12-25 17:29:30 -05:00
35c6adf94b Fix Bug On X11
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 10m3s
Build / Build (AMD64, Client) (push) Successful in 10m21s
Build / Build (ARM64, Server) (push) Successful in 8m32s
Build / Build (ARM64, Client) (push) Successful in 9m3s
Build / Build (ARMHF, Server) (push) Successful in 6m6s
Build / Build (ARMHF, Client) (push) Successful in 8m27s
Build / Release (push) Has been skipped
Build / Test (push) Successful in 16m31s
2023-12-06 12:54:21 -05:00
1d08b8a29e Update Example Mods
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 34m39s
Build / Build (AMD64, Client) (push) Successful in 35m14s
Build / Build (ARM64, Server) (push) Successful in 37m42s
Build / Build (ARM64, Client) (push) Successful in 39m8s
Build / Build (ARMHF, Server) (push) Successful in 31m38s
Build / Build (ARMHF, Client) (push) Successful in 38m8s
Build / Release (push) Has been skipped
Build / Test (push) Successful in 42m39s
2023-12-04 20:08:48 -05:00
7296fcee83 Update Documentation
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 37m21s
Build / Build (AMD64, Client) (push) Successful in 37m26s
Build / Build (ARM64, Client) (push) Successful in 33m26s
Build / Build (ARM64, Server) (push) Successful in 40m19s
Build / Build (ARMHF, Client) (push) Successful in 35m14s
Build / Build (ARMHF, Server) (push) Successful in 29m48s
Build / Release (push) Has been skipped
Build / Test (push) Successful in 43m26s
2023-12-02 14:25:58 -05:00
97b46ad01a Fix AppImage updating, which has apparently been broken for *years*. Why didn't anyone tell me????
All checks were successful
Build / Build (AMD64, Client) (push) Successful in 34m25s
Build / Build (AMD64, Server) (push) Successful in 26m21s
Build / Build (ARM64, Client) (push) Successful in 31m46s
Build / Build (ARM64, Server) (push) Successful in 30m1s
Build / Build (ARMHF, Client) (push) Successful in 30m7s
Build / Build (ARMHF, Server) (push) Successful in 26m36s
Build / Release (push) Successful in 5m26s
Build / Test (push) Successful in 43m14s
2023-11-25 18:22:43 -05:00
17d11647e7 Fix CI (Hopefully)
All checks were successful
Build / Build (AMD64, Client) (push) Successful in 35m13s
Build / Build (AMD64, Server) (push) Successful in 25m45s
Build / Build (ARM64, Client) (push) Successful in 30m23s
Build / Build (ARM64, Server) (push) Successful in 28m10s
Build / Build (ARMHF, Client) (push) Successful in 29m18s
Build / Build (ARMHF, Server) (push) Successful in 26m1s
Build / Release (push) Successful in 5m41s
Build / Test (push) Successful in 43m40s
2023-11-25 02:39:19 -05:00
48137f9665 Final Tweaks
Some checks failed
Build / Build (AMD64, Client) (push) Successful in 35m5s
Build / Build (AMD64, Server) (push) Successful in 25m47s
Build / Build (ARM64, Client) (push) Successful in 30m50s
Build / Build (ARM64, Server) (push) Successful in 29m6s
Build / Build (ARMHF, Client) (push) Successful in 29m9s
Build / Build (ARMHF, Server) (push) Successful in 25m58s
Build / Release (push) Successful in 2m57s
Build / Test (push) Has been cancelled
2023-11-24 22:16:13 -05:00
c956151603 CI Fixes
All checks were successful
Build / Build (AMD64, Server) (push) Successful in 38m56s
Build / Build (AMD64, Client) (push) Successful in 39m40s
Build / Build (ARM64, Server) (push) Successful in 41m29s
Build / Build (ARM64, Client) (push) Successful in 43m2s
Build / Build (ARMHF, Server) (push) Successful in 34m58s
Build / Build (ARMHF, Client) (push) Successful in 41m8s
Build / Release (push) Has been skipped
Build / Test (push) Successful in 44m51s
2023-11-24 18:53:16 -05:00
73b51be43f Try Fancy CI
Some checks failed
Build / ${{ matrix.mode }} (${{ matrix.arch }}) (AMD64, Server) (push) Has been cancelled
Build / ${{ matrix.mode }} (${{ matrix.arch }}) (ARM64, Client) (push) Has been cancelled
Build / ${{ matrix.mode }} (${{ matrix.arch }}) (ARM64, Server) (push) Has been cancelled
Build / ${{ matrix.mode }} (${{ matrix.arch }}) (ARMHF, Client) (push) Has been cancelled
Build / ${{ matrix.mode }} (${{ matrix.arch }}) (ARMHF, Server) (push) Has been cancelled
Build / Test (push) Has been cancelled
Build / ${{ matrix.mode }} (${{ matrix.arch }}) (AMD64, Client) (push) Has been cancelled
Build / Release (push) Has been cancelled
2023-11-24 18:37:08 -05:00
71b11b314b Animated Chests 2023-11-24 17:57:39 -05:00
168b825bf4 Clean Up CI
All checks were successful
Build / build (push) Successful in 3h7m58s
2023-11-24 12:09:21 -05:00
edca3ad394 Fix ARM Build
Some checks failed
Build / build (push) Failing after 3h12m6s
2023-11-24 03:43:15 -05:00
1aed33a48b Improve Flatpak Build [skip ci]
Some checks failed
Build / build (push) Has been cancelled
2023-11-24 03:28:17 -05:00
177c5262a6 2.5.2
Some checks failed
Build / build (push) Has been cancelled
2023-11-24 03:07:06 -05:00
7969fb2127 3D Chest Model 2023-11-23 23:54:36 -05:00
b0aac13057 Ȩ̴̛̛̛̝͉̬͙͕̯̬̙̥̬̺̫̭͉̱͈̭͕͍͈̲̯̀̔͒̑̈͛̂̃̑̓̄̊͌͆̎̉͐́̀̇͒̋̒́͊̈́͊̓̈̓̍̑͛̑̃͒̌͗̐̈́̈̈̒̏̀́͌̿̂͂̽́̂̉̅̽̀͌́̔̔̾̃͆̓͗͊͌̃͘̚̚̕̚̕͝͠͝͝ê̴̢̨̧̢̧̛̛͖̲̠̞͓̪͕͙̖̟̯͕̭̘͖̤͕̲̬͔͎̞͇̩̦̳̲̺͎͍̱̯͔̼͙̯͙̮͔̼͎̫͇̯͚̳̭̇̂̃̃̓̅͐́̆̀͑̅͌̓͑̏̄̆͊̅̀̒́̌̄̌̈́͆̋̔͐͊̓͒̈́̋̉͆̑͑̿̈͑̓̾͗̿̈̏͘̕͝͠͠ͅͅḩ̵̛̘̣͖̤̪͉̦͓͖̈́̎́̌̂̈͌̍̍͋͒̊͊́̑̓̓͘͘͘̚͜͝͝͝†̷̧̨̨̨̩̩̺͔̖̼̺͙̰̞͚̻̙̙̜͙̯̪͉̻͈̲͎͔͉̟̻̱̦̝̱̝͍̩̣̞͍̘̥̪̺̺̜̯̹̬̮̱͚̥̦̲̙̪̮̠̩̞̫̞͙̰̪̤͖̙̖̼̖͇͚̆̋̋̀̃͒̑̌͛̍̿̄̏͜͠ ̵̢̛̲͈̩̭͙͙̺̠͇̲̣̗̗͕͍͚̼̯̣̮̌̾̉̓͐̄͐̓̇̂̔͂̔̒̈́͌̏̓̔̾͆̈́͌̑̄͋̃̎͑͛̈́̃̋͑͑̍̍̀̂͆͛͂̇͒͂̃͐͊̈́̍̆͆̐͊̈́̓͑́̐̾͐̈́̒̔̓̾̈́̄̔̚͘̚̕̚͘͝͠͠ͅñ̸̨̢̡̳̙͔̗͕̙̩̝̖̹̪̺̟̼̝͓̬̻͓̮̣̜̖̤̯͖͕̗̝͖̩̬͎̳͚͙̤͙̞̺͉͇̱̩̪̞̭͙̱̫̯͚͓͌̋̄̃̔́̐̀̐̍̈́̽̑͋̋̉̽̌̅̈̅̓̇̓̈̚͘͘͜͝͝͝ð̷̡̧͈̭̤̙̦͇̺̝͖͖͈̤̦̤̗̐̅̓̓̓͐͒̐͗̓̃̈̿̾̒̈̈́̂̇̂̅̽̈̈́͊́͛̅̾̔̀̎̈̽̒̓̎̎̂̀̏̽̃̌̎̎̏́̒̓͗͐̾̍͒̓̏̽̚̕̕̕̕͝þ̴̨̢͕̙̯͈͉͈̳͔̪̥̲̯̥̞̜̪̬̺͖͈͉̼̟̠̥͈̮̻̼̤̤͎̘̪̻̗͐̉͌́̎͑̊́̇̈́͑͐͆̋̆̾͂̈̉̑̈̊́̾̈́̈͂̀͛͂̂͊̓̂̆̉̀͌̒͊͊́͆͛̿͑͌͗̏̽̎̋̚̚̚͘̕͜͜͝͝͠͝͝͝͝͝ͅµ̴̡̨̛̤̭͇̫̹̳͇̞̼̳̣̙̘̫͇͖͈͕̮̀̉̒̎̈̀̓͒̽͊̎͋̆́͂͒̎̉̎̒̑͆͌̒̂̎̂͋̇͌̄͛̑̏́͂̾̎͂̅͋͗̄́̿͌̔͌͘͘ ̶̧̧̧̮̩̜̝͈͙͖̼̦͕̥̻̬̣̜̣̣͉͙͕͔͓̟͚̩͎͍̣̟͔͚͚̼̦̥̯̠͎̩͎̣͈̦̯̰͎̦̜͚̀̇̄̎̀͑́͆̽̓̋̀̎̾̃̅̏͌͑̇̏͗̅́̽̈́͐̑͊͂̃́͐̈͐̀̍̽̔͗̊̓̓̾̉̄͗̈́̓͗̇̈́͛͗͒͑̏̈́̿͗̂̀͒̾̽́̀͒̓̔́̕̕̕͘͘͘͝͠͠͝͝͠͠͝ͅͅͅͅL̵̢̡̧̧̢̨̨̨̛͉̺̖͍̻͉̟̯͔͚͎͚̝̻̞̠͓̻̰͉̲̺̦̤͍̫͙̲̺̣̬̜͖̮̬̪̣͙̩̮̭̪͖͖̱̺͚͍̳̙͚̣̬̥̫̳͔̬͇͙̣̍̓̆͊͐̂̀̔̾͌̔͐͂̃̍̍̊̈̈̐̌̈́̔͂̎͊̅̏̍̽̚̚͜͝͝͝͝ͅͅl̴̢̧̢̩͍̩̫̙̤̦͇̟̪̩̙̠̮͖̩͇̘̼̫̼̲̣̟̩̘̟̳͇̜̠͔̗͈̯͙̞͓͛́̍͂́͑͛̇͂͌͆̇͂̾̐͑̒̌́̒̑̒̈́̃̉́͑̈́͋̓̒͒̽̉̔̆̈́͑͆̍͒̂͆͊̚̚͘͘͝å̶̡̢̢̢̡̨̨̡̢̛̮̰͚͕̹̘̼͈͖̠̲̗̰̥͈̪̲̱͕̦̘͎̖͇̗̜͇̬̤̞̱̯̟͎̲̦̩̜̳̮̟͈͇̫͎̯̗͙͔̼̒̊̐͊̍̂̈͑̑̎͊̒͑̊͋̽̂̉͜͜͝ͅͅͅ¢̶̡̧̧̛̜̲͕͇̮͙̹͎̘̦̖̺͕̪͔͈͉̝͓̖͖̫͖̥̌͛̅̀͆̎́̈́͒̃͑̋͘̕ͅ ̴̨̨̛̛̛̛̛̛̰͈͔̪̥̲̲̮͖̗̺͕͚͚̦̞͕̩̙̲̫̘͚̙͚̖̳̙͈̮͉̬̹̯̞̥͉̼̦̣̠̠̹͚̗̫̝̤̩͓̪̜͒̆͗̀̐̊̔̿̈͆̍͌̾̀̓̅͑͑̄́͂̓̋͆̇͆͆͑̎̑̆̽́̒͊͂̄͊̅͗̅͌͋͑͑̎̈́́̈́̆̿̏̈́̍̊̍́̄͋̀̉̿͛̏̌̉̊͌̒̌̑̌̚͘̚̕͜͜͠͝͠Ì̷̡̧̧̛̻̟̻̤̗̙̻̻̠̖̰̞͍̤̥̙̳̮͉̱͉̳͚̉͒̎̎͌̓̈́̐̓̅̍̈́̍̂̀͒̾͑̈̚͜͠,̴̡̢̨̡̨̡̧̧̛̰͉̫͎̼͍̬̠̬̳̠̫̳̼̻̜̞̪͔̖͓͇͉͖̥̩͚̫͇̱̤́̃͆̄̒͆̒͌̉̄̓̂̂̎̂̌̇̓̈́͌́̃̌̓̈́̋͐́̀͂̓̒̀̄͗̒͂̾̂̈́̍̌̎͂͌̏̊͘͘̕̕͠͝͝͠͠͝ ̷̡̨̛͍̗̙̹̻̳͖͉̟͇͖̙̖̹̙̰̩̘̗͉̗͇͙͔̝̗̯̫̭̬̰̩͉̥͖̪̤̮̟̖̯͖͔̫̦̰̞͍̹̠͔͇̠̣͉͙̖̙̪͔̪͎̍͐̌̀̎͑́̉̈́̐͗̋̅̄͗̈́̉͆̿̓̈́̑̓͐̋̈̇̽̑̈́̓͐͛͐̓̏͒̈́͋͂̎́͐̈́͌̏̓̎̉̾̚̚͘͝͝ͅͅͅÌ̵̢̧̧̨̢̛̛̛̼̙̩̖͓̫̥͎̳͖̟͍̙̦̟͔̲̯̱̮̣̻͙̪̹̭̞̻̠̠̟͔̭̘͔̝̯̮̳̺̗̪͇͇̳̼̦͎̺̩͈̑́͋̌̋̄͌̇̍̓͂̋̆̎̔͌̀͋͆̏̈́́̍̇̈́̿͐͊̅̇̒͐̾̽̌̇́̅̑̒̄͌̿́̈̏͌̂͌̽̿̌̽͛̏͗̋̾̍̈̈́̽͐̏̒̇̈́̂̃̚͘̕̚̚͜͠͝͝͠͝͝͠þ̸̧̧̨̢̨̛̱̲̜͍̤̺̭̮̫̯̼͕͈͍̮͎̥̫̖̙͙͍̞̱̳̜͕̙̯͈̯̣̬̹̰̘̤̣̫̯̙̲͔̝̲͇͙̖̗̬̪̭̱̯̙͈̰͓̱̲̯̈̑̿͌͜͜ͅͅÇ̸̧̢̨̡̨̨̡̛̛̛̛̛̛̲̜͎̙̖̞̪̝͉̹̣̙͙̠̣͈̭̥̺̰͇̤̰̹͔͍̹̥̱̬̫̠̙͖̱̙̞̮̘̟͇̥̹̺̺̝͇̲̣͖̭̭̥͋́̃̓̉̈́̒̂̏̀̉́̾́͆͛̐̂̏́́̇͂̀̏̇̆̓̓͑͐͊̾̾͌̂͑̀͛̏͐̂͒̏̎͆̋͒͛̐͊̃͋̇̈́̓̈́̈̆̚̚̕͜͜͜͜͠͠͝͝͝M̶̡̢̧̨̡̢̛̲̥̯͉̗̥̙̲̬̫͚̼̜̝̲̲͓̖̬͔̖̦͕̫̗͈̼̹̥̣̙͚̮̣̘̟͕̰͍̬̘̮̱̲̘̜̫͚̹̤̘̥̲̮̦̱̲͍͔̝̤̣̣͕̯͕͍̞̘̰̲̮͗̎̓̀́̀̾͐́͋̍̐̽̂͌͑̅̒̏̾̇̋̓̋̈́̈́̐̅͌̈́̀̿̏̈́̒͊̃̽̐̎̆̽̄̄́̊͗̉͋̅͗͒̔̀̐́̈́͌͗̑̀̑̋̍́͂̓̏̈́̐̓̚̕͘͜͝͠͝͝͝͝ͅͅ ̸̧̢̛̛̗̣̺̩̤̬͓͈̦̙̠͉͕̲͚͕͉̩̺̬̣̳͇͍̞͈̬̉̏̔͊̔͂̋̌͒̔̎̊͂͆̓͆̄͌̓̊̈́̐̀̋̅͗͋͊͌͑̿͋̊̈͒̅́͌͒͒́̋̈́̂͌͂̇͒̈̽̔͛̉̔̀͘̚̚͝͠†̷̨̨̡̡̡̨̢̡̥͖̫͕̭͕̣̜̹̺͍̤̞̩̤̮̙̟̞̝̱͇͖͕̗̪̺̝̳͈̘̬̰͉̳̭̼̗̝̞͚̫͕̺̬̪͎̤͉̣̱̩̜́̂͂̽͑̀̀̃̇̽͑̾̈́͑͐̂͝͝͝ͅͅḁ̶̢̡̢̨̧̭̳̺̼̪͔̻̯̗͎̠̪̥̟̙͔̬̳̤͎̪͍̥̳͈̤̱̩̦͇͈̳̻͉̻̥̺͉͓̣̟̝̺̱̣̰̙̱̹̞̱̣̘͍̜̩̥̳̥̭̻̠̥̬͚̤̫̩̮̯̜͍̊̌̀͊́͂̓̒̀̈́̎͑̌́͆̒̇̽̂̿̋̓͊͂̑̌͂͛̿̊͌̈́̈̅̎͋͂͐͑̏̊̑̉͒̎͑̃̎̾̌̈̀̅͐̿̎̒̄̐̌̃̿̈́̎̉̿͋̑̌̂̑́̌̂̇͛̾̕̕̚̚͜͠͝͝͝ȩ̸̢̛̲͖̳̦̖̝͈͉̬̟͚̲͍͚̬̲̥̳͙̰͖̺̙̥̜͈̹̪͚̗̰̹͍̘͓͙̞̬̤̫̞͉̤̲͔̘̭̻̯͍̂͑͊̇̾̀͐̐́̅̒̋̃̑̅͋̀̌͒̆̇́̾̾͂̀̒́̍̒̄̏̓͗̄͑̓̏́̇͒͑͊͑̾̐͗̉͆̅̓̔͗̾̍̏͆͂̾̅͊̽̆̄͌̕̚̚͜͝͝͠͝͠͠͝ͅͅͅͅr̴̢̡̨̡̡̢̧̡̢̨̛̛̛̗͙͖̱̖̣̣̰̻̘̮̻͉̳̙͈̳͚͓̟̦͚͕͓͈̬̥͚̪̰̘̗̮͖̯̬̯̲̠͎͍͔̯̩̱͕̲̺̖̥͈̼͍̤̗͕̻̗̘̙̥̦̼͔̘̰̹̱̰̫̜͇͎͚̞̥̝̉͂̈͐̃̒̔̑̈́̉̒̃̄̀̈́̃̔͆̄̓͋͐̓̍̊̉̍̈́́̒̓̍͛͌̾̎͘͜͜͝͝͝ͅͅģ̶̧̡̧̧̨̧̡̡̨̛̛̹̻̥̱͕̥͙̮̣̻̖̭̪͚͍͖̬̲̠̞̭͈̼̙̼̼̺͍͚̟̭̫̯̦̬̭̤̙̺̪̹̣̦̘̭̠̞͕̳̻͙̟̼͉̘̞̥̭̪̺͔̼̠͖̫̥̬̦̳͈̱̱̳̀͊̅͛̎̆̓̑͒̉̀́̎̔̇̈̂̓̓̏̈̔̇͛̏̑̊͐̈́̀͊̎̏̆̿͗̂̓̊͂͒̌̄̄̔̈̔̏̔͊͊̏̂̅̄͒̀̇̚̚͜͝͝͝͝͝ ̷̢̧̡̢̢̧̺̗̙͉̠̺̤̝̲͔̠̹̬̬͎̪̖̜̘̪̪͚̹̜̥̖̻̙̩̝͕̥͚̜̣̞̫͎͚̪̰̣̭̻̠̲̮͙͙͈̜̣̲̫̺͖̤͉͙̤̻̲͖̙͗͜͜͜͜H̵̨̧̡̡̨̧̛̛̛̛̛̫͈͔̲̭̠̮̪͕̳̼̞̞͈̪̲̺̤̗͓͙̠̬̪͈̩͇͈͎̤̼̳̣̰͉̯̻̋͂̌͂̋͒̂̎̂̑͂̑͐̌̈́̌͑́͐̀̆̏̎̀͌͗̅̉̇̾̆̋̂͒̋̈́̾̓̏͌̈̏͐̈́̇̓̅́̓́͗͋̀̓͑̿̑̅̀̎͊͋̌̀͆͛̕͘̚̕̚͜͝͠͝͝͝ð̶̨̧̨̧̛͇̟͔̮͉̹̻̘͔̞͇̬̹͚̞̗͓̘̠̺̹͚̝̳̗͚͚̝͈̣̠͖̦͙̰̹͍̬̘͙͚͙̺̘̩̙̰̖͇̤̺̎́͛̍̓̊̒̈́̈́̋̈́̋̋̓̾͋̈́͐̈̓͋͋̄̑̒͛̑̄̉̅͋̽̓̋͑̉́̋͑͗̽̂͊͆̊̉̀͑̍̊̑̏̒̄́̆̊̆͒͌̒̾̌̓̐͛̄́̆̇̿̅̃͗̈̄̈́̄̓̎͐͘̚͘̚͘͘͘̕͠͝͝͠͝ͅͅ!̸̢͇̺̲͙̣͚̮͙̝͖͚̒̽̌͂̓́̌̒̓̋̓͐͑̐͋̐̀̔̊̍̂̎̍̆̓̅̒͋̆̇͂̑̀̔͊̏̕͘͝
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2023-11-13 17:45:05 -05:00
80c0f24a5d J̶̨̡̨̨̧̧̧̧̨̢̢̢̧̡̨̢̨̢̢̧̧̢̡̡̧̨̤̩̱̗̣̗̱̮͇͇̻͕͉͇̗̭͕̻̝̼̻̤̞͍̫̣͔̗̠̠̪͕̮̙̤͓̯̦̙̬̫͙̖̙͙̬̜̗̙̬̩͔̹̱̠̩͎̞̪͖̯̹̲͙̥͈͕̼̜̪̙͔̖͈̞̣̝̦̤̺̺͓̮͓̮̝̤͙̗͉̗̞̟͈̞̼͕̩̻̥͖̤͇̪̪͍̗̥̼̲̝͇̜̥͚͍͕̞̝̖͔̜̦̮̫͍̜̬̥̲̮̜͈̠͙̭̱͇̥͈͇̩͖̝̱̪̹̜͕͈̫̦̭͉̞̪̤̗͙͚̰̙̝͚̹̝̫̪̤͇̠̮̤̜̭̰̞͚̝̫̭͉͕̠̻̤͕̫̳͓̳̯͍̣̭̘̤͚̯̖͓̼͕̥̞̘̤̣͔̥̮͉͍̝̣͇̳͇͎͈͖̤͎̯̬̬̭̗̫͚̹̫͉̮͋̕͜͜ͅͅͅu̶̢̡̢̧̧̡̡̨̡̧̢̧̨̢̢̧̧͚̟̥̘̭͇͈̳͔̠͓͔͉̱͙͓̪̱͚͉̬͎͉͚̹̩̪̥̤͍̖̜̼̦͍͎̫͇͉͔͔̙̪̝̱̥̭̠̭͈̙̗͓̲͙̰̻̲̬̪͖̤̹̘̬̻̜͙̫͇͎͚̺̩̬̬̰̬̣̲̯͓̝̝̹͖̼͓̹̺̯̱͚̗̩̱̠̠̺͎̮̮̪̤̝͇͚̫̹̼̗̺̻̗͓̠͕̯̯̱̘͎̳̱͉̙̪͇͓̼̯̙̘̪̲̳̭̝̹̦̮̳̗͔͈̪̰͇̖̥͕͓̺͇͔̝̲̫͉̣̭̥̹̼͖̺̰̳̪̠͕͉͚͎̪̪͎̪̩͍͛̊̈́̾͒̈̂͐̑̿͑̀̾̎̋͗̒͋̄̑͐͗́̈́̎̆̉͛̎̋̐͗͒̄̑͌͆̀̉̐̓͐̆͂̂̿̓̇̽͒̀̀̍̓͒͛͆̇̂͒́̄̔͛̎́̓͆̈͐͒͛̽̕͘͘̚̚̕͘̕͘͜͜͜͝͠͠͝͝͠͝͠͠͠ͅͅͅͅͅͅͅͅͅs̷̡̧̨̡̢̢̨̧̨̧̢̢̡̨̡̧̢̨̢̡̨̢̢̨̧̡̛̛̛̛̛̛̛̥̹̳̬͚̠̼̲̬̞̺̤͈̪̲͓̣̤̬̘̰̮̪̟͍̪̗̦̲̺͉̦̤̟̖̲̲̠͉̙̜͇̞͓̻̣̞͉̝̪̺̰͓̝̥͙̘͎̘̭͎̺̮̼̥̩͓̘̠̺̪͚̝̯͈͚̬̦̯̦͕͖̰̭̠͇̣̙͉̻̘̜̟̤͔̳̣̖̻͚͚̻̺̦̳̣̘̣̩͉͈̳͎̫̯͕̪̠͕̲͚̜̗̗̫̫̱͎̯̙̣̗̫̭͎̩̫̟͚̦̟̙̤͉̜͔͙̙͙̫̣̮̱͙̳̺̺̗̼̻͍̣͍͙̯̝̼͕̭̦͖̻̝͍̝̪̮͇̯͔̼̣̩͕͕̘̭͕̖͓̭̉͒̂̌̐̂͑̋͂͋̈͐̈́̄̂̅͗͋̾̓͌̈̀̇̂̇̃̉̎́̀̏̐̐̽̿̏̈́͗͑̓̇̊̊̇̓̈́̒̀̅̈͗̓̌̄͂̽͆̇̓̄̿̃̀͛͊̽̉̑̉̑̆̅̽̎͒̔̔̒̍͆̑̐̽̄͛̐̀́̓̈́͋̍̿́͂͊̃͐͐͋̊̌̒̾͗̓͊͐̋́̔̍́̐̑̌̏̆̓͋̐͗̀͋̆̓̃̇͂͗̎̅̈́͒͗͗̔̆̈̃͋̆̒̇̄͗̋̓̔͛̉̈́̑̂̉̐̋̎̅̅̆͒̈̀͂̾̂̐̂̊͋͋̔̃͋͆̑̇̂̾̆̎̈́̉̍̽͊͊̏̎̏͐͋͂́̾̀̓̽̐̀̓̉͂̅̂̋̅̇̚̚͘̕̕͘̚̚̚͘͘̕͜͜͜͜͜͜͜͜͜͜͝͝͝͠͝͝͝͠͝͠͠͝͝ͅͅͅt̵̡̧̛̛̛̛̛͙͉͍̱̰̘͍̻̬̝̦͎̣̖̙̠̬̻̝͔̣̲̩͍̱̑͒̍͊̊̎́̊̂̂̄̽̿̀̍͌̏̽̿́̍̆͆͗̔̈́́͊͂̆̾̿̐̓̈́̓͑̑̋͗̀͐͛̐͐́́̒͂̆̒̉͌̇̄̀̃̆̂͛̽͐͌̓͗̾̔̊͐̎͐̄͌͋̐̅͋͋͒̋̊̊̀͂̇͛̅̂̐̀͒̒̉̇̃̒̔̔̍͌̒̌̌͊͐͂̑͒̾̽͊̈́͑̐̈̑̉̽̇̆̓͂̋͌́̿̓̇̀̏̾̈́̏̌̔̉̐̽̃̿̈̈̉̈͌͐̊́̾̊̔̉͆̄͆̈́̈́̍̈̃̽̊̉͌̆͑͆̊̽̽̒̒̿̏͋́̀̅̍̏̑̈̿̋̃̈̄̏̋̋̈́̎͆̍͛̀̈̂̀̀̀̈́̐͑͌͑͒́̀̎͛̒̍͗̊̉̒͋͋͒͐̌̏̆̑̓̈́̾̒͂̆͌͆̀͊̐̎̂̅̾̋̔̂̀̍̏̓́̇̽̾̅̚̚̚̚̕̚̚̕̕͘̕̚̚͘̕͘͘̚̕͘̚̚̚͜͜͝͝͝͝͝͠͝͝͝͠͠͝͠͠͠͝͝͝ͅ ̸̡̧̡̡̧̧̧̧̡̨̡̨̨̧̧̢̛̛̛̛̛̛̘̰͓̼͍̗̥̮͕̝̞̟͇̞̙̻͙̯͕̗̺̠̺̗̭̰̗̺̗̲̥̯͎̫̻͔͓̩̜̦̘͓̬̳̟̻͈͔̯̩͕̙̩̝̬͇̣͓͇̱̹̼̹̹̩̰̣̹͈͈̬̜̳̪̹̠͓̥͎̩̥̥̳̱̩̹̝̘͕̗̘̲͓̺̱̹̫̱̟̜̺̹̥͎̳̺̹̘̞̼̟̪͉̝̼̣̤͓̮̩͍̜͍͖̻̺͈̤̹̙͇͙̭̙̜̰̻͙̣͕̼̘̠͓͉̲̻̟̻̦̺͕͍̦̩͖̰̥̩̱̱͚̩̹̰̹̙̫̟̣̗̝̹̝͉̻͉̟̗̙̫͖͈͖̬̜̬̞͍̭̻̤̣̪̭͍̗̠̬̘͕̠͈̖̥̓̀̈̉́̆̌̅̈͊̊̔͗̀͆͒̓͗̽͋̉̒̈́̃͛̾̄̄̀̍̑̀͗͋͛̓̈́̓̈̓̊̅̔̀̓̾̄̈̓̂͊͛́̾̉̉̎̍̆̅͆̀̇̈́͆̌̔̓̈́͌̄̈́̋͌̍̅̓̈͐́̉̀̓̊̍̽͗̂͑̐̔̅͆̀̎̓͊̽̔͑̽̂̓̇̓͐̎͑͛̽̄̈́̉̾͒̍̑̀̐̓̀̇̿̈́̎̊͂͑̇̎͆̇̄͒͋̀̿̓̐͆̈́̂̿̏͂̍̈͌̏̆̿͋̈͂́͗̎͊͒̅̈́̋̃̉̽̀̿̎̈̅̇̽̒́̐̈́̎̑̄̂͗͛̌̄͊̀̓͋͘̕̕͘̚͘͘̕̕̚̕̕̚͘̚͜͜͜͜͜͝͝͠͝͠͠͝͠͝͠͝͝͝͝͠͠͝͝͝͠͠͝͝͠͝͝ͅͅͅͅͅͅͅF̷̢̨̧̨̡̧̢̛̛̛̛͓͈̱̯̬̭͖̫̞̻͖̲̭̝͕̤̤̜̬̖̺̹͎̺͚͎͙̮̟̖̗̻͚͕̙̦̱͚̝̯̜̙̩͈̱̙͖̞̞̰̳͕̦̬̙̉̏̈́̑̎͛͑̆̆̽̉͂̏̑̅̌̿̔͛̿͌̏̿͋̈̐̾̃̈́̾̃̃̀͒̈́͋̅̇̐͒͆̿̄͋̉̋̏́̅͊͑̆̔̽͌͗̒̀̽̍͗́͋̔͆̎͊̊͌͑̾̈̂̑̿͆͛̅̒̇̈́̆́̉͊̆͐̀̋̊͛̌͌̈́͑̿̓̐̈́̅͌̑̅̒͋̒̈́̈́̃̈́̃̂̍̐̏̾͒̀̉̌̀́̂͐̌̒̇̉̅͗̓̈́̽̍̇̂̉̅̿̒̓̾͂̾̿̈́̂̔͋̆̈́̈͌̃̍̈́̎̈̑͆̅̓͗͆͋̈́̂̀́̏͑̃̂̍̐̃͆̓̕̕̕̕̕̕͘̕͘̕̕͘͘͜͜͜͜͝͠͝͝͝͝͝͠͝͝͝͝͝ͅͅͅi̵̢̧̢̨̢̨̧̛̛̛̥̣͕̤̤̥̺̪̝͖̫̪̻̠̲̹̞̟͖̲͕͓̝̲͉͇̙̻̞̤̩̟̣͈̜̞͈̠͇͈͍̜͔̙̦͚͔̣̙̪͙̩̝̮͇̪͙͉͖̪͈͖͖̳̗̯̠͉̭̋͗̄̾̂͆̆̐͛͗́͆͌̃̉̂̋̓̇͑̈́̓̊̀̂͆̒̾͛͗̉̌̍̅̑̀͊͑͛̐͋͆̽̎̑̂̎͑̑̌̓́̈́̒̂͌͛͐̐̿̽̈́̐̀́͆̐̌͊͊́͒̌̂͑̏̔̎͂̍̏͑̇̍̑͊͊̀̂͂̈́̎̅̔̍̅̑̅̽̃͑͒͗̿̑̔̒̑͋͂̂̑̍̄̇͒̐̌̽̀͊̔̊͋͒̾̂̿̏́̀̃̇͐̔̈́́̊̽̄̉̅̓̈̾̀̓̄͂͛̂́̍̉͆͂̓̀̂̓̎̉̎̔̓̐̂̂́̌̕̚̕̕̚̚͘͘͘̚̕̚̚͘͘̚͜͜͝͝͝͝͝͝͝͝͝͝͠ͅͅͅx̶̢̨̢̧̧̧̨̧̧̢̧̧̨̛̛̛̛̛̛̮͎̜̳̻͕̥̰͇̺̝̤͖̬̲͓̫̗͇͎̻̯͍͙̺͉̱͔̤̫̻͚̣̹̥̰̼̫̱̫͖̱̙͓̭̞͇̪̯̘̠̯̩͙͕̙̼̣̪̻̻̥̹͍̹̭̫͓̱̻̖̮̹̮̥̥͕̲͉̝͈̥̗̪̥͚͚͚͕̺̠̹͔̫̤̰̘̯͕̳͈̭͖̣͖̹͖̩̼͙̯̭̣͈̣͇͈̘̫̖̠̞͍̬̫̲̳̻̹̱̳̞͙͔̠̱͕̮̯͉̩̪͎̯̪̻̜͒̇̋̂̋̽͗̔́̐̂̂̾͆̑͗̏̐̈́̃͐̊͌̓̓̐̌̈̇̽̋͛̐͋̄̏͑͋̿̿͆̈́̐̾̈́͗͌́͑́͗̍͒̌̒̅̇͌̽̊̈́̾̒͒͒͆̅̾͌̑͛͑͒́̍̉̏̊́͂̌̇̔͛̾̾̓̽̑̌̾̏̔͋̾̈̊̑̎͋̈́̄̾̄̅͋͐̿̆̋̈̄̐͊̆͋̋̽̂̌́͆͆̎̇̄̃͊̈́̉̔̍̓͆͑̃̋͂̀̉̏̉̓͊̽́͊̓̈́͑̂̑̎̉́̈̈̋̂̈́̒̽̓̑̐́̇͒̊̿̎̔̑͊̿̈̀̈̅̈́̑̊͒̎̏̄͆̈́̇̄́̈́̑̓͗̒̃͒̀̈́̅́̑͑̂̃̂̿̆͌̎͆͌͋̅͑͋͊̈́̓̾̂̏̀̾̔̅̐́̏̓̈͊͋̇͐̅̽͌̂̀̓̏̒̿͌̿͗͗̎̾̀̈́̓̈́̊̚̚͘̚̚̚̚̚͘̕̚̚̚͘̚͜͜͜͜͜͜͜͠͝͝͝͠͝͝͝͠͝͠͝͝͠͝͝͠͝ͅͅͅͅͅͅͅͅ ̸̡̨̧̢̧̢̢̨̧̢̡̢̧̧̨̡̧̨̛̪̜̼̟̤͚̯͓̪̦̥͎̯͕̟͍͚̼̩̩̤̖̥̤̤̳̻͕̼̣͍̜͙̙̭͙̗͇̣͎̦̭͔͙̥̯̬̭̯̞̼͓̳͙͉̲͍͚̲̺͕͕̟̼̻͇͔̺̼͙̦̣̝̖͍̻͍͎̣̹̻̯̲̗̝̤̞̗͍̭̮̮͕̣̗͋̅́̍̍͌̉̊̃̓̓̂̈́͐̓̇̉̋͋̅̊̔͆͗̅̑̓̀̂̍̆̈́̈́̉̃̃̾̏̀͗́̒̌̈͌̅̿̏͆͒̌̀͛̓̐̋̾̀̈́́̾̇̈́̿̀̈́̊́́͛̽̀͌̔̈͆̉͌͋̑̌̈́̽̈́̉̀͛̓͋͗̚͘̚̚͜͜͜͠͝͝͝͠͝͠͠ͅT̴̢̢̡̢̨̡̧̡̢̧̧̡̡̡̨̨̛̛̛̛̛͖̻̯̼̗̫͕̥̝̦̹̪̙̖̩̯̮̦̗̤͚͙͙̬̣̙͈̥͓̬̰̗̤̞͖̞̪̣͎̬͈̹͕͔̦̤̙̝̣̗̜̘͎͙͕͇̟̟̠̮̹̪͖̟͎̼̯̻̮̭͕̬̖͖̼̺̟̠̫̳̖̜̳̖͕̫͔̺̼̯̫̯̫̘̙͔̰͍͎̜̭͎̖͎͚̬̘͔̯̞̝̞̜̣̥̼̙͔̤̦̭̲͍̝̩̼̦̣͇̘̟̦̳͚͔͔̟̣̼̺͎̮̟̖̠̞̗͍̪̯̠̱̭̬̰͍͓̝̲̯̙̭̯̤͕͓̲̹̣̼̦̳̝̞̰͔͍͂̿̓̔͗͌̋̆̓̋̈́̽͑͒̓̈̎̇͗͂̒͐̅̽͗͂̂̇̓̀̍̈́͗̐͂̇̇̽͑̾̏̊̑̓̋̒̒̿͐̐̿̓̅͋̑̋͛͋͗͌̌̑͂̐̏̇̽̑͛̓͗̓̃̂̈́͛̈́̆̌̆̓̋̆̏̊̾́͊̀̐͛̿̅̃̑͑̔̀͂̾̇͑̿̎̐͌͌͌̿̈̽̃́̃̆̆̈̋͑͊̍̈͛͊̐̐̀̍́͊̿̂̌͗͑̃̐̍̊̐̑̈́͛̔̏́̋̈́̑̔͆̎͋̏̒͗̍͗̋͑͂͑̐̑̏̿̃̅͆͒̽̈́͋̋̀̈́̽̑͗̂̿̑̓͐́̊͋̾̄͑̂͐͗̓͛͆̀̏̈́̊́̈́̍̈́̽̂̊̈́̆͊͗̽̈́̓͊̂̅́͗͌́̾̑̀̊͋̀͘̚̚͘̕̚͘̕̚̕̕̕̚̚͘̕͘̚̚͘͜͜͜͜͜͜͜͝͠͠͠͠͝͠͝͠͝͝͝͝͝͠͠͝͝ͅͅͅͅͅͅḧ̵̢̨̨̡̢̡̡̢̡̨̧̡̨̡̢̧̧̨̨̧̢̨̛̛̛̛̛̛̹̞̥͇̘̰̭͖͙͖̥̙̗̹̘͔̞̬̟̠͓͔̪͇̗͈̠̭̱̘̘͎̲̭̼̯̺̘̤̖̲̜̪͔̻̘͕̞͙̜̻͙̦̞̰͉͓̖̞̖͇̺̗̜̩̩̪̺̣̹̺̥͇̘͍͎̫̦͇̻͓̲̗̼͖̙͍̪̙͉̬͓̝̹̳͈̠͎̤̥̯̩̬͙̫̮͕̦͕̻̫̞̙̲͈̤͉͙̤͔̰̗̜̲̹͔̫͈̜̲̦̮͎̗͔̥̤̣̯͈̲͇̝͎͔̺̙̗̲̫̭̟̓̏͋̎̑̂̈́̀̄̉̾͋̍̒̑́̐̈͊͗͊̾̾͛̽̎̊͒̑̈́̀̑͌̌͗̑͋̍̔̎̍͋͗͂́̌̆̏͊͌͒͐͊̈́́͋̈́̒̅͒́̓̉̓́͌̐̓̎̀͂̄̉͌͂̍̌̒́̌͌̃̀̇̂̒̓́́́̃̾̉́̒̆̈̒͒̌͛͋̋̂̒̈͊͐̀͐̾͐̄͋͌̈̐̓͑̍̅͋́̀͂͛͐̉̿͒͌̈́̅̈́̆̉͊̑͊̈́͒͐̌̆́̈́̔͐͋́͐́̆͌͂͂͗̀̋͊̎̏̑̑͛͋̈́̌̿̾̂͋́̅͂̌͌̅́̄͌̎̇͋̾̀̓̀̑̚̕͘̕͘̕̕͘̕̕͜͜͜͠͝͝͝͝͝͝͝͝͝͠͝͠͝͝͠͠͠͠͝͝ͅͅͅͅͅȩ̸̢̢̡̧̨̡̡̨̨̡̛̛̛̛̛̩̪̫̲̣̹̦̝̠̺̬͖̥̬̝̞̥̦̣̤͍̘͈͉̤̘̬͉̖̫̼̘̬͕̗̲̞̟͈͖̥͖̞͔̞̣̘̙̙͖̱̮̙͉̬̤͎̲̙̦̲̱̹͓͉͕̞̰̳̤̰͍̠̻͕̥̺͙̹͇̳͈̻͌́́̀̋͂͒͗̉̏̌̆̒͒͆͒͋͌̀͒͆̂̔́̈̈́͂̾͂̓͗̓͒̆͋̏͛͒̐̈́̋̐̈́͛̉́͆̅͆̾̂̉̄͊̓͆̊͑͐̔̒͂̒̏̆̀̌̉̓̃̔̈̓͛͗̍́̀̉̅͌̀͋͋̒̿̍̒̍̈́̆̐̐͋͆̉̆͒͑̉̅͂̓̿͛́̌͊̍̊̽̽́̓̈́̿̍͑̔́̑̆͗̎͛̅̐̿̑͆͌̉̓̊̑̈́̋́̎̇͂͒̑̇̾͆͘̚͘̕̕̕̕͘͝͠͠͝͝͝ͅͅͅ ̴̡̡̨̨̧̧̢̡̧̡̡̢̡̡̢̡̨̧̧̡̢̛̛̛̛͔̝̦͉̜̭̹̫͕̻̫̳̩̰̖̤̮̮̬̱̖̱͕͙̲̹̞͎͚̻͎͎̜̗̻̪̥̥͈̖͖̖̗͎̖̼̺͖̫̪͙̻͚̱͙͚̤̞̮̯͉̲̰̼̥̙͔̱̹̭̗͙͖̥̥͕̙͎̖̮̼̤̻̙̟̹̣̞̼̫̗̳͇̖̮͍̪̹̞̦̙̹̮̭̫͍̭̹̯̗͍̣͕̱̭͓̩̗̭͍̰̱̦̮̤͓̲̮̞̖̘̲͚̗̜̲̯̱̠͍̠̺̰̳̙͎͉͉̟̮̲̩̖̤͙̰̖̙̤̹͙̭͎̹̺͙̼̠̻͉̯̪̪̫̳̰͇̘̣̻̪̙̗̠̝̤̩̤̣͚̦̹͖͚͖̜̳̦̝̺̳̻̼̩̹͖̥̞̗̥̩̱͐̓̂̊́̄̃̈́̏͋̿̿͂̐̎̈́͊̈̌͒̇͐͊̆̽̅̔̓̎̃̀͗̾̓͋͆̃̌̀̾̋̽̇͛̿̀͒̄́̉́̀̉͛̅̎̀̽͋͑͋͗̊̀͋̾͛̈́̇̐̓̏̄̂̅͘͘̚̚͘̕̕͘͜͠͠͠͝͠͝͝͝ͅͅB̴̨̧̨̢̡̨̨̨̡̨̧̡̡̢̢̡̡̛̛̲͕̹̠̮̠͖͇̮̩̰͎̱͕̳͈̱̫̹̮̗̠̙͓̮̖̻̫̟̣̗͕̫͇̗̥͔͔̩̳̥͙͔͙̥̻͙͉̣̯̮̰̩̹̼͎͓̜͈̜̖̰̣̹͕͚͔̜̹̭̗̖͍̪͔̙̭͖̹̹̮̜̮̤̜͔̜̺͕̮̯̦̣̱̖͍̭͎̦̣͎͔͚̙̩͇͓̫͎̼̻͖̼̮͖͓̼͈̞̘̤͇͈̺̞̗͔̩̮̪̱̠̬̼̺̬̲̤̖͕͍̣̤̦̘̻̹̠̘͖̥̜̮̤̰̬̖͈̤̀̈́̉̇̑̇̈̄̑̀͊̓̈́͌̾̀͊̾̀͆͑́̂͛̋̓̅͌̆̓̌̇̈͒̾̾̽̇̈̅͛̐͊̓̉̌͂̂̅͗̆͛̀̋͋̂̌͛̈͌͊͆̀͐̊̑͒̃͂̌̾̏̂͛̉͌̉̄̈́̄̀̈́̉̌͋̈́̅̀̐̀̾̈́̓̽͑̃̏͒̄̓̍̌́̀̿̐̿͒̈́̌̃̏̈́̏̈́̅͗̂̾́̆͌̏͒́̈́́̑̾̆͒̄̓̈́́̈́̀̇̒̒͋̇̈̔́̀̽̎͌̎̌̊̚̚̚͘̚̚̚̕̕͘͜͜͜͜͝͠͝͝͝͝͠͠͝͠͠͠͝͠͝͠͠͠ͅͅͅͅư̵̢̧̡̨̡̢̡̧̨̢̧̡̡̨̡̛̛̛̛̛̭̮͕̳̜̬̠̟͎͎̘̜̹̣̥̦͎̰̺̼̹̣͕̰̖͔̣̳͉͙͚̫͎̹̫͍̟̫̺͈̫͔̺̗̬̖̳̖̯͖̲̤̦̙̹̠̬̭̺̥̲̦͇̳͖̤͖͉̮͉͇̟͍͔̟͍͕͍͕̙̱̘̜̺̲̠̞̹̟͚̦͈̘̦̼̠̟̳̳̝͎̟̟̣̮̙͚̱̱̝͈̭͍̟͐̑͋̍̂̆͂̓̽̈́́̈́̑̅͊̔͑͐̓͋͆̄̅̔͒̇̋̒̓́̏̀̉̒̀̿̐̈́͗̃̏̅̾͊͗̎̏̀͆̄̈́̇̈̔̔̏̇́̀̈́̒͐̑̏̾̌̐̉̒̏̏͌̄̒̇̍̃̊̏̅̓̃͐͗̓̽̌͌͌̌̓̑̓́̂̽̓͛̂̀͌̾̄͆̀̅̌̒̆͗̐̊͆͒̀̔͆̔̏̀͒̍͋̀̅͛̒̂͂̅̉͋̿̿͌͛̍͗͑́̀̃̀̏͋̃̓̿̆̈́͘̚͘̕͘͘͘̕̚͜͜͠͝͠͝͝͝͝͝͠͝͝͠ͅͅͅį̵̛̛̛̲̫̯̟͔͖̟͇̦̠͓̘̪̻͋̾̀̿̌̀̑̿̍̈́͋̒̔̄̑̏̄̏̒͐͋̏̍̏̋̈́̃́̇̋̀̃̆̈́͒̒̅͑̈́͑̈̾̌̀̒̾̈́̊͂̅͋̃̽̃̑͋̄̍̎̑̃͒̐͂̋̊͒̌̋͌̈́̂̇̋̑͆̄͒̀͑̿͐͗̈͑̈̇̓̇̈́͋̌̄̉̂̀̀̈́̀͂̆̆͗̋̄̅̈́̔́̀̂̾̇̊͗̿͊̀̋̾̎͐̑̉͛̉̓̾̐͌̊̆̍͆̈́̆͊͂́͊̒̀͆́̌̋̾͛̈́̾̍͋̍̉͛̽̽͆̊̀̄͗̃͒͆̐̓̈͐̔̓̅̓͌̋̕̚̚̕͘̕̚̕͘̚̚͘͜͝͝͝͝͠͝͠͝͝͝͠͝͝͝͠͝͠͝͝l̸̢̨̨̧̢̢̨̡̧̧̨̢̡̢̡̡̡̢̡̡̡̨̨̛̛̛̝̰̜͎̹͉͔͓̹̱̞̥̦̘̯̩̣͈̤̙̘͈̗͖̺͇̳͙͔̩̯̱͍̱̝͖̮̭̼̬̬̙̘̜̼͉̺͔͔͇̜͖̞͔̱̱̱̘̝̦̻̘͚̤̤͈̞̟̟͚̠̯̪͖͉͖̪͔̻̖͍͖̘̟͖̳̦̻͖̮͍̬̥͚̼͔̩̯̳̯̗͚̭͚̤̩͖͍̱̻̮̦͈̪̱̹͇̬͕͉̬̦̝̜̳̣͉̘̑͐͐̅́̾͌̄͋̋̀̊͒̓̅̑̿͑͗͌̃̈́́̑̔̀̑͆͛̆̐͛͊͆̍̐͋̔̋͋̈͗̃̃̓͊̀̆͆͒̀̑̒̃́̅̆̒̈́̽̈́̒̽͌̐̌́̓̽̾͑̓̅̂̇̐̊̈́̏̾̾̀̉͒̃̾͛͐͊͆̇͌̅̈́̔͛͐̄̈̊̓̋̈́̾͑̈́̀̆̎͑́͊̀̎̐͌̋̋̅͒̒͆͋́́̈́̏̔̾͋͂̄̕̚̕̚͜͜͜͜͝͝͝͝͝͠͠͝͠͠ͅͅd̴̢̢̡̛̛̛̛̛̛̛̛̪͔̖͇͚͓̩̪͔̜͓̣͍̫̳̺̳͇̖͖̟͉̹̟̪̫̖̜̩͙̗͕̳̹̥̭̩̙̹͔͙̟͔̥̰̙̆̂̈́̍̔̌̈́̃̿̒̏̓͐͆̎̎́͗̈̽͌̆̆̑͂͛̃̆̈́͗̇͐̿̈́͒̽̌͗̾̌̐̓̈́̽͗̾̇̑̔̂́̓̓͛͋̏́̏̑̓̍̑̓̃̂̀̀̏̆͋̉̇̀͂͗̄͐̊̈̓͊̈́̽͑́̽̅̽̓̑̈́̂̈́͋́͗̑̇͋̒̋̎͛̈́̿̃̔̐͂̍̀̃̔̀̏͂̅͋̆͆̇͒̈́̾̽͂̎͊̀̄͛́́͋̉͗̓͒͌̈́̏͑̆͒̏̓̃̓͐̏̈́̋͛́́̂̈́̓̋̐̅̏͗̓̓̅͋̔́͋̏͑̑̀̓͐͒͌̀͛̔̐̓̈́̉̈̈́̍̋̄̈́͋̇̆͑̂͗̾̂̒̉̍̈̐̐͑͑̂̾͋̀̐͆̔̌̆̍̽̅͆̓͋̀̽̔̈̽̀̃͑̉̂̈̄͆̌͗̃̎̈́̇̓̍̈́̌̃̋̚̚̕̕̕̕̚̕̕̕͘̕͘̕̕̚̚̚̕̕͘͜͠͝͝͝͝͝͠͝͝͝͠͝͝͝͠͠͝͝͝͠͠͝ͅ ̵̡̨̨̧̨̧̧̨̛̛̛̪͍͖̜̟̫̬͚̦̮̪͚͓͈͙͕̺̮̬͍̯̼̞̤̙̬͚͚̖̳̹̙̤̦͙̖̼̜̫̟̘̺͖͖̰̗̦͔̫̟̗̞̹͇̣͕̫͇͔̪̬̯̩̥̭̗̫̤͉̖̻̳͔͎̤̪̻̜̦̬̫̩̟͚̺̼̩͎̖͚̩̫͖̰͐͋͑̎̎́̊͒̈́͗͆͗͑̀͌̐̎͂̑̏̾̈̈́̈́̃͌́̄̈̿̍̊͊̉̇̀̾͌͐̐̄̐̂̈́̏̒̈̀̀̎̊͋͐̈̏̅̾̈̎̆̂̍̅̈̀͌̒͌̈́̇͑̇͌͂̅̈́͐́̇͌̓͊͑̃͐̓̉̈́̊̒̀̎̔̾̉̌̓̊͌̓͋͒̏̒̀̈́͒́̓̂̂̌̄̈́̀̊̐̈́͂̓̈́͊͛̃̾̈̿̆̿̍̔̈́̽͌̊̅͆̎̊͑̉́͛̌͑̏̒̈́̈̍̔̿̊̀̂̊̾̌̃́̈̈́̐̃͆̽̒̅͊̓̿́͋̀͊́̂̍̿̐̀͋̀̂̈͑̄̍̔͌́̆͑̑̎̌̊̈́͊̿̈́́̂̇̉̋̆̌̕͘͘͘͘̚͘͘̕̚̚̕̕͜͜͜͝͠͝͠͝͝͠͝͝͝͝͠ͅͅ(̴̢̧̡̧̛̘̭̗̥̙͉̮̯͉̦̯̦̫̙̹͚̜̜̥͙̰̯͇̖̩̼̲̙͚̣͍̳̲̬͖̜̼͙̤͓̫̟̺̻̹̲̖̗̺̥̫̘͓̻̗͎̪͎̖̩̩̦̦͈̣̣̺͉̺̥͎̠̯̦͚̝͈̬̲̭̻͍͚̲̯̍̈́̈͊̾͗̊̀̓͌͌̒̎́̒̎́̅̓̅̅̈́͆̃̄̊̊́͂͒̈́̒̉̓̓̾͗̑̔̐̈́̇͗͐̈́́̅̈̄̓̓̎́̓̂̋͆̈́̂̑̑̽̈́͆͛̒̅̑̊̋̔́̎͂̈̔͋̈́̃̀̑̒̍̆̌̎͋̀͒͒͊̈̂͐̈́̽̀͌̆͐͌̈́͆͂̆̐̓͂̈̌̀́͐̑̅̋̈͐̽̂̐̇̏̐͐̄̅̔̚͘̚̚̚͘̚̕͜͜͜͝͝͝͝͠͝͠͠͝ͅͅH̵̡̢̡̧̛̛͖̤͈̣̺͉̳͈̖̜̘͖̪̼̣͇̮̜́̆̐͌̓͗̾̇̈́̏̎̊̋͑̍̌̒̉̐̐̄̓͂̽̐̅̑̀̅͗̅̀̓̓͐̅̌̉͛̀̐̓̈́̔͌̉͌̽̉͆̿̊͊̓̈́͋̓̀̇̓̂̒̓̉̀̆̊͛͆̽̽͐͐͛̇́́̀̐̓̄̾̉̎͋̑̿̐͋́́͐̿̈́̍͋͂͑̀̒͛͋̐́̿͛̓̋̏̓̓̋̎̽̉̔̈́̓̒͋͐̄͗̈̊̀̇̑͋͒̾͊̈̄́̽͘̕̕͘̕̕͘̚̚̕̚͘̚͜͠͝͝͝͠͝ͅǫ̵̡̢̨̧̧̧̨̨̧̨̧̨̡̧̧̧̨̡̧̡̨̨̡̛̛̛̛̫͇͓̗̠͈̬̼̖̗̤͕͈̠̙̼͕̪̮̜̠̻̲̺̯̣͎͙̥̯̖̳̤̞̮̞͕̭̮͓̻͕͖̝͈̟̰̱̪̤̣̰̤͉̠̰͚͇̼̯̫͍̣͚͎̭͙͍̱̳̪͈̞͈̹͚̲̞͔̙̪̞̗͈̩̹͇̠͇̩̲̟̳̖̻͍̤̜̙̜̥̪͕̤͔̮̤̗̜̪̺̺̙͕̜̞̘̳̪̹̰̺̠̩̻̤̤͍̦͚͖̩̟̖̻͕͇͕͇̲̘͎͈̪̬̜̻̜͓͓͚̮̠͚̠̼̳͎̖̜̣̘̙̹͓̮̗͕̟̭̘͉̥̩̳̱͚̣̣̱̗̩̭̦̗̦̞̦̱͙͍̰̟̱̩̠͖̮̟̱͖̰͈̖̺̣̮̗͇̦̣̬͓̳͙̰͉̖̹͖̜̫̭̥̗̦͍̘̫̯̯̗̼̩̮̟͔͖͍̞̽̅̓́̈̀̂͛̈̑̂͋̒̆̌͂̀̎̋̋͌̌́̀̌͊͊̏͋̃́̋́̈̎̎̒̌́̒͋̾̈́͊̃̃́̍͛̄̾̐̆̅͐͗͒́͋͛̌̅́͌̀́͒̇̔͂̌͗̐͛̽̀̀͗̾̂͂̃̈̐͋̒͐̐͗͗̍̿̏̀̈̾́͌̔͌̃̅̄̀̈̂̍͒̈͊̂̾́̈̋̈́͌̐͊̈̓́̒̓́̍͊̾̾̂͂̍́͌͛̆͐̓̈́́̽́̂̂͗͛͌͆̀̍̑̊̿̋̏͛͗̍̀̆͆̀̐̈́̀̒̎̐́̽͊̃̏͊͊̋͒͆̈̅̀͒̕̚̕̕͘̚̕͘͘̕̕̕͜͜͜͜͜͜͜͜͝͠͝͝͠͝͝͝͝͝͝͝͝͠͠͝͠͠ͅͅͅͅͅp̵̧̢̧̢̨̛̛̛̝̻̗̳̝̜͈̖͎̠̩̳̝̺͕̫̯͖̱͙̦̦͚͕̘̖̺̠̠̩͙̜̪͇̼̺̖̆̎̾̽̑̉̽͐͒͌͌͐̀́̿͗͊̒̇̿̇͛͂̀̊͆̈́̂́̒͑͛͂̇̃̑̉̈́͊̈́̌͌̽́́̃͊̂̓̓̐̽̊͌̈̈́͌͑͛̍͂̏͑̎̉̀̍̾͒͂̉̉͊̇͌̓̈́̀̅̇́̿͌̈́̉̂͌͌̐͑̐̐́̔̽̋̀̔͗̽͑̏̊̔̈̀͗̈̓̒̍̏͑̒͑̉̆̊̈́̈́̈́̈́̈́̓̈́̎̾̈́̂̆̊̆̏̀̄͐͒̉̈̈́̚̚̕͘͘̚̚̕͘͠͠͝͠͝͝͠ͅͅę̷̧̡̢̨̢̨̧̢̢̡̛̛̛̛̛͚̩̙̠͇͕̲͇̗͕̤͓̘͚̬̣͖̞͖̬̪͕̼̪͈̺̙̼̳̩̰̪̥̭̼̠̩͓̗͉͖̦͎̮̱̰̺̙̯̯̺̣̲͙͉̘͍͇͕̻͉͇͕̪̥̳̦̼̜̥̟̖͚͖̼͎̦̺̖̲̯͍͓̯̣̪͓̝͉̦̗̬̦̩̜͎͉̗̗͍̜͓͚̲̤̩̖̳͖͔̜̝̰͕̹̻̤̖̮͎͎̱͉̮̗͕̙̞̘͎̰͎̣̗̼̬̻͓̺̬̟̬͓̥͉̱̖̤̣͕̰̱́̾̎̉͆̆̀͛̈́̉͐̅̆̋̾̌̋́̅̊͂̀͒̓̿̆͊͐̈́̐́̎̃̔͆̈́̒̒̋̓̓̐̽̔̌̈͒͒̐̀͊̇͂͂̈̓͊̽̎̅̐̈̔̒̌̅͑̒͗̔́͛̃̈́̊͛̈́̾̅̓͑͗͐̀̌̇̈̾͌̌̄̃̈́̐͗̅̈́̈́̾̈́̓̊̃̿̆̀͐̒͆̃̂̀͗̈̈̍̿͒̉̉̒̅̇̅̄͌͂̀͋̑͂̍̊̔̌͌̈́̓̄̋̔̃̍̿͑̉̿̾̍̄͛̈̀̇̐́̅̈́͆̎̈́̂̽̂̑̏̃̏͂͌́͌́̿̀̒̂́̅́̓͂̂̈́͋̏̇́̈́̄̽̉͛̂̽̀̈̍̀̀̐̉͌̇̑̓̆̇̍̄̐̊́̅̊̈́̿̀̍̑́̇̾͒͌͂̎͆͐͗̆̇̇̄̅̀͘͘̚̚̚͘̕̚̕̕̚̚̕̚͘̚̕̚͘̚͜͜͜͜͝͝͠͠͝͠͠͝͝͝͝͠͝͝͠͠ͅͅͅͅͅf̸̢̡̡̨̢̢̢̡̧̢̢̡̢̢̨̡̢̢̢̨̢̧̧̨̛̛̛̛̛̤̭͖͇̯͍̣̜̖̟̭̭͍̰͙̯̥̱͕̤͕͇̯̩̫͈̯͚̗͇̘̦̠̦̻̟̗̳̩̥̜̱͓̬̺̦̭̥͕̖̪̻͖̳̭̮̠̘̜͈͙̤͉͚̬̞̲̳͖̦̯̞͚̜̘̯̭̥̹̯͕̱̞͙̝̳̗̰͓͙̲͇̹͍͚̣̺̮̖̤͇͉̫͉͙͇̺̦̳͉̟̫̘̹̦̮͈̟͕̫͚̤̫̱̙͍̫̲͎̪̙͔̣̮̺͉̳̫̪͇̹̜̹̺͍̟̜̼̩͇̮͍͙͙̫͕̳̣͖̬̟͓̙̗̟̪͖͕̜̰̳̼̱͈̳̩͓͙͍̖̼͔͔̬̼͓͖̯͉͖͎̻̘͙̤̯͇̠̗͈̦̈́́̐͂̀̐̆̌̇̂̊̑̅̈͐̆͗̒̑͋̅͊͂͛̀́͐̌̍͐͆̋́̏̍̓̒̎̎̍̉͂͐̐͗̀͒͆̈́͆͋̈̍̐̆̿̔̉́̀̾̃͂͗͑̋̈́̽͆͋̽̔̔͛̈̊̿̔͗̂͛͗̉̈́̉̀͊̓̒̆̔́̓̐̎̀̂͌̎̈́̀̓̀͒̈́͑͒̿̏̑͒̉̍͗̓̌̋̋͗̈̿̇̐̈́̇̍̂̓̊́̊̈́̈́̒͋̈́͆͋̽̔̓̅͂̇̽͑̃̅̀̓͗̌̐͛̓̊̀̉͛̽̅͒̌̀́̽̋̄̈̏̽̕̕̕̚̚̚̕͘̕̕͘̕͘̕͘͜͜͜͜͜͜͜͠͠͝͝͝͠͝͠͝͠͝͝͝͝͠͝͝͝͝͝ͅͅͅͅͅͅͅͅͅͅų̷̡̨̡̡̡̫̣̜̬̮͇͖̙͎͖̣͙̻̹̼̭̣̜͉̥̩͚̩̲̼̼̩̣̳͓̣͎̩̼͔̬̤̣̩̘̤̱̟̭̘̙̪̫̞͕̘̤̩̥̹̣̱̾̌͂͊̋̃̒͗́͊̈͑̒͋͘͜͠ͅͅl̸̢̢̨̡̢̡̧̡̛̛̛̛̛̛̛̛̥̯̳̬̥̺͙̰͎̭̞̘̫̼͉̫̜͖͕͔͚͇̯̮̪͖͓̥̺̦̟̪̠̣̻̣̗͖̻̲͚̮͕͈̹̺̣̮̣̘̠̜̻̘̬̹̘̠̼̳̬͕͍͇͉̲̞̪̦̰͚̘̙̺̫̻͎̦̟̹̣̠͍̭̗̖̤̫̣̣̞̱̦͇̫͚͚͇͖̯̬̤͕̪͇͈̳̠̣̻͍͖̼̹̱͕̹̟̀͂̎̈́̑͋͋̇͊͛͑̎̈̐͌͆̐̊̀̅̂̾̄͛̐̽̔́̏̀̈́̿͆̇͊̓̎̈̎̎͐̈̾̌̄̐̃̋̈̇̅͗̑̊̈́̽̌̃̈́̽̋̊̆̅̽̍̔̇̉̒̊͂́̇̃̒͆͊̌̓͌̅͊̄͆̅̂̈́͆̄̈̀̊͗̎̉͌̿͛́̂̌̊̎̎͒͊͛͗̍̀̋́̇̎͛̈́͂͐̂̆͒̈̆̑͐̾͗̆̊͐͊́̓̔͐̅̋̐̈͆͐̓̆̑̑̌̄͋̿̀͋͋̽̄͒̾͌̅͛͊̒͌͂̎̃͌̇̃̿͆̉̇͂̀͆͗̎̊͌́̀͗̽̚͘̚͘̕͘̚̕̚̚̕̚̚̕̕̕̕̚͜͜͜͠͝͝͝͝͠͝͝͠͠͝͝͠͠͝ͅͅl̶̡̧̧̧̧̡̡̨̨̨̢̢̢̡̧̨̢̧̨̡̨̡̢̛̜̳̩̪͈̰̣̤͓̙͔̗̣̗̹͉̞͉̠͖̪̭̗̲̰͇̠̱̯̟͖̯̝̠̳͍̬̳̬͔̠̟͍̬͓̜̪̭͚̟̝̺̫̩͈̩̼͕̘̜͔̹͇͙͍̪̪͔͇̩̠̟̲̝͕̖̥̣̣͕̮̣̤̙̥̼̫͓͍̥̘̩͍̯̺͍̪̠̮̟͔̠̟̮̣̞̻̥̠̯̣̯̮̬̘̦̖̝̩̥̝̪̫̱͍̥̺͙̺̹̱̤͇͕̜̻̮̞̫͖̠̳͚̪̘̖̟̭͔͙͈̜̟̰͖̪͚̖̤͕͓̘̮͚̼̰̜̺̪͖̥̠̮̯͉̙͕̹̙̲͈̫̮͓͍̣̥̥͉̹͎̥̣̫͉̞͍̲͔̣̰̳̠͈̤̣͔̠̥̥̓̆̊͋̔̆͋̊̾̃͒̉̀͛̾̍̃̋̈́̎̚͜͜͜͜͜͜͜͝ͅy̴̨̢̡̧̧̢̨̡̛̭̲͎̜̯̪̳͔͔̳̳̠͚̼͙̰̥͙̟̳͈͚͚͚̟̜̥̣̠͇̳̬͍͔͚͕͙͇͍͈͎̖̟̭̝͈͈͔͍̞͈͈͉̮̙̥͖̖̣̤͈̘̲͈͆͒͊̄̓̓͆́͛̇̍́͂́̒̿̈́͐̄̀̽͗̅̑̀͆̊̀͋̀͐̆̒͌͑̀̃͗͑̀̔̌͆̓͛̾̌̂̃̓̃̓͂̀͋̆͊̊͌̊̈́͋͐͆̾͐͛̏̏͂̀̀͐͋̇̎͗̑͛̅́́̈́̊͆̑̽̀͗̂͂̇́̎̈́̎̎́̌͐̋͋̑̎̀̐̐̐̀̉̈́̍̅̌̀̑̊̈́̍̏̾̀̊̐͊̄̅̌̅̈́̑̔̒̌̈́̄͆͒̇̒̍̓͊̀̎́̐̎̎̓̉̋̉̍̾̏͗̾̿̓̎̾̏͊̆̓̋̽̊̉̐̈̔́̈́̿͌͐̓̄̽́̓͒̀̃̀̄̇͒́̅̀̊̓̌̅͌͒̓̀̀͗̂̓̆̇͒̂̇͗̿̉́̃̉̈́͌͊̔́̽̍́̓̇̽̓̅̏̒̍̚̕͘̕̚̚̚̚͘͘͘͘͜͝͝͠͠͠͝͠͠͝͠͠͝͠͝͝͝͝͝͠͝͠͝͝ͅͅͅ)̴̨̧̡̢̢̢̢̡̡̨̢̧̢̨̨̡̡̧̰̠̣̤͕͕̳͓̲͉͎̮̳̼̟͇̲̳̺̳͚̟̙̫͈̱̮̲͈̬͓̝͙͖̝͚͕̟͎͎̪̱̹̗̼̹͙̫̰̬̮̥̦̻̪͍̮̝͓̪̤̜̹̹̝̻͓̠̗̪͚̜̭̝͉̜̣͈̹͉̪͎̜͙̗̫̺̘͙̘̼̜͕̰̠̟̮͓̳͚̬̝̼͖͕̘͚̱̜͓͉͉̮̟͕̰̮̩̬̩͓̪͓̪͓͎̻̲̙͉͚̺̻̩̮̟̬̗̖̩̝̮͖͖̺̩̝̙͓̜̪̺̩͚͓͕̙̭̯͇̪̣̭̦̼̥̥̱͔̹̤̝̗͉̙͖͕͈̪̟̗̟̞̣͖̤̪̮̹͈̰̱̬͔̗͓̫͎̦͍̬̭̲̩͉͍̺̱͇̻̟̥̞̼̫̜̯̮̗̣͙͈͛̒͋̿̾̃̾͐̓̓̌̇́̋̀͒̂͌̓͋́̂̓͜͝͝͝͝ͅͅͅͅͅ ̶̧̧̨̧̧̨̨̛̛̗̘̝̼̙͍̖̗̼̪̠͙̜̺̰̼͖̬͉̥̺͔̖͖̯̜̬͕̖̭̭̭̯̖̝̜̱͉͕̩͚̥̪̥̮̼̦̫͓̣̱̬̖̼͓͚̳͇̗̞͚̞͖̗̳͎͉̠͚̥̝͔͈̬̖͔͍̠̗̟̥̳͕͍̺͙̖̯̯̗̙̼̘͇͖͚͍̩̱͈̙̫̻̝͉̤̻̼̪̯̈́̈́̌̀͂̈́͌̋͛͋̏̿̀́̈̿̄̀͛͆̑́́͑̑͑͛͌͊̕͘͜͜͜͜͜͝ͅͅͅͅͅ(̷̢̨̢̨̢̧̡̡̡̨̟̗̖̯͕̞̞̭̰̮̫̘͓̼͇̻̝͚̬̤̻̱̫͇̳̪̼̫̼͈̮̹̮̱̗̖͇̤̱̠͙̼͚̻̞̣̳͎̩͍̭̖̩̫̖̭̬̰͚̖͓̝̟̦̫͎̩̖̩̬̖̝̬̦͚̹̞̪̪͇̭̯̘̝̹̞͉̖̘̱̣̤̖͊͌͐̔̏͛̓͆͆͐̄̑̾̌̇̆̉̌̊͆̂̅͛̀̄̇̽̋͊͒͆̐̀̾̓̌̾̑͊̌̒͗̾̈͛̍͂̈̓͘͘͘͘͘̕̕͜͠͝͝͝ͅM̴̡̨̧̨̧̡̡̨̧̧̧̛̛̛̛̛̛̛̫͇̘̬̥͎̘͓͓̮̦̗̹̭̼̭̟̩̝̣͓͚̘̥͔̲͙͈̖̤͔̯͉͕̬̰͈͍̰̭͍̗͇̦̟̙͉̦͕͍̤̯̼̹͖̜͕͉͖͔̩̝̠̘̪̠͕̯̪̲̘̭͓̬̮̰̙̥̰̝͈͍̩̜͍̥̘̮̯̞̠̲̲̯̬̝̥͎͇̼̝͇̜̰̳̯̝͖̫̪͔̝͖̯̩͕͕̮̬̠͇̻̗͉͔̖̟̙̬̞̪͇͇̠͇͚̫̯̖̝̝̱͖͉̣̙͎̥̯̗̺̜̖̜̭͚͇͈͉̖͋̎͒̈́̍̄̊̈́̒̿͊̀̔͑̈͂̉̍͛̏͗̈́̐̃̐͂̀͊̊̑̈́͌͋͆̆̆̒͋̋̊͆͌͂̇̅̽̐̀̿͋͋̌͒̓͒̈́̾͂̂͗̔́̓̋̈́͑̏̎͛̊̈́̓͋͑͛͒̌́̀̀̽̈̌̍̀̆̋̌̇͆̀́́̊̿́́̎̀̇͛̌̊̆́̌͋̅͒͂͋͑̇͌͛̈́͌͗̀͂͑͂̄͐̿͌̈́̒̐̃̄̃͂͂͛̀͌̉̍͊͊͐̊̚͘̕̕̚̚̕̕͘̚̚̚͘͜͜͜͜͜͠͠͠͝͠͝͝͠͝͝͠͝͠͠ͅͅǎ̵̡̢̧̡̧̧̧̨̢̡̨̧̨̢̡̡̨̨̢̢̧̢̛̛̛̛̛̛̪̭͙̩̥͔̪̞̣̘̩͈͎̲̹͇̟̰̖͇̙̩̹̣͎̜͕̣̙͇̲̙͇̯̖̺̘͇̹̝̪̱̭͚̜̻̻̳̹͇̺̰̬̠̞͓̟̥̣͇̗̮͈̜͈̰̲͉̰̩̩̯̯̻̻̣͈͙̜̙͙̜̝̻̼̪̳͇̲̥̞͎͉͈̙̣͕̗̩̼͎̦̹͚̣̥̲͙̣̦̤̳̮̹͔̤̝̩̜̰̤̺͓̮͔͉̞͇̣̞̪̞̫̘̻̫͚̳̤̙̜̩̦͔̘̪̠̺̪̼̤̫͎͚̳̪̥̗̰͇̻̺͕̦͖͈̤̗̭̜͔̘̝͚͔̥̹̫̻̩͈̫͔͍̲̬̲̻̦̼̮̜͕̬͖̹͎͖̭̝͍͕͓̤͈̠̹̪̣̰̟̬̖͍͖͍̥̘̰̦͚̤̙͔͕̱͚̩̫̙̳̗̣̺͚̹̜͖͉̬͙͔̎̌̊͆̃̀͗͊̂̉͂̈̍̄̏͛̾͂̊̍͑̌͌̈́̈́͂̇̀̾̋̑͑̏̈́̅̐͑̑̂̈́̒͊̿̇̈́̅́̓̎̐͌̓̀̓̾͆̉̄̑̇̈̓̋́̿́̏̈́̽͗́͗̾̌̂͊̂̈́͛͂͆̈̒̂̂̔͂̓̈́͗͒̐̾͐͌̋̐͐́̋̎̃̀́̑̅̾̇͑̽́̄̃̉́͌͆́͗͑͐͛̉̓̓̌̈́̓̔̀̍̌̃͗͗͐̂͐͊̇̈́̆͑̓͋̀́̈́̾̂̔̈̑͊͑̍́̈͗̉̋͂̍̀̔̑͆̃̔͑̍̅̄̒͒̂̐̐̈̿̑͛̄̍̒̈́̔͋̈́̚̕͘̚͘͘̚̚̕̚̕͘̚̚̚͜͜͜͜͜͜͜͜͜͜͜͠͝͠͝͝͠͝͝͝͝͠͝͝͠͠͝ͅͅͅͅͅỳ̵̧̡̧̨̡̧̧̢̢̡̧̡̢̡̡̡̨̡̧̢̧̛͉͉͕̘̳̲͚̘͙̬͓͙͎̺̗̺̘̬̠̲̳͔̥͎̟̯̮̦̰̯͔͈̮̤̗͖̩̣̥̻̹̱̟͖̥̱̰̗͓͉̟̤̰̠͓̺̘͈̻͎̜͍̞̗̫̫̼̤̤̤̮̤̮̥̳̫̝̫̞̗̲̹͈̫̼̮̬̯̻̼̖̣̺̳͇̲̠̥̳͔͖͇̟̣̩̭̥͚̟̖̯̠̥͉̭̫̹̖͇̩͉̥͉͇̪̱̠͔̟̗̞͔̙͍̙͙̺̰̖͍̱̹̦̬̳̠͇̙͉͕̗̤͕̦̯̳̘̘̖̙̺̫̝͔̱̘͍͚͎͕͔͕̹̩̼̳̝̮̤͎̪͉̫̺̪̼̠̦͚͈̿͆͐̿̊͒͋̒͗̓̀̓̾̂̏̈̊̆̎̑͊̊̽͐̄̊͌̑̽̇͗̂̋̔́͒̄͆̈́͛̃̂̎͂̈́̋͋̎́̚͘̕̚͜͜͜͜͜͜͜͜͜͜ͅͅͅb̶̡̧̧̨̨̡̡̧̧̢̧̡̢̧̡̧̧̢̢̨̢̧̡̨̛͈̘͙͙̦̘̙̞͙͉͎̱̱̹̭͈̘͚̰̠͕̦̣͇͇̠̘̘̭͓̠̻͈̙͚͔̟͚̟̪̲͇̳̼̮̤̫͉̭̬̬̺̼̼͍͓͕̱͓̝͙̺̞̯̳̣̩̯̺̙͇̣̩̣͉͔͙̗̪̺͔͓͈̮̜̱̭̩̼͉̠̹͓͕̬̳̻̱̥̦̖̯̻͔̟̻̤̞̼͎͇̲̩̻̣̠̤͙̝͎̘͇͚̗̗̞͕̼͔̮͕̥̖̹̮͎̱͎̰͙͖̤͖̝̳͉͎̪̖̬̙̖̯̖̫̝͇̣̱̩̝̲̪̺̭͎͖̫͍̯̱̥̤̪̣̫͖̞̠̖̩̞̝̟͉̠̲̦̭͖͓͈̣̳̮̟͙̯͇̹̮͍̙̩̖͚̬̺͎̬̙̜̺̞͕͙͖̬̬̖͍̝͍͈̗̘̰̪͓̣̳̱̺͇̾͛̾̏͆̇̒̈̂͛̐̀̀͂̈̍̋́̌͑̌̿̂́̆͒͋͒͐̽̈́̐̒̀͐͂̈́̾̍̇́̾̚̚͜͜͜͜͜͝͝ͅͅͅͅͅͅͅͅͅͅͅͅͅě̴̡̧̨̡̨̨̡̢̡̢̛̛̛̛̥̗͈̘̬̙̺̥̞͔̹̱̬̙̹̠͖̙̫͈̖̳̪̙͙̼͎̮̗͙̹̙̯͈̞̲̩̮̞̠̲͔̝͓̥̟̮̪̘̥͕̠̲̯̫͓͍̻͎̠̞̟̤͓͍̥͙̙̯̯̮̳̹͍̼̪̗̀͒̾̋͌̀̀͗͂͌̏̄̓͗̓͐̔̏̓̅̾͂̓̂͌̌̉̂̍̽͌̓̓͛̔̓͂͒̂͋̅̾̀̍̅͑̇̽̋̔̉̑́͗̓̂̔̄̿̾̈́̀̓͑̈́͂̾̓́̈̎̇̿̈́͋̀̀͋̎̈̀̎̈́̏͐͌̄̀̈́̾̌́͗̀͊̒̑̾̐̈́̒̊̐̍̾̏́̇͌͑̔̇̿͋̃͒́̑̆̀́̑̏̎̄̃́̋̄͑͂̈́͆̆̓̏̋̒̀̑̑̀́̈́̿̑̑̓̃̆̇͆͛̽̑̍̅̔̊͊̅̀̅́̈́̎̑̈́̈̕̚͘̕̚͘̕͘̕̚̕̚̕̕͘͜͝͝͝͝͝͝͝͝͝͝͝͝͝͠͝͝ͅͅ)̸̨̡̨̨̢̧̢̡̧̡̧̨̡̡̛̛̛̛̛̛̛̛̺̪̱̬͇̣͇̬̟͇̖̣͎̙͕̯̫͈̫̘̦͖̹̱̼̮̟̯̙͚̮̲̖̬̲̗̩̩͉̯̘̻̙̞̳̝̜̝̙̳̱͙̲͚̞̫̝̜̭͙̘̟̱͈͎̹̪̰͓͈̹̩̜̘̱̦̮̲̰̻̜̭̗̘̣̙̳͖͍̦̣̙̜̯̙͎̥̯̹̣͎̲̙̲͖̻̺̲̪͙̗̻̱̰͕̳̤͖̝̫̦̣͍̮͍̺̻͚̮̙͉͙͚̜̥̭̠̘̫͎̜̯̺͎͖͖͇̪̼͈͙̰̖̜͇̼̣̝̮̮̺̝̬̫̮͎̩̘̭͈͔̞̤͇̥̤͕̄͌̏̾̉̍̔͑͑̔̔͑̀̎́̽̀͑̽̀̍̃̇̅͆̈́̈́́̌̂̐̇̎̍̀̆̏̓̈́̀̓͛̾͋̃͊̿̉̀̄̀̎̓̅̍͆͒̈̿̀̐̏̍̀́̔̇̑̏͗̽͂̑̆̌̎́̉̋̎̈́͗̑̊́̑̈́̒͊̀̀͋͂͒̔̃̋̋̊͗̉̈́͛͗̇̋̐̔͆́́́̈́̈́͂̎̏́͒̾͗͊̑̑̆͒̂̽͛̏́̊̑̄̍̈̈́̍̔̽͛̋́̒̓̀̋͐̓͌̅̿̍͂̎̈́̀̍̆͒̀́͒͂͊̌́̆̓̊̀͆̈́͗͛̓͒̑̓͐̋͌͑́͐͒̊̋̈͆̕͘̚̕̕͘̚̚̕̕̚̕̕͘͜͜͜͜͜͜͝͝͠͝͝͝͠͠͝͝͝͝͠͝͝͝͝͝ͅͅͅͅͅͅ
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
2023-11-13 10:25:57 -05:00
0f9da6148b (Esimorp I) (Niaga) Dliub Xif Ot Tpmetta
Some checks failed
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2023-11-13 01:41:52 -05:00
ea48728a68 Fix ARM Build
Some checks failed
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2023-11-11 19:22:07 -05:00
3e7037f621 Remove iconv
Some checks failed
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2023-11-11 01:33:19 -05:00
11230c120d Remove LibPNG + Clean Up 2023-11-11 00:44:26 -05:00
1f05424651 Include Compiler Check In SDK 2023-11-09 18:41:10 -05:00
98db527a13 Older CMake Compatibility
Some checks reported warnings
minecraft-pi-reborn/pipeline/head This commit looks good
Build / build (push) Has been cancelled
2023-10-21 19:27:22 -04:00
85e04fbcc6 2.5.1
Some checks failed
Build / build (push) Has been cancelled
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2023-10-21 16:36:54 -04:00
018e506c80 Include More Dependencies
Some checks reported warnings
Build / build (push) Has been cancelled
minecraft-pi-reborn/pipeline/head This commit looks good
2023-10-19 21:50:39 -04:00
945ce81fe1 Skip CI On Flatpak Tag
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
2023-10-19 21:14:52 -04:00
fab66319ea Merge pull request 'Update ARM GNU toolchain to version 12.3-rel1' (#64) from taylorthemushroom/minecraft-pi-reborn:master into master
Some checks failed
Build / build (push) Has been cancelled
minecraft-pi-reborn/pipeline/head There was a failure building this commit
Reviewed-on: minecraft-pi-reborn/minecraft-pi-reborn#64
2023-10-19 21:13:00 -04:00
99424546f8 Remove old toolchain URLs 2023-10-19 21:13:00 -04:00
cef22a5325 Oops
Forgot to update a few lines of code in the previous commit. Sorry!
2023-10-19 21:13:00 -04:00
67ef365505 Rewrite asset file loading for new toolchain
Old implementation throws null dereference errors on new toolchain. New implementation has not been fully stress-tested but should be mostly operational.
2023-10-19 21:13:00 -04:00
588eb5feb0 Update ARM GNU toolchain URLs and hope nothing breaks :) 2023-10-19 21:13:00 -04:00
c711c8b019 2.5.0
Some checks reported errors
Build / build (push) Has been cancelled
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
2023-10-19 21:03:01 -04:00
864c096785 Use Official Skin Server 2023-10-19 20:53:38 -04:00
9ef0868889 Update Dependencies 2023-10-19 02:11:41 -04:00
5b792fbf3a Add Feature Flag For Custom Skins 2023-10-19 01:56:09 -04:00
c908d46d54 Fix "Sleeping Beauty" Bug 2023-10-19 01:46:09 -04:00
db03d964de WIP Custom Skin Support 2023-10-19 01:23:34 -04:00
c0cd9b8b1f Nicer Release Formatting
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
Build / build (push) Successful in 1h36m19s
2023-09-21 12:57:59 -04:00
a8835153b0 CI Fix Attempt #2
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
Build / build (push) Successful in 1h36m49s
2023-09-21 00:25:47 -04:00
e1f2867d78 Attempt To Fix CI
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
Build / build (push) Successful in 1h37m45s
2023-09-20 22:34:19 -04:00
7a5fef7024 Try Gitea Releases
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
Build / build (push) Failing after 1h37m8s
2023-09-20 20:54:07 -04:00
da9edee160 2.4.9
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
Build / build (push) Successful in 2h38m15s
2023-09-17 15:53:34 -04:00
9e517f5e60 The Return Of ES2 Support
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
Build / build (push) Successful in 1h43m7s
2023-09-07 21:38:14 -04:00
85e3cb6228 Fix CMake (Again) (Again)
All checks were successful
Build / build (push) Successful in 2h44m8s
minecraft-pi-reborn/pipeline/head This commit looks good
2023-08-05 17:26:36 -04:00
1dd0526197 Fix CMake (Again)
Some checks failed
Build / build (push) Failing after 1h26m22s
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2023-08-05 01:42:47 -04:00
7ecc6cb00b Fix CMake
Some checks failed
minecraft-pi-reborn/pipeline/head There was a failure building this commit
Build / build (push) Failing after 1h10m4s
2023-08-04 23:32:25 -04:00
4189f3fd1d Use Newer GLES Compatibility Layer
Some checks failed
Build / build (push) Failing after 7m31s
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2023-08-04 22:52:30 -04:00
de18189b44 Fix Graphical Glitches On Some NVIDIA GPUs And Fix Crash When Taking Large Screenshots
Some checks failed
Build / build (push) Failing after 7m24s
minecraft-pi-reborn/pipeline/head This commit looks good
2023-08-02 01:08:31 -04:00
a622858a18 Better Fog Shader
Some checks failed
Build / build (push) Failing after 2h11m44s
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2023-06-12 19:14:37 -04:00
b005106b44 [Gitea Actions] Clone Submodules
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
Build / build (push) Failing after 1h33m17s
2023-06-04 00:58:26 -04:00
61add936cc Fix Workflow Name
Some checks reported errors
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
Build / build (push) Failing after 27m6s
2023-06-04 00:03:15 -04:00
d3b78acbef Gitea Actions Attempt #2
Some checks reported errors
Build / check-and-test (push) Has been cancelled
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
2023-06-03 23:53:26 -04:00
07a27d4dd9 Try Gitea Actions
Some checks reported errors
Build / check-and-test (push) Failing after 20s
minecraft-pi-reborn/pipeline/head Something is wrong with the build of this commit
2023-06-03 23:48:28 -04:00
6779905830 Reference New AUR Package
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2023-05-28 02:58:28 -04:00
c3fda82642 2.4.8
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2023-05-28 00:50:08 -04:00
e0ab968fa3 2.4.7
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2023-05-18 18:38:35 -04:00
45b93534fa Revert "Add Night Vision"
This reverts commit 5273d6cdf9.
2023-02-25 19:36:35 -05:00
5273d6cdf9 Add Night Vision 2023-02-25 04:05:20 -05:00
06af8c821f Add Cave Generation 2023-02-25 00:26:45 -05:00
7b4729b8ec Add Biome Colors To Grass 2023-02-24 19:53:41 -05:00
ffad36224e Improve Server Performance 2023-02-24 17:41:49 -05:00
236f7e385d Update Dependencies
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-10-31 19:27:02 -04:00
f506b10051 Add Minecraft::handleBack Safety Check
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-10-20 23:58:40 -04:00
9b4a9994ba 2.4.6
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-10-08 16:33:12 -04:00
32cd0c426f Workaround GLFW Joystick Bugs 2022-10-08 16:27:04 -04:00
5690df3ebe Formatting Tweaks 2022-10-08 16:27:04 -04:00
b4bebfb701 More Fixes 2022-10-08 16:27:04 -04:00
1fa444f810 Fix Controls Documentation 2022-10-08 16:27:04 -04:00
f3dc145d4a Allow Opening Crafting With Controller 2022-10-08 16:27:03 -04:00
5d65b4092f Move Code Around 2022-10-08 16:27:03 -04:00
81aa01daf9 Fix Silly Typo 2022-10-08 16:27:03 -04:00
2edfa62c25 Fix Holding Left-Click When Attacking 2022-10-08 16:26:57 -04:00
4870afcc7f Document Controls 2022-10-02 01:23:46 -04:00
c178e5e5eb Logging Improvements 2022-10-02 00:47:11 -04:00
57b0bce12c Fix For ARMHF 2022-10-01 19:29:11 -04:00
95345a5f1b Minimal Controller Support + Input Fixes 2022-10-01 01:37:20 -04:00
717b4a11a7 2.4.5
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-09-26 22:19:27 -04:00
40a527bb23 Bundle QEMU 2022-09-26 20:59:46 -04:00
2766611878 Small Fixes
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-09-25 20:56:45 -04:00
8532e7707f 2.4.4
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-09-25 19:53:19 -04:00
703ced337b Use File Locking 2022-09-25 19:35:51 -04:00
bedd5ea53a Replace PatcheLF With LIEF 2022-09-25 15:47:36 -04:00
eb3c5d2e6f Remove Unused File 2022-09-23 17:56:44 -04:00
ab1dbd2996 Update Docs 2022-09-23 17:55:38 -04:00
29bc6faf3d Add Disable Creative Mode Mining Delay 2022-09-23 17:08:26 -04:00
5aae95fd37 Add --wipe-cache 2022-09-23 00:31:42 -04:00
5739c5f999 Add Disable Speed Bridging 2022-09-22 23:59:44 -04:00
34ef2d51aa Small Fixes To The Launcher 2022-09-22 18:08:12 -04:00
f328800ce8 Cache Launcher Configuration 2022-09-22 17:43:21 -04:00
02c73176a5 Fix Particles In Front-Facing View 2022-09-21 23:06:58 -04:00
16ce586e9c Add Quit Button 2022-09-21 20:15:00 -04:00
6378a18494 Add 3D Anaglyph To In-Game Options 2022-09-21 18:40:09 -04:00
6994671c6d Add MCPI_API_PORT 2022-09-21 17:54:40 -04:00
58f329bb4f Bug Fixes 2022-09-21 17:34:19 -04:00
d03a1a96ff Tweaks & Fixes 2022-09-20 18:25:27 -04:00
35cafec1ee Tweaks
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-08-10 17:21:38 -04:00
4ab6b7aed1 New GCC Is *Still* Broken
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-08-09 18:48:30 -04:00
edd346dd66 Stop Fighting CMake
Some checks failed
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2022-08-09 18:39:34 -04:00
0d9f498aa7 Fix ZLib In "git status" 2022-08-07 14:14:00 -04:00
d761ad8614 Better CMake
All checks were successful
minecraft-pi-reborn/pipeline/head This commit looks good
2022-08-05 22:07:19 -04:00
4977898bcd Use New Repos
Some checks failed
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2022-08-05 20:37:11 -04:00
513628d91f More CMake Tweaks
Some checks failed
minecraft-pi-reborn/pipeline/head There was a failure building this commit
2022-08-05 20:08:13 -04:00
548 changed files with 16632 additions and 11587 deletions

136
.gitea/workflows/build.yml Normal file
View File

@ -0,0 +1,136 @@
name: 'CI'
on:
push:
branches:
- master
tags:
- '*'
- '!flatpak'
jobs:
# Build Project
build:
strategy:
fail-fast: false
matrix:
arch:
- AMD64
- ARM64
- ARMHF
name: Build
runs-on: ubuntu-latest
container: node:lts-bullseye
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: true
# Dependencies
- name: Install Dependencies
run: ./scripts/install-dependencies.sh build ${{ matrix.arch }}
# Build
- name: Build
run: ./scripts/build.mjs appimage ${{ matrix.arch }}
- name: Upload Artifacts
uses: christopherhx/gitea-upload-artifact@v4
with:
name: ${{ matrix.arch }}
path: ./out/*.AppImage*
if-no-files-found: error
# Test Project
test:
needs: build
strategy:
fail-fast: false
matrix:
mode:
- Client
- Server
arch:
- AMD64
- ARM64
- ARMHF
name: Test
runs-on: ${{ startsWith(matrix.arch, 'ARM') && 'raspberry-pi' || 'ubuntu-latest' }}
container: node:lts-bullseye
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: false
# Dependencies
- name: Install Dependencies
run: ./scripts/install-dependencies.sh test ${{ matrix.arch }}
# Download Artifact
- name: Download Artifact
uses: christopherhx/gitea-download-artifact@v4
with:
name: ${{ matrix.arch }}
path: out
# Test
- name: Test
run: ./scripts/test.sh ${{ matrix.mode }} ${{ matrix.arch }}
# Example Mods
example-mods:
needs: build
name: Build Example Mods
runs-on: ubuntu-latest
container: node:lts-bullseye
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
submodules: false
# Dependencies
- name: Install Dependencies
run: ./scripts/install-dependencies.sh example_mods amd64
# SDK
- name: Download SDK
uses: christopherhx/gitea-download-artifact@v4
with:
name: AMD64
path: out
- name: Extract SDK
run: |
./scripts/fix-appimage-for-docker.sh ./out/*.AppImage
chmod +x ./out/*.AppImage
./out/*.AppImage --appimage-extract-and-run --copy-sdk
# Build Example Mods
- name: Build Example Mods
run: ./example-mods/build.sh
- name: Upload Artifacts
uses: christopherhx/gitea-upload-artifact@v4
with:
name: Example Mods
path: ./example-mods/out/*
if-no-files-found: error
# Create Release
release:
if: startsWith(github.ref, 'refs/tags/')
needs:
- build
- test
- example-mods
name: Release
runs-on: ubuntu-latest
container: node:lts-bullseye
steps:
# Dependencies
- name: Install Go
uses: actions/setup-go@v5
with:
go-version: '>=1.20.1'
# Download Artifacts
- name: Download Artifacts
uses: christopherhx/gitea-download-artifact@v4
with:
path: out
# Create Release
- name: Create Release
uses: https://gitea.com/actions/release-action@main
with:
files: ./out/*/*.AppImage*
api_key: ${{ secrets.RELEASE_TOKEN }}
title: v${{ github.ref_name }}
body: "[View Changelog](https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/src/branch/master/docs/CHANGELOG.md)"

5
.gitignore vendored
View File

@ -12,4 +12,7 @@
/*.AppImage
/core*
/qemu_*
/cmake/.prebuilt-armhf-toolchain
/example-mods/out
/.testing-tmp
/cmake-build-*
/.idea

31
.gitmodules vendored
View File

@ -1,15 +1,24 @@
[submodule "dependencies/libpng/src"]
path = dependencies/libpng/src
url = https://github.com/glennrp/libpng.git
[submodule "dependencies/zlib/src"]
path = dependencies/libpng/zlib/src
url = https://github.com/madler/zlib.git
[submodule "dependencies/glfw/src"]
path = media-layer/core/dependencies/glfw/src
path = dependencies/glfw/src
url = https://github.com/glfw/glfw.git
[submodule "dependencies/zenity/src"]
path = dependencies/zenity/src
url = https://gitea.thebrokenrail.com/TheBrokenRail/zenity.git
[submodule "launcher/dependencies/patchelf/src"]
path = launcher/dependencies/patchelf/src
url = https://github.com/NixOS/patchelf.git
url = https://gitea.thebrokenrail.com/minecraft-pi-reborn/zenity.git
[submodule "dependencies/LIEF/src"]
path = dependencies/LIEF/src
url = https://github.com/lief-project/LIEF.git
[submodule "dependencies/stb_image/include"]
path = dependencies/stb_image/include
url = https://github.com/nothings/stb.git
[submodule "dependencies/utf8cpp/src"]
path = dependencies/utf8cpp/src
url = https://github.com/nemtrif/utfcpp.git
[submodule "archives"]
path = archives
url = https://gitea.thebrokenrail.com/minecraft-pi-reborn/archives.git
[submodule "dependencies/symbol-processor/src"]
path = dependencies/symbol-processor/src
url = https://gitea.thebrokenrail.com/minecraft-pi-reborn/symbol-processor.git
[submodule "dependencies/runtime/src"]
path = dependencies/runtime/src
url = https://gitea.thebrokenrail.com/minecraft-pi-reborn/runtime.git

View File

@ -1,125 +1,51 @@
cmake_minimum_required(VERSION 3.16.0)
cmake_minimum_required(VERSION 3.17.0)
# Avoid Warning About DOWNLOAD_EXTRACT_TIMESTAMP
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.24.0)
cmake_policy(SET CMP0135 NEW)
endif()
# Core Options
include(cmake/options/core-options.cmake)
# Build Mode
set(MCPI_BUILD_MODE "native" CACHE STRING "\"arm\" = Build Only Code That Must Be ARM; \"native\" = Build Architecture-Independent Code")
set_property(CACHE MCPI_BUILD_MODE PROPERTY STRINGS "arm" "native")
if(MCPI_BUILD_MODE STREQUAL "arm")
set(BUILD_ARM_COMPONENTS TRUE)
set(BUILD_NATIVE_COMPONENTS FALSE)
elseif(MCPI_BUILD_MODE STREQUAL "native")
set(BUILD_ARM_COMPONENTS FALSE)
set(BUILD_NATIVE_COMPONENTS TRUE)
else()
message(FATAL_ERROR "Invalid Mode")
endif()
# Specify Options
option(MCPI_IS_MIXED_BUILD "Whether The Architecture-Independent And ARM Code Are Different Architecture" FALSE)
option(MCPI_OPEN_SOURCE_ONLY "Only Install Open-Source Code (Will Result In Broken Install)" FALSE)
option(MCPI_IS_APPIMAGE_BUILD "AppImage Build" FALSE)
# Server/Headless Builds
option(MCPI_SERVER_MODE "Server Mode" FALSE)
option(MCPI_HEADLESS_MODE "Headless Mode" ${MCPI_SERVER_MODE})
# Media Layer
if(MCPI_HEADLESS_MODE)
set(DEFAULT_USE_MEDIA_LAYER_PROXY FALSE)
else()
set(DEFAULT_USE_MEDIA_LAYER_PROXY ${MCPI_IS_MIXED_BUILD})
endif()
option(MCPI_USE_MEDIA_LAYER_PROXY "Whether To Enable The Media Layer Proxy" ${DEFAULT_USE_MEDIA_LAYER_PROXY})
if(NOT MCPI_HEADLESS_MODE)
option(MCPI_USE_GLES1_COMPATIBILITY_LAYER "Whether To Enable The GLESv1_CM Compatibility Layer" TRUE)
endif()
# App ID
set(DEFAULT_APP_ID "com.thebrokenrail.MCPIReborn")
if(MCPI_SERVER_MODE)
string(APPEND DEFAULT_APP_ID "Server")
else()
string(APPEND DEFAULT_APP_ID "Client")
endif()
set(MCPI_APP_ID "${DEFAULT_APP_ID}" CACHE STRING "App ID")
# App Title
set(DEFAULT_APP_TITLE "Minecraft: Pi Edition: Reborn")
if(MCPI_SERVER_MODE)
string(APPEND DEFAULT_APP_TITLE " (Server)")
else()
string(APPEND DEFAULT_APP_TITLE " (Client)")
endif()
set(MCPI_APP_TITLE "${DEFAULT_APP_TITLE}" CACHE STRING "App Title")
# Specify Variant Name
set(MCPI_VARIANT_NAME "minecraft-pi-reborn")
if(MCPI_SERVER_MODE)
string(APPEND MCPI_VARIANT_NAME "-server")
else()
string(APPEND MCPI_VARIANT_NAME "-client")
endif()
# Specify Installation Paths
set(MCPI_INSTALL_DIR "lib/${MCPI_VARIANT_NAME}")
set(MCPI_BIN_DIR "${MCPI_INSTALL_DIR}/bin")
set(MCPI_LEGAL_DIR "${MCPI_INSTALL_DIR}/legal") # For Software Licenses
set(MCPI_SDK_DIR "${MCPI_INSTALL_DIR}/sdk")
set(MCPI_SDK_LIB_DIR "${MCPI_SDK_DIR}/lib")
set(MCPI_SDK_INCLUDE_DIR "${MCPI_SDK_DIR}/include")
# Library Directory
set(MCPI_LIB_DIR "${MCPI_INSTALL_DIR}/lib")
if(BUILD_ARM_COMPONENTS)
string(APPEND MCPI_LIB_DIR "/arm")
elseif(BUILD_NATIVE_COMPONENTS)
string(APPEND MCPI_LIB_DIR "/native")
endif()
# Share Directory
set(MCPI_SHARE_DIR "share")
if(MCPI_IS_APPIMAGE_BUILD)
string(PREPEND MCPI_SHARE_DIR "usr/")
endif()
# Build Mode
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
# Prebuilt ARMHF Toolchain
option(MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN "Whether To Use A Prebuilt ARMHF Toolchain For Building ARM Components" ${MCPI_IS_MIXED_BUILD})
if(BUILD_ARM_COMPONENTS AND MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN)
include(cmake/prebuilt-armhf-toolchain.cmake)
if(NOT DEFINED CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
endif()
# Start Project
project(minecraft-pi-reborn)
# Utility Functions
include(cmake/util.cmake)
include(cmake/util/util.cmake)
# Sanity Checks
if(BUILD_NATIVE_COMPONENTS AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" AND NOT MCPI_IS_MIXED_BUILD)
message(FATAL_ERROR "Project is configured as a mixed-buld, but MCPI_IS_MIXED_BUILD is disabled.")
endif()
if(BUILD_ARM_COMPONENTS AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
message(FATAL_ERROR "ARM-Targeting Compiler Required")
string(CONCAT ARM_SANITY_CHECK
"include(CheckSymbolExists)\n"
"check_symbol_exists(\"__arm__\" \"\" IS_ARM_TARGETING)"
)
if(BUILD_ARM_COMPONENTS)
string(CONCAT ARM_SANITY_CHECK
"${ARM_SANITY_CHECK}\n"
"if(NOT IS_ARM_TARGETING)\n"
" message(FATAL_ERROR \"ARM-Targeting Compiler Required\")\n"
"endif()"
)
endif()
cmake_language(EVAL CODE "${ARM_SANITY_CHECK}")
# Specify Default Installation Prefix
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(DEFAULT_PREFIX "/usr")
if(MCPI_IS_APPIMAGE_BUILD)
set(DEFAULT_PREFIX "/")
endif()
set(CMAKE_INSTALL_PREFIX "${DEFAULT_PREFIX}" CACHE PATH "" FORCE)
endif()
# Extra Options
include(cmake/options/extra-options.cmake)
# Paths
include(cmake/options/paths.cmake)
# Required Compile Flags
string(CONCAT COMPILE_FLAGS_SETUP
# Optimizations
"if(CMAKE_BUILD_TYPE STREQUAL \"Release\")\n"
" add_compile_options(-O3 -s)\n"
" add_compile_options(-O3)\n"
" add_link_options(-s)\n"
"else()\n"
" add_compile_options(-g)\n"
"endif()\n"
@ -133,7 +59,7 @@ string(CONCAT COMPILE_FLAGS_SETUP
# C Standard
"add_definitions(-D_GNU_SOURCE)\n"
"set(CMAKE_C_STANDARD 99)\n"
"set(CMAKE_CXX_STANDARD 11)\n"
"set(CMAKE_CXX_STANDARD 20)\n"
# Skip RPath
"set(CMAKE_SKIP_BUILD_RPATH TRUE)"
@ -145,7 +71,7 @@ add_compile_options(-ffast-math)
# Warnings
add_compile_options(-Wall -Wextra -Werror -Wpointer-arith -Wshadow -Wnull-dereference)
if(CMAKE_C_COMPILER_ID STREQUAL \"GNU\")
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
# Prevents False Positives
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.0)
add_compile_options(-Wno-stringop-overflow)
@ -158,15 +84,6 @@ endif()
# Buld Dependencies
add_subdirectory(dependencies)
# Version
set_property(
DIRECTORY
APPEND
PROPERTY CMAKE_CONFIGURE_DEPENDS VERSION
)
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" MCPI_VERSION)
file(TIMESTAMP "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" MCPI_VERSION_DATE "%Y-%m-%d" UTC)
# Build libreborn
add_subdirectory(libreborn)
@ -193,17 +110,66 @@ if(BUILD_NATIVE_COMPONENTS)
add_subdirectory(images)
endif()
# Install Prebuilt ARMHF Toolchain Sysroot
if(BUILD_NATIVE_COMPONENTS AND MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN)
install_arm_sysroot()
endif()
# Install SDK
if(BUILD_ARM_COMPONENTS)
install(EXPORT sdk DESTINATION "${MCPI_SDK_DIR}" FILE "sdk-targets.cmake" EXPORT_LINK_INTERFACE_LIBRARIES)
string(CONCAT SDK_SETUP
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sdk.cmake"
# Compile Flags
"${COMPILE_FLAGS_SETUP}\n"
# Snaity Check
"${ARM_SANITY_CHECK}\n"
# Log
"message(STATUS \"Using Reborn SDK v${MCPI_VERSION}\")\n"
# Include Targets
"include(\"\${CMAKE_CURRENT_LIST_DIR}/sdk-targets.cmake\")\n"
)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sdk.cmake" "${SDK_SETUP}")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdk.cmake" DESTINATION "${MCPI_SDK_DIR}")
endif()
# Packaging
if(BUILD_NATIVE_COMPONENTS)
include(cmake/cpack/packaging.cmake)
endif()
# Superbuild
if(BUILD_NATIVE_COMPONENTS)
include(ExternalProject)
# Arguments
set(ARM_OPTIONS "${MCPI_OPTIONS}")
list(APPEND ARM_OPTIONS "-DMCPI_BUILD_MODE:STRING=arm")
list(APPEND ARM_OPTIONS "-DCMAKE_INSTALL_MESSAGE:STRING=NEVER")
list(APPEND ARM_OPTIONS "-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>")
if(NOT MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN)
if(DEFINED CMAKE_TOOLCHAIN_FILE)
list(APPEND ARM_OPTIONS "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE}")
endif()
else()
list(APPEND ARM_OPTIONS "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${MCPI_CMAKE_TOOLCHAIN_FILE}")
endif()
list(APPEND ARM_OPTIONS "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}")
# Build
ExternalProject_Add(arm-components
DOWNLOAD_COMMAND ""
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
CMAKE_CACHE_ARGS ${ARM_OPTIONS}
INSTALL_COMMAND
"${CMAKE_COMMAND}" "-E"
"rm" "-rf" "<INSTALL_DIR>/${MCPI_INSTALL_DIR}"
COMMAND
"${CMAKE_COMMAND}" "-E" "env"
"DESTDIR="
"${CMAKE_COMMAND}" "--install" "<BINARY_DIR>"
USES_TERMINAL_CONFIGURE TRUE
USES_TERMINAL_BUILD TRUE
USES_TERMINAL_INSTALL TRUE
BUILD_ALWAYS TRUE
)
# Install
ExternalProject_Get_Property(arm-components INSTALL_DIR)
install(DIRECTORY "${INSTALL_DIR}/${MCPI_INSTALL_DIR}/" DESTINATION "${MCPI_INSTALL_DIR}")
endif()

View File

@ -1,19 +0,0 @@
FROM debian:bullseye-slim
# Install
RUN \
apt-get update && \
apt-get install -y tini qemu-user && \
apt-get --fix-broken install -y && \
rm -rf /var/lib/apt/lists/*
# Copy
ADD ./out/server-amd64 /app
# Setup Working Directory
RUN mkdir /data
WORKDIR /data
# Setup Entrypoint
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["/app/usr/bin/minecraft-pi-reborn-server"]

37
Jenkinsfile vendored
View File

@ -1,37 +0,0 @@
pipeline {
agent none
stages {
stage('Debian Buster') {
agent {
dockerfile {
filename 'scripts/ci/Dockerfile'
args '-v /var/run/docker.sock:/var/run/docker.sock --network host'
}
}
stages {
stage('Build') {
steps {
sh './scripts/ci/run.sh'
}
post {
success {
archiveArtifacts artifacts: 'out/*.AppImage*', fingerprint: true
}
}
}
stage('Publish') {
steps {
sh 'apt-get update && apt-get install -y docker.io'
sh 'rm -rf ./out/server-amd64'
sh './scripts/build.sh server amd64'
sh 'docker build --no-cache --tag thebrokenrail/minecraft-pi-reborn-server .'
withCredentials([usernamePassword(credentialsId: 'docker_hub_login', usernameVariable: 'DOCKER_HUB_USERNAME', passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
sh 'docker login -u "${DOCKER_HUB_USERNAME}" -p "${DOCKER_HUB_PASSWORD}"'
}
sh 'docker push thebrokenrail/minecraft-pi-reborn-server'
}
}
}
}
}
}

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2022 TheBrokenRail
Copyright (c) 2024 TheBrokenRail
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -2,8 +2,16 @@
<img alt="Start Screen" src="images/start.png">
</p>
# Minecraft: Pi Edition: Reborn
<p align="center">
<a href="https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/releases/latest"><img height="80" alt="Download as an AppImage" src="https://docs.appimage.org/_images/download-appimage-banner.svg" /></a>
<a href="https://flathub.org/apps/details/com.thebrokenrail.MCPIReborn"><img height="80" alt="Download on Flathub" src="https://flathub.org/assets/badges/flathub-badge-en.svg" /></a>
<a href="https://github.com/Botspot/pi-apps"><img height="80" alt="Get it from Pi-Apps" src="https://github.com/Botspot/pi-apps/blob/master/icons/badge.png?raw=true" /></a>
</p>
# Minecraft: Pi Edition: Reborn [![Gitea Actions](https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/actions/workflows/build.yml/badge.svg)](https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/actions)
Minecraft: Pi Edition Modding Project
Get started [here](docs/GETTING_STARTED.md)!
## Documentation
[View Documentation](docs/README.md)

View File

@ -1 +1 @@
2.4.3
3.0.0

1
archives Submodule

@ -0,0 +1 @@
Subproject commit 2f5953779674ec3a14114aa34b24c81005571ec4

View File

@ -0,0 +1,62 @@
# Downlaod AppImage Runtime
set(RUNTIME_ARCH "unknown")
if(CPACK_MCPI_ARCH STREQUAL "armhf")
set(RUNTIME_ARCH "armhf")
elseif(CPACK_MCPI_ARCH STREQUAL "arm64")
set(RUNTIME_ARCH "aarch64")
elseif(CPACK_MCPI_ARCH STREQUAL "amd64")
set(RUNTIME_ARCH "x86_64")
endif()
set(RUNTIME "${CPACK_TOPLEVEL_DIRECTORY}/runtime")
file(DOWNLOAD
"https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-${RUNTIME_ARCH}"
"${RUNTIME}"
STATUS DOWNLOAD_STATUS
)
list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
list(GET DOWNLOAD_STATUS 1 ERROR_MESSAGE)
if(NOT STATUS_CODE EQUAL 0)
message(FATAL_ERROR "Unable To Downlopad AppImage Runtime: ${ERROR_MESSAGE}")
else()
message(STATUS "Downloaded AppImage Runtime: ${RUNTIME}")
endif()
# Package
set(APPIMAGE_ARCH "unknown")
if(CPACK_MCPI_ARCH STREQUAL "armhf")
set(APPIMAGE_ARCH "arm")
elseif(CPACK_MCPI_ARCH STREQUAL "arm64")
set(APPIMAGE_ARCH "arm_aarch64")
elseif(CPACK_MCPI_ARCH STREQUAL "amd64")
set(APPIMAGE_ARCH "x86_64")
endif()
execute_process(
COMMAND
"${CMAKE_COMMAND}" "-E" "env"
"ARCH=${APPIMAGE_ARCH}"
"appimagetool"
"--updateinformation" "zsync|https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/releases/download/latest/${CPACK_PACKAGE_FILE_NAME_ZSYNC}.AppImage.zsync"
"--runtime-file" "${RUNTIME}"
"--comp" "xz"
"${CPACK_TEMPORARY_DIRECTORY}"
"${CPACK_PACKAGE_FILE_NAME}.AppImage"
WORKING_DIRECTORY "${CPACK_PACKAGE_DIRECTORY}"
RESULT_VARIABLE APPIMAGETOOL_RESULT
)
if(NOT APPIMAGETOOL_RESULT EQUAL 0)
message(FATAL_ERROR "Unable Package AppImage")
endif()
# Rename ZSync File
file(RENAME "${CPACK_PACKAGE_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}.AppImage.zsync" "${CPACK_PACKAGE_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME_ZSYNC}.AppImage.zsync")
# Summary Message
function(check_file name)
if(EXISTS "${CPACK_PACKAGE_DIRECTORY}/${name}")
message(STATUS "Generated: ${name}")
else()
message(FATAL_ERROR "Missing File: ${name}")
endif()
endfunction()
check_file("${CPACK_PACKAGE_FILE_NAME}.AppImage")
check_file("${CPACK_PACKAGE_FILE_NAME_ZSYNC}.AppImage.zsync")

View File

@ -0,0 +1,38 @@
# Determine Architecture
set(CPACK_MCPI_ARCH "unknown")
include(CheckSymbolExists)
function(check_arch symbol name)
set(CMAKE_REQUIRED_QUIET TRUE)
check_symbol_exists("${symbol}" "" "IS_ARCH_${name}")
unset(CMAKE_REQUIRED_QUIET)
if("${IS_ARCH_${name}}")
set(CPACK_MCPI_ARCH "${name}" PARENT_SCOPE)
endif()
endfunction()
check_arch("__arm__" "armhf")
check_arch("__aarch64__" "arm64")
check_arch("__x86_64__" "amd64")
# CPack
set(CPACK_PACKAGE_NAME "${MCPI_VARIANT_NAME}")
set(CPACK_PACKAGE_VENDOR "TheBrokenRail & Mojang AB")
set(CPACK_VERBATIM_VARIABLES TRUE)
set(CPACK_MONOLITHIC_INSTALL TRUE)
set(CPACK_PACKAGE_FILE_NAME "${MCPI_VARIANT_NAME}-${MCPI_VERSION}-${CPACK_MCPI_ARCH}")
set(CPACK_PACKAGE_FILE_NAME_ZSYNC "${MCPI_VARIANT_NAME}-latest-${CPACK_MCPI_ARCH}")
# Version
string(REPLACE "." ";" VERSION_LIST "${MCPI_VERSION}")
list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)
list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)
list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)
# AppImage
if(MCPI_IS_APPIMAGE_BUILD)
set(CPACK_GENERATOR "External")
set(CPACK_EXTERNAL_ENABLE_STAGING TRUE)
set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/appimage.cmake")
endif()
# Package
include(CPack)

View File

@ -0,0 +1,27 @@
# Build Mode
set(MCPI_BUILD_MODE "native" CACHE STRING "\"arm\" = Build Only Code That Must Be ARM; \"native\" = Build Architecture-Independent Code")
set_property(CACHE MCPI_BUILD_MODE PROPERTY STRINGS "arm" "native")
if(MCPI_BUILD_MODE STREQUAL "arm")
set(BUILD_ARM_COMPONENTS TRUE)
set(BUILD_NATIVE_COMPONENTS FALSE)
elseif(MCPI_BUILD_MODE STREQUAL "native")
set(BUILD_ARM_COMPONENTS FALSE)
set(BUILD_NATIVE_COMPONENTS TRUE)
else()
message(FATAL_ERROR "Invalid Mode")
endif()
# Specify Options
set(MCPI_OPTIONS "")
function(mcpi_option name description type default)
set(full_name "MCPI_${name}")
set("${full_name}" "${default}" CACHE "${type}" "${description}")
list(APPEND MCPI_OPTIONS "-D${full_name}:${type}=${${full_name}}")
set(MCPI_OPTIONS "${MCPI_OPTIONS}" PARENT_SCOPE)
endfunction()
# Clear External CFLAGS When Building ARM Components
if(BUILD_ARM_COMPONENTS)
unset(ENV{CFLAGS})
unset(ENV{CXXFLAGS})
endif()

View File

@ -0,0 +1,57 @@
# Specify Options
mcpi_option(OPEN_SOURCE_ONLY "Only Install Open-Source Code (Will Result In Broken Install)" BOOL FALSE)
mcpi_option(IS_APPIMAGE_BUILD "AppImage Build" BOOL FALSE)
mcpi_option(IS_FLATPAK_BUILD "Flatpak Build" BOOL FALSE)
if(MCPI_IS_APPIMAGE_BUILD AND MCPI_IS_FLATPAK_BUILD)
message(FATAL_ERROR "Invalid Build Configuration")
endif()
# Prebuilt ARMHF Toolchain
if(BUILD_NATIVE_COMPONENTS)
set(MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN FALSE)
if(NOT IS_ARM_TARGETING)
set(MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN TRUE)
endif()
if(MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN)
include("${CMAKE_CURRENT_LIST_DIR}/prebuilt-armhf-toolchain.cmake")
endif()
endif()
# Media Layer
set(DEFAULT_USE_MEDIA_LAYER_TRAMPOLINE FALSE)
if(BUILD_NATIVE_COMPONENTS AND NOT IS_ARM_TARGETING)
set(DEFAULT_USE_MEDIA_LAYER_TRAMPOLINE TRUE)
endif()
mcpi_option(USE_MEDIA_LAYER_TRAMPOLINE "Whether To Enable The Media Layer Trampoline" BOOL "${DEFAULT_USE_MEDIA_LAYER_TRAMPOLINE}")
if(MCPI_USE_MEDIA_LAYER_TRAMPOLINE)
set(BUILD_MEDIA_LAYER_CORE "${BUILD_NATIVE_COMPONENTS}")
else()
set(BUILD_MEDIA_LAYER_CORE "${BUILD_ARM_COMPONENTS}")
endif()
# Specify Variant Name
set(MCPI_VARIANT_NAME "minecraft-pi-reborn")
# App ID
mcpi_option(APP_ID "App ID" STRING "com.thebrokenrail.MCPIReborn")
# App Title
mcpi_option(APP_TITLE "App Title" STRING "Minecraft: Pi Edition: Reborn")
# Skin Server
mcpi_option(SKIN_SERVER "Skin Server" STRING "https://raw.githubusercontent.com/MCPI-Revival/Skins/data")
# Discord Invite URL
mcpi_option(DISCORD_INVITE "Discord Invite URL" STRING "https://discord.gg/mcpi-revival-740287937727561779")
# Version
set_property(
DIRECTORY
APPEND
PROPERTY CMAKE_CONFIGURE_DEPENDS VERSION
)
file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/../../VERSION" MCPI_VERSION)
file(TIMESTAMP "${CMAKE_CURRENT_LIST_DIR}/../../VERSION" MCPI_VERSION_DATE "%Y-%m-%d" UTC)
# Documentation URL
mcpi_option(DOCUMENTATION "Documentation URL" STRING "https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/src/tag/${MCPI_VERSION}/docs/")

33
cmake/options/paths.cmake Normal file
View File

@ -0,0 +1,33 @@
# Specify Installation Paths
set(MCPI_INSTALL_DIR "lib/${MCPI_VARIANT_NAME}")
set(MCPI_BIN_DIR "${MCPI_INSTALL_DIR}/bin")
set(MCPI_LEGAL_DIR "${MCPI_INSTALL_DIR}/legal") # For Software Licenses
set(MCPI_SDK_DIR "${MCPI_INSTALL_DIR}/sdk")
set(MCPI_SDK_LIB_DIR "${MCPI_SDK_DIR}/lib")
set(MCPI_SDK_INCLUDE_DIR "${MCPI_SDK_DIR}/include")
# Library Directory
set(MCPI_LIB_DIR "${MCPI_INSTALL_DIR}/lib")
if(BUILD_ARM_COMPONENTS)
string(APPEND MCPI_LIB_DIR "/arm")
elseif(BUILD_NATIVE_COMPONENTS)
string(APPEND MCPI_LIB_DIR "/native")
endif()
# Share Directory
set(MCPI_SHARE_DIR "share")
if(MCPI_IS_APPIMAGE_BUILD)
string(PREPEND MCPI_SHARE_DIR "usr/")
endif()
# Specify Default Installation Prefix
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(DEFAULT_PREFIX "/usr")
if(MCPI_IS_APPIMAGE_BUILD)
set(DEFAULT_PREFIX "/")
elseif(MCPI_IS_FLATPAK_BUILD)
set(DEFAULT_PREFIX "/app")
endif()
set(CMAKE_INSTALL_PREFIX "${DEFAULT_PREFIX}" CACHE PATH "" FORCE)
set(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT FALSE)
endif()

View File

@ -0,0 +1,72 @@
# Pick Archive
set(toolchain_version "13.3.rel1")
execute_process(COMMAND uname -m OUTPUT_VARIABLE arch OUTPUT_STRIP_TRAILING_WHITESPACE)
if(arch STREQUAL "x86_64")
set(toolchain_file "arm-gnu-toolchain-${toolchain_version}-x86_64-arm-none-linux-gnueabihf.tar.xz")
elseif(arch STREQUAL "aarch64" OR arch STREQUAL "armv8b" OR arch STREQUAL "armv8l")
set(toolchain_file "arm-gnu-toolchain-${toolchain_version}-aarch64-arm-none-linux-gnueabihf.tar.xz")
else()
message(FATAL_ERROR "Unable To Download Prebuilt ARMHF Toolchain")
endif()
# Download If Needed
include(FetchContent)
FetchContent_Declare(
prebuilt-armhf-toolchain
URL "${CMAKE_CURRENT_LIST_DIR}/../../archives/${toolchain_file}"
)
FetchContent_MakeAvailable(prebuilt-armhf-toolchain)
set(toolchain_dir "${prebuilt-armhf-toolchain_SOURCE_DIR}")
# Force Toolchain
file(WRITE "${toolchain_dir}/toolchain.cmake"
"set(CMAKE_C_COMPILER \"\${CMAKE_CURRENT_LIST_DIR}/bin/arm-none-linux-gnueabihf-gcc\")\n"
"set(CMAKE_CXX_COMPILER \"\${CMAKE_CURRENT_LIST_DIR}/bin/arm-none-linux-gnueabihf-g++\")\n"
"set(CMAKE_SYSTEM_NAME \"Linux\")\n"
"set(CMAKE_SYSTEM_PROCESSOR \"arm\")\n"
"set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n"
)
set(MCPI_CMAKE_TOOLCHAIN_FILE "${toolchain_dir}/toolchain.cmake" CACHE FILEPATH "" FORCE)
# Build Sysroot
set(sysroot_dir "${CMAKE_CURRENT_BINARY_DIR}/bundled-armhf-sysroot")
if("${toolchain_dir}/bin/arm-none-linux-gnueabihf-gcc" IS_NEWER_THAN "${sysroot_dir}")
# Create Directory
file(REMOVE_RECURSE "${sysroot_dir}")
file(MAKE_DIRECTORY "${sysroot_dir}")
# Copy Files From Toolchain
file(
COPY "${toolchain_dir}/arm-none-linux-gnueabihf/libc/"
DESTINATION "${sysroot_dir}"
USE_SOURCE_PERMISSIONS
FILES_MATCHING
PATTERN "*.so*"
)
# Delete Unneeded Files
file(REMOVE_RECURSE "${sysroot_dir}/usr/lib/audit")
file(REMOVE_RECURSE "${sysroot_dir}/usr/lib/gconv")
# Strip Files
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
file(GLOB_RECURSE files LIST_DIRECTORIES FALSE "${sysroot_dir}/*")
foreach(file IN LISTS files)
execute_process(COMMAND "${toolchain_dir}/bin/arm-none-linux-gnueabihf-strip" "${file}" RESULT_VARIABLE ret)
# Check Result
if(NOT ret EQUAL 0)
# Delete Invalid Files
file(REMOVE "${file}")
endif()
endforeach()
endif()
endif()
# Install Sysroot (Skipping Empty Directories)
function(install_arm_sysroot)
file(GLOB_RECURSE files LIST_DIRECTORIES FALSE RELATIVE "${sysroot_dir}" "${sysroot_dir}/*")
foreach(file IN LISTS files)
get_filename_component(parent "${file}" DIRECTORY)
install(PROGRAMS "${sysroot_dir}/${file}" DESTINATION "${MCPI_INSTALL_DIR}/sysroot/${parent}")
endforeach()
endfunction()

View File

@ -1,84 +0,0 @@
# Locations
set(toolchain_dir "${CMAKE_CURRENT_LIST_DIR}/.prebuilt-armhf-toolchain")
set(sysroot_dir "${CMAKE_CURRENT_BINARY_DIR}/bundled-armhf-sysroot")
# Force Toolchain
set(CMAKE_C_COMPILER "${toolchain_dir}/bin/arm-none-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "${toolchain_dir}/bin/arm-none-linux-gnueabihf-g++")
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "arm")
unset(CMAKE_TOOLCHAIN_FILE CACHE)
# Download If Needed
if(NOT EXISTS "${CMAKE_C_COMPILER}")
# Pick URL
execute_process(COMMAND uname -m OUTPUT_VARIABLE arch OUTPUT_STRIP_TRAILING_WHITESPACE)
if(arch STREQUAL "x86_64")
set(toolchain_url "https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz")
set(toolchain_sha256 "aa074fa8371a4f73fecbd16bd62c8b1945f23289e26414794f130d6ccdf8e39c")
elseif(arch STREQUAL "aarch64" OR arch STREQUAL "armv8b" OR arch STREQUAL "armv8l")
set(toolchain_url "https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-aarch64-arm-none-linux-gnueabihf.tar.xz")
set(toolchain_sha256 "fccd7af76988da2b077f939eb2a78baa9935810918d2bf3f837bc74f52efa825")
else()
message(FATAL_ERROR "Unable To Download Prebuilt ARMHF Toolchain")
endif()
# Download
message(STATUS "Downloading Prebuilt ARMHF Toolchain...")
file(REMOVE_RECURSE "${toolchain_dir}")
include(FetchContent)
set(FETCHCONTENT_QUIET FALSE)
FetchContent_Declare(
prebuilt-armhf-toolchain
URL "${toolchain_url}"
URL_HASH "SHA256=${toolchain_sha256}"
SOURCE_DIR "${toolchain_dir}"
)
FetchContent_Populate(prebuilt-armhf-toolchain)
# Force Sysroot Rebuild
file(REMOVE_RECURSE "${sysroot_dir}")
endif()
# Build Sysroot
if(NOT EXISTS "${sysroot_dir}")
# Create Directory
file(MAKE_DIRECTORY "${sysroot_dir}")
# Copy Files From Toolchain
file(
COPY "${toolchain_dir}/arm-none-linux-gnueabihf/libc/"
DESTINATION "${sysroot_dir}"
USE_SOURCE_PERMISSIONS
FILES_MATCHING
PATTERN "*.so*"
)
# Delete Unneeded Files
file(REMOVE_RECURSE "${sysroot_dir}/usr/lib/audit")
# Strip Files
file(GLOB_RECURSE files LIST_DIRECTORIES FALSE "${sysroot_dir}/*")
foreach(file IN LISTS files)
execute_process(COMMAND "${toolchain_dir}/bin/arm-none-linux-gnueabihf-strip" "${file}" RESULT_VARIABLE ret)
# Check Result
if(NOT ret EQUAL 0)
# Delete Invalid Files
file(REMOVE "${file}")
endif()
endforeach()
# Setup gconv
file(
COPY "${toolchain_dir}/arm-none-linux-gnueabihf/libc/usr/lib/gconv/gconv-modules"
DESTINATION "${sysroot_dir}/usr/lib/gconv"
USE_SOURCE_PERMISSIONS
)
endif()
# Install Sysroot (Skipping Empty Directories)
file(GLOB_RECURSE files LIST_DIRECTORIES FALSE RELATIVE "${sysroot_dir}" "${sysroot_dir}/*")
foreach(file IN LISTS files)
get_filename_component(parent "${file}" DIRECTORY)
install(PROGRAMS "${sysroot_dir}/${file}" DESTINATION "${MCPI_INSTALL_DIR}/sysroot/${parent}")
endforeach()

View File

@ -9,6 +9,7 @@ macro(setup_toolchain target)
add_target_variant(unknown)
add_target_variant(none)
add_target_variant(pc)
# Find Compiler
macro(find_compiler output name)
set(possible_names "")
@ -26,13 +27,11 @@ macro(setup_toolchain target)
endmacro()
find_compiler(CMAKE_C_COMPILER "gcc")
find_compiler(CMAKE_CXX_COMPILER "g++")
# Extra
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Custom Search Paths
if(NOT DEFINED ENV{MCPI_TOOLCHAIN_USE_DEFAULT_SEARCH_PATHS})
# Find Root
set(CMAKE_FIND_ROOT_PATH "/usr/${target}" "/usr/lib/${target}" "/usr")
# pkg-config
set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/${target}/pkgconfig:/usr/${target}/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig")
endif()
set(CMAKE_FIND_ROOT_PATH "/usr/${target}" "/usr/lib/${target}" "/usr")
# pkg-config
set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/${target}/pkgconfig:/usr/${target}/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig")
endmacro()

View File

@ -1,9 +0,0 @@
# Warning
message(WARNING "i686 Builds Are Unsupported, Proceed At Your Own Risk")
# Compile For i686
include("${CMAKE_CURRENT_LIST_DIR}/base-toolchain.cmake")
# Use i686 Cross-Compiler
setup_toolchain("i686-linux-gnu")
# Details
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "i686")

View File

@ -0,0 +1,12 @@
# Read Hex Data
file(READ "${EMBED_IN}" data HEX)
# Convert Hex Data For C Compatibility
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," data "${data}")
# Get C Name
get_filename_component(name "${EMBED_IN}" NAME)
string(MAKE_C_IDENTIFIER "${name}" name)
# Write Data
file(WRITE "${EMBED_OUT}" "#include <stddef.h>\nconst unsigned char ${name}[] = {${data}};\nconst size_t ${name}_len = sizeof (${name});\n")

View File

@ -10,22 +10,24 @@ function(install_symlink target link)
endfunction()
# Embed Resources
set(util_list_dir "${CMAKE_CURRENT_LIST_DIR}")
function(embed_resource target file)
# Read Hex Data
file(READ "${file}" data HEX)
# Convert Hex Data For C Compatibility
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," data "${data}")
# Get C Name
get_filename_component(name "${file}" NAME)
string(MAKE_C_IDENTIFIER "${name}" name)
# Write Data
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" "#include <stddef.h>\nconst unsigned char ${name}[] = {${data}};\nconst size_t ${name}_len = sizeof (${name});\n")
# Add Command
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
COMMAND "${CMAKE_COMMAND}"
ARGS "-DEMBED_IN=${CMAKE_CURRENT_SOURCE_DIR}/${file}" "-DEMBED_OUT=${CMAKE_CURRENT_BINARY_DIR}/${name}.c" "-P" "${util_list_dir}/embed-resource.cmake"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${file}" "${util_list_dir}/embed-resource.cmake"
)
# Add To Target
target_sources("${target}" PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${name}.c")
# Mark Dependency
set_property(
DIRECTORY
APPEND
PROPERTY CMAKE_CONFIGURE_DEPENDS "${file}"
)
endfunction()
# Nicer Output
function(message log_level)
if((NOT MESSAGE_QUIET) OR (NOT (log_level STREQUAL "STATUS" OR log_level MATCHES "^CHECK_")))
_message("${log_level}" ${ARGN})
endif()
endfunction()

View File

@ -1,14 +1,30 @@
project(dependencies)
# LibPNG
# stb_image
if(BUILD_ARM_COMPONENTS)
add_subdirectory(libpng)
add_subdirectory(stb_image)
endif()
# Minecraft: Pi Edition
if(BUILD_ARM_COMPONENTS AND NOT MCPI_OPEN_SOURCE_ONLY)
add_subdirectory(minecraft-pi)
endif()
# Zenity (Minimal Build)
if(BUILD_NATIVE_COMPONENTS AND NOT MCPI_SERVER_MODE)
if(BUILD_NATIVE_COMPONENTS)
add_subdirectory(zenity)
endif()
# LIEF
if(BUILD_NATIVE_COMPONENTS OR BUILD_MEDIA_LAYER_CORE)
add_subdirectory(LIEF)
endif()
# Extra Runtime
add_subdirectory(runtime)
# GLFW
if(BUILD_MEDIA_LAYER_CORE)
add_subdirectory(glfw)
endif()
# UTF8-CPP
add_subdirectory(utf8cpp)
# Symbol Prcoessor
if(BUILD_ARM_COMPONENTS)
add_subdirectory(symbol-processor)
endif()

38
dependencies/LIEF/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,38 @@
project(LIEF)
# Silence Warnings
add_compile_options(-w -Wno-psabi)
## LIEF
# Options
set(BUILD_SHARED_LIBS TRUE CACHE BOOL "" FORCE)
set(LIEF_C_API FALSE CACHE BOOL "" FORCE)
set(LIEF_EXAMPLES FALSE CACHE BOOL "" FORCE)
set(LIEF_PYTHON_API FALSE CACHE BOOL "" FORCE)
set(LIEF_TESTS FALSE CACHE BOOL "" FORCE)
set(LIEF_USE_CCACHE FALSE CACHE BOOL "" FORCE)
set(LIEF_LOGGING FALSE CACHE BOOL "" FORCE)
set(LIEF_LOGGING_DEBUG FALSE CACHE BOOL "" FORCE)
set(LIEF_ENABLE_JSON FALSE CACHE BOOL "" FORCE)
set(LIEF_ELF TRUE CACHE BOOL "" FORCE)
set(LIEF_PE FALSE CACHE BOOL "" FORCE)
set(LIEF_MACHO FALSE CACHE BOOL "" FORCE)
set(LIEF_DEX FALSE CACHE BOOL "" FORCE)
set(LIEF_ART FALSE CACHE BOOL "" FORCE)
set(LIEF_OAT FALSE CACHE BOOL "" FORCE)
set(LIEF_VDEX FALSE CACHE BOOL "" FORCE)
# Download
set(MESSAGE_QUIET TRUE)
add_subdirectory(src EXCLUDE_FROM_ALL)
unset(MESSAGE_QUIET)
# Install
install(TARGETS LIB_LIEF DESTINATION "${MCPI_LIB_DIR}")
if(BUILD_ARM_COMPONENTS)
install(TARGETS LIB_LIEF EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")
endif()
# License
install(FILES src/LICENSE DESTINATION "${MCPI_LEGAL_DIR}/LIEF")

1
dependencies/LIEF/src vendored Submodule

@ -0,0 +1 @@
Subproject commit bae887e095d87e756d1bf4aa4f95a97693a97b62

View File

@ -16,16 +16,12 @@ set(GLFW_BUILD_COCOA FALSE CACHE BOOL "" FORCE)
set(GLFW_BUILD_X11 TRUE CACHE BOOL "" FORCE)
set(GLFW_BUILD_WAYLAND TRUE CACHE BOOL "" FORCE)
set(GLFW_LIBRARY_TYPE "SHARED" CACHE BOOL "" FORCE)
set(MESSAGE_QUIET TRUE)
add_subdirectory(src EXCLUDE_FROM_ALL)
# Ensure Build
add_custom_target(glfw-build ALL DEPENDS glfw)
unset(MESSAGE_QUIET)
# Install
install(TARGETS glfw DESTINATION "${MCPI_LIB_DIR}")
if(BUILD_ARM_COMPONENTS)
install(TARGETS glfw EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")
endif()
# License
install(FILES src/LICENSE.md DESTINATION "${MCPI_LEGAL_DIR}/glfw")

1
dependencies/glfw/src vendored Submodule

@ -0,0 +1 @@
Subproject commit 7b6aead9fb88b3623e3b3725ebb42670cbe4c579

View File

@ -1,44 +0,0 @@
project(libpng)
# ZLib (Needed By libpng)
add_subdirectory(zlib)
# Silence Warnings
add_compile_options(-w)
## LibPNG
# Options
set(PNG_TESTS FALSE CACHE BOOL "" FORCE)
set(PNG_NO_STDIO FALSE CACHE BOOL "" FORCE)
set(PNG_STATIC FALSE CACHE BOOL "" FORCE)
set(PNG_SHARED TRUE CACHE BOOL "" FORCE)
# Download
set(ZLIB_LIBRARY zlibstatic)
set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/zlib/src")
set(CMAKE_POLICY_DEFAULT_CMP0054 OLD) # Silence Warning
set(CMAKE_POLICY_DEFAULT_CMP0003 NEW) # Silence Warning
set(CMAKE_POLICY_DEFAULT_CMP0022 NEW) # Fix Error
set(M_LIBRARY m) # No Full Paths!
add_subdirectory(src EXCLUDE_FROM_ALL)
set(CMAKE_POLICY_DEFAULT_CMP0054 NEW) # Re-Enable New Behavior
# Setup Target
set_target_properties(png12 PROPERTIES LINK_OPTIONS "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libpng.vers") # Use Symbol Versioning
set_target_properties(png12 PROPERTIES DEBUG_POSTFIX "") # Fix LibPNG Suffix In Debug Mode
target_include_directories(png12 PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>")
foreach(zlib_include_dir IN ITEMS "${ZLIB_INCLUDE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/zlib/src")
target_include_directories(png12 PUBLIC "$<BUILD_INTERFACE:${zlib_include_dir}>")
endforeach()
# Ensure Build
add_custom_target(png12-build ALL DEPENDS png12)
# Install
install(TARGETS png12 DESTINATION "${MCPI_LIB_DIR}")
if(BUILD_ARM_COMPONENTS)
install(TARGETS png12 zlibstatic EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")
endif()
# License
install(FILES src/LICENSE DESTINATION "${MCPI_LEGAL_DIR}/libpng")

View File

@ -1,208 +0,0 @@
PNG12_0 {global:
png_libpng_ver;
png_pass_start;
png_pass_inc;
png_pass_ystart;
png_pass_yinc;
png_pass_mask;
png_pass_dsp_mask;
png_access_version_number;
png_set_sig_bytes;
png_sig_cmp;
png_check_sig;
png_create_read_struct;
png_create_write_struct;
png_get_compression_buffer_size;
png_set_compression_buffer_size;
png_reset_zstream;
png_create_read_struct_2;
png_create_write_struct_2;
png_write_chunk;
png_write_chunk_start;
png_write_chunk_data;
png_write_chunk_end;
png_create_info_struct;
png_info_init;
png_info_init_3;
png_write_info_before_PLTE;
png_write_info;
png_read_info;
png_convert_to_rfc1123;
png_convert_from_struct_tm;
png_convert_from_time_t;
png_set_expand;
png_set_expand_gray_1_2_4_to_8;
png_set_palette_to_rgb;
png_set_tRNS_to_alpha;
png_set_gray_1_2_4_to_8;
png_set_bgr;
png_set_gray_to_rgb;
png_set_rgb_to_gray;
png_set_rgb_to_gray_fixed;
png_get_rgb_to_gray_status;
png_build_grayscale_palette;
png_set_strip_alpha;
png_set_swap_alpha;
png_set_invert_alpha;
png_set_filler;
png_set_add_alpha;
png_set_swap;
png_set_packing;
png_set_packswap;
png_set_shift;
png_set_interlace_handling;
png_set_invert_mono;
png_set_background;
png_set_strip_16;
png_set_dither;
png_set_gamma;
png_permit_empty_plte;
png_set_flush;
png_write_flush;
png_start_read_image;
png_read_update_info;
png_read_rows;
png_read_row;
png_read_image;
png_write_row;
png_write_rows;
png_write_image;
png_write_end;
png_read_end;
png_destroy_info_struct;
png_destroy_read_struct;
png_destroy_write_struct;
png_set_crc_action;
png_set_filter;
png_set_filter_heuristics;
png_set_compression_level;
png_set_compression_mem_level;
png_set_compression_strategy;
png_set_compression_window_bits;
png_set_compression_method;
png_init_io;
png_set_error_fn;
png_get_error_ptr;
png_set_write_fn;
png_set_read_fn;
png_get_io_ptr;
png_set_read_status_fn;
png_set_write_status_fn;
png_set_mem_fn;
png_get_mem_ptr;
png_set_read_user_transform_fn;
png_set_write_user_transform_fn;
png_set_user_transform_info;
png_get_user_transform_ptr;
png_set_read_user_chunk_fn;
png_get_user_chunk_ptr;
png_set_progressive_read_fn;
png_get_progressive_ptr;
png_process_data;
png_progressive_combine_row;
png_malloc;
png_malloc_warn;
png_free;
png_free_data;
png_data_freer;
png_malloc_default;
png_free_default;
png_memcpy_check;
png_memset_check;
png_error;
png_chunk_error;
png_warning;
png_chunk_warning;
png_get_valid;
png_get_rowbytes;
png_get_rows;
png_set_rows;
png_get_channels;
png_get_image_width;
png_get_image_height;
png_get_bit_depth;
png_get_color_type;
png_get_filter_type;
png_get_interlace_type;
png_get_compression_type;
png_get_pixels_per_meter;
png_get_x_pixels_per_meter;
png_get_y_pixels_per_meter;
png_get_pixel_aspect_ratio;
png_get_x_offset_pixels;
png_get_y_offset_pixels;
png_get_x_offset_microns;
png_get_y_offset_microns;
png_get_signature;
png_get_bKGD;
png_set_bKGD;
png_get_cHRM;
png_get_cHRM_fixed;
png_set_cHRM;
png_set_cHRM_fixed;
png_get_gAMA;
png_get_gAMA_fixed;
png_set_gAMA;
png_set_gAMA_fixed;
png_get_hIST;
png_set_hIST;
png_get_IHDR;
png_set_IHDR;
png_get_oFFs;
png_set_oFFs;
png_get_pCAL;
png_set_pCAL;
png_get_pHYs;
png_set_pHYs;
png_get_PLTE;
png_set_PLTE;
png_get_sBIT;
png_set_sBIT;
png_get_sRGB;
png_set_sRGB;
png_set_sRGB_gAMA_and_cHRM;
png_get_iCCP;
png_set_iCCP;
png_get_sPLT;
png_set_sPLT;
png_get_text;
png_set_text;
png_get_tIME;
png_set_tIME;
png_get_tRNS;
png_set_tRNS;
png_get_sCAL;
png_set_sCAL;
png_set_keep_unknown_chunks;
png_handle_as_unknown;
png_set_unknown_chunks;
png_set_unknown_chunk_location;
png_get_unknown_chunks;
png_set_invalid;
png_read_png;
png_write_png;
png_get_copyright;
png_get_header_ver;
png_get_header_version;
png_get_libpng_ver;
png_permit_mng_features;
png_get_mmx_flagmask;
png_get_asm_flagmask;
png_get_asm_flags;
png_get_mmx_bitdepth_threshold;
png_get_mmx_rowbytes_threshold;
png_set_asm_flags;
png_set_mmx_thresholds;
png_mmx_support;
png_set_strip_error_numbers;
png_set_user_limits;
png_get_user_width_max;
png_get_user_height_max;
png_get_uint_32;
png_get_uint_16;
png_get_int_32;
png_get_uint_31;
png_save_uint_32;
png_save_int_32;
png_save_uint_16;
local: *; };

@ -1 +0,0 @@
Subproject commit 5bb5bf345aef1e62adcfe30791f4364730a2aede

View File

@ -1,16 +0,0 @@
project(zlib)
# Silence Warnings
add_compile_options(-w)
## zlib
# Download
set(CMAKE_POLICY_DEFAULT_CMP0022 NEW) # Fix Error
add_subdirectory(src EXCLUDE_FROM_ALL)
# Ensure Build
add_custom_target(zlib-build ALL DEPENDS zlibstatic)
# License
install(FILES src/README DESTINATION "${MCPI_LEGAL_DIR}/zlib")

@ -1 +0,0 @@
Subproject commit 21767c654d31d2dccdde4330529775c6c5fd5389

18
dependencies/runtime/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,18 @@
project(runtime)
## Extra Runtime
# QEMU
set(QEMU_VERSION "9.0.2")
set(RUNTIME_QEMU_ARCHIVE "${CMAKE_CURRENT_SOURCE_DIR}/../../archives/qemu-${QEMU_VERSION}.tar.xz")
if(NOT BUILD_NATIVE_COMPONENTS)
set(TRAMPOLINE_HEADERS_ONLY TRUE)
endif()
# Build
add_subdirectory(src)
# Install
if(COMMAND install_runtime)
install_runtime("${MCPI_BIN_DIR}" "${MCPI_LEGAL_DIR}")
endif()

1
dependencies/runtime/src vendored Submodule

@ -0,0 +1 @@
Subproject commit 377f9ddbc4747ca3a640231d259c0e6fcc71b4b0

30
dependencies/stb_image/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,30 @@
project(stb_image)
# Silence Warnings
add_compile_options(-w)
## stb_image
# Build
add_library(stb_image SHARED src/stb_image_impl.c)
target_include_directories(
stb_image
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:${MCPI_SDK_INCLUDE_DIR}/stb_image>"
)
target_link_libraries(stb_image PRIVATE m)
target_compile_definitions(stb_image PUBLIC STBI_ONLY_PNG)
# Install
install(TARGETS stb_image DESTINATION "${MCPI_LIB_DIR}")
install(
DIRECTORY "include/"
DESTINATION "${MCPI_SDK_INCLUDE_DIR}/stb_image"
FILES_MATCHING
PATTERN "*.h"
)
install(TARGETS stb_image EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")
# License
install(FILES include/LICENSE DESTINATION "${MCPI_LEGAL_DIR}/stb_image")

1
dependencies/stb_image/include vendored Submodule

@ -0,0 +1 @@
Subproject commit beebb24b945efdea3b9bba23affb8eb3ba8982e7

View File

@ -0,0 +1,5 @@
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image.h"
#include "stb_image_write.h"

View File

@ -0,0 +1,20 @@
project(symbol-processor)
# Install Dependencies
set(SRC "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(NODE_MODULES "${SRC}/node_modules")
function(npm_run)
execute_process(
COMMAND npm ${ARGV}
WORKING_DIRECTORY "${SRC}"
RESULT_VARIABLE RESULT
)
if(NOT RESULT EQUAL 0)
file(REMOVE_RECURSE "${NODE_MODULES}")
message(FATAL_ERROR "Unable To Run NPM Command")
endif()
endfunction()
if(NOT EXISTS "${NODE_MODULES}")
npm_run(ci --silent)
npm_run(run --silent lint)
endif()

1
dependencies/symbol-processor/src vendored Submodule

@ -0,0 +1 @@
Subproject commit f72c4f0567c62897d74c734819c11705df0bf4ee

12
dependencies/utf8cpp/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,12 @@
project(utf8cpp)
# Silence Warnings
add_compile_options(-w)
## stb_image
# Build
add_subdirectory(src EXCLUDE_FROM_ALL)
# License
install(FILES src/LICENSE DESTINATION "${MCPI_LEGAL_DIR}/utf8cpp")

1
dependencies/utf8cpp/src vendored Submodule

@ -0,0 +1 @@
Subproject commit f6780f77f6824aa0fbe69f9b97ef7d8aba26ed92

View File

@ -6,7 +6,9 @@ add_compile_options(-w)
## Zenity
# Download
set(MESSAGE_QUIET TRUE)
add_subdirectory(src EXCLUDE_FROM_ALL)
unset(MESSAGE_QUIET)
# Ensure Build
add_custom_target(zenity-build ALL DEPENDS zenity)

@ -1 +1 @@
Subproject commit d673e9aab842d7151d92eb9164872dc05e748db2
Subproject commit a7496461161c917878d58131711425e7c8e59436

View File

@ -1,104 +0,0 @@
# Architecture
## Launch Sequence
### Common
1. The launcher forks itself
1. The child process continues the launch sequence.
2. The original process monitors the child process for crashes.
### Client
1. The launcher is started by the user
1. The launcher starts several Zenity dialogs to configure MCPI-Reborn
2. The launcher replaces itself with MCPI
1. MCPI-Reborn components are loaded using ``LD_PRELOAD`` and ``LD_LIBRARY_PATH``
2. If the Media Layer Proxy is enabled, the Media Layer Proxy Client is started as a sub-process
### Server
1. The launcher is started by the user
2. The launcher replaces itself with MCPI
## Components
### Launcher
This component configures the various environmental variables required for MCPI-Reborn to work. When running in client-mode, this component will also launch several Zenity dialogs for interactive configuration.
The environmental variables configured by this component includes:
* ``LD_PRELOAD``
* ``LD_LIBRAR_PATH``
* ``MCPI_FEATURE_FLAGS``
* ``MCPI_RENDER_DISTANCE``
* ``MCPI_USERNAME``
This is always compiled for the host system's architecture.
### Media Layer
The Media Layer handles MCPI's graphics calls and user input. It replaces MCPI's native usage of SDL 1.2 with GLFW.
#### Core
This sub-component re-implements a subset of SDL 1.2 calls with GLFW. It also provides a few utility functions that are used internally by MCPI-Reborn.
The utility functions include:
* Fullscreen
* Audio
* Etc
This is always compiled for the host system's architecture unless the Media Layer Proxy is disabled.
This was created because SDL 1.2 has numerous bugs and is in-general unsupported.
#### Proxy
This sub-component must be used if the host system's architecture isn't ARM. It uses UNIX pipes to cross architectural boundaries and allow MCPI to use the Media Layer Core (which is always compiled for the host system's architecture).
It is made of two parts:
* Media Layer Proxy Server
* Links To MCPI
* Creates The UNIX Pipes
* Same External API As The Media Layer Core
* Compiled For ARM
* Media Layer Proxy Client
* Links To The Media Layer Core
* Connects To The Media Layer Proxy Server
* Uses The System's Native GLES Driver (ie. Mesa)
* Compiled For The Host System's Architecture
While proxying all Media Layer Core API calls across UNIX pipes does hurt performance, it is better than emulating the entire graphics stack.
Using this in server-mode is redundant.
#### Extras
This sub-component contains code that must always be linked directly to MCPI.
This is always compiled for ARM.
#### Headers
This sub-component includes headers for SDL, GLES, and EGL allowing easy (cross-)compilation.
### Mods
This component links directly to MCPI and patches it to modify its behavior.
This is always compiled for ARM.
### ``libreborn``
This component contains various utility functions including:
* Code Patching (ARM Only)
* Logging
* Etc
The code patching is ARM only because it relies on hard-coded ARM instructions. However, this is irrelevant since code patching is only needed in ARM code (to patch MCPI).
### ``symbols``
This component contains all MCPI symbols.
## Dependencies
MCPI-Reborn has several dependencies:
* MCPI (Bundled)
* GLFW (Only In Client Mode; Bundled)
* Open GL ES 2.0
* EGL
* OpenAL (Only In Client Mode)
* ZLib (Required By LibPNG; Bundled)
* LibPNG (Bundled)
* QEMU User Mode (Only On Non-ARM Hosts; Runtime Only)
* Zenity (Only In Client Mode; Runtime Only; Bundled)

View File

@ -1,22 +0,0 @@
# Building
## Dependencies
### Debian/Ubuntu
```sh
./scripts/install-dependencies.sh
```
## Instructions
```sh
./scripts/build.sh <client|server> <armhf|arm64|i686|amd64>
```
### Custom CMake Arguments
```sh
./scripts/setup.sh <client|server> <armhf|arm64|i686|amd64> <Custom CMake Arguments>
./scripts/build.sh <client|server> <armhf|arm64|i686|amd64>
```
### Environment Variables
* ``MCPI_TOOLCHAIN_USE_DEFAULT_SEARCH_PATHS``: Use Default CMake Search Paths Rather Than Guessing

View File

@ -1,5 +1,157 @@
# Changelog
**3.0.0**
* Modding API Revamped
* `*(unsigned char **)` Is Dead!
* Now C++ Only
* Add Peaceful Mode To Options Screen
* Proper Create New World Screen
* Proper Chat Screen
* New Feature Flags
* New Functionality
* `Animated Lava` (Enabled By Default)
* `Animated Fire` (Enabled By Default)
* `Add Cake` (Enabled By Default)
* `Use Java Beta 1.3 Light Ramp` (Enabled By Default)
* `Send Full Level When Hosting Game` (Enabled By Default)
* `Food Overlay` (Disabled By Default)
* `Add Splashes` (Enabled By Default)
* `Display Date In Select World Screen` (Enabled By Default)
* `Optimized Chunk Sorting` (Enabled By Default)
* `Fix Held Item Caching` (Enabled By Default)
* `Add Reborn Info To Options` (Enabled By Default)
* `Log FPS` (Disabled By Default)
* `Add Welcome Screen` (Enabled By Default)
* `F3 Debug Information` (Enabled By Default)
* `Multidraw Rendering` (Enabled By Default)
* `Add Missing Language Strings` (Enabled By Default)
* `Fix Pigmen Burning In The Sun` (Enabled By Default)
* `Fix Carried Grass's Bottom Texture` (Enabled By Default)
* `Hide Crosshair In Third-Person` (Enabled By Default)
* `Fix Camera Legs` (Enabled By Default)
* `Implement Crafting Remainders` (Enabled By Default)
* `Fix Door Duplication` (Enabled By Default)
* `Fix Cobweb Lighting` (Enabled By Default)
* `Fix Sneaking Syncing` (Enabled By Default)
* `Fix Fire Immunity` (Enabled By Default)
* `Fix Fire Syncing` (Enabled By Default)
* `Fix Sunlight Not Properly Setting Mobs On Fire` (Enabled By Default)
* `Stop Creative Players From Burning` (Enabled By Default)
* `Render Fire In Third-Person` (Enabled By Default)
* `Improved Water Rendering` (Enabled By Default)
* `Classic Item Count UI` (Enabled By Default)
* `Allow High-Resolution Title` (Enabled By Default)
* `Improved Classic Title Positioning` (Enabled By Default)
* `Use Updated Title` (Enabled By Default)
* `Hide Block Outline When GUI Is Hidden` (Enabled By Default)
* `Fix Crash When Generating Certain Seeds` (Enabled By Default)
* `Click Buttons On Mouse Down` (Enabled By Default)
* `3D Dropped Items` (Enabled By Default)
* `Render Entity Shadows` (Enabled By Default)
* `Render Vignette` (Enabled By Default)
* `Increase Render Chunk Size` (Enabled By Default)
* `Proper Entity Shading` (Enabled By Default)
* Existing Functionality (All Enabled By Default)
* `Fix Screen Rendering When Hiding HUD`
* `Sanitize Usernames`
* `Patch RakNet Security Bug`
* `Log RakNet Startup Errors`
* `Prevent Unnecessary Server Pinging`
* `Proper OpenGL Buffer Generation`
* `Fix Furnace Screen Visual Bug`
* `Fix Text Wrapping`
* `Fullscreen Support`
* `Always Save Chest Tile Entities`
* `Fix Transferring Durability When Using Items`
* `Fix Switching Perspective While Sneaking`
* `Log Chat Messages`
* `Log Game Status`
* `Screenshot Support`
* `Fix Camera Functionality`
* `Property Scale Animated Textures`
* Split Up `Remove Creative Mode Restrictions` Feature Flag
* `Remove Creative Mode Restrictions` (Disabled By Default)
* `Display Slot Count In Creative Mode` (Disabled By Default)
* `Force Survival Mode Inventory UI` (Disabled By Default)
* `Force Survival Mode Inventory Behavior` (Disabled By Default)
* `Maximize Creative Mode Inventory Stack Size` (Disabled By Default)
* Rename `Disable Buggy Held Item Caching` Feature Flag To `Fix Held Item Caching`
* Rename `Disable 'gui_blocks' Atlas` Feature Flag To `Regenerate "gui_blocks" Atlas`
* Add Milk Buckets
* Included In The `Add Buckets` Feature Flag
* Removed `Property Scale Animated Textures` Feature Flag
* Removed `Remove Invalid Item Background` Feature Flag
* Improve Death Messages
* Massive Build System Improvements
* Fix Item Dropping When Killing Players From The Server Console
* Fix Furnace Visual Bug When Using Lava Bucket As Fuel
* `overwrite_calls` Now Scans VTables
* Unify Server/Client Builds
* Controller Support Removed
**2.5.3**
* Add `Replace Block Highlight With Outline` Feature Flag (Enabled By Default)
* By Default, The Outline Width Is Set Using The GUI Scale
* This Can Be Overridden Using The `MCPI_BLOCK_OUTLINE_WIDTH` Environmental Variable
* Added `overwrite_calls_within` Function
**2.5.2**
* Add `3D Chest Model` Feature Flag (Enabled By Default)
* Stop Using Jenkins
* Replace `iconv`
* Replace LibPNG
**2.5.1**
* Allow Overriding Custom Skin Server Using `MCPI_SKIN_SERVER` Environmental Variable
* Fix Bug With SDK Generation
**2.5.0**
* [Custom skin support](CUSTOM_SKINS.md)!
* Add `Load Custom Skins` Feature Flag (Enabled By Default)
**2.4.9**
* Allow Overriding GUI Scale With `MCPI_GUI_SCALE` Environmental Variable
* Add `Disable Block Tinting` Feature Flag (Disabled By Default)
* Add `Disable Hostile AI In Creative Mode` Feature Flag (Enabled By Default)
* Allow Accessing Configuration At Runtime (Useful For Mods That Need To Support Multiple Versions)
**2.4.8**
* Fix Bug In `extract_from_bl_instruction`
* Update LIEF And GLFW
* Allow Mods To Access The Original GLFW Keycode For Key Events (But Better)
* More Accurate Sound
**2.4.7**
* Improve Server Performance
* Add `Add Biome Colors To Grass` Feature Flag (Disabled By Default)
* Add `Generate Caves` Feature Flag (Enabled By Default)
* Allow Mods To Access The Original GLFW Keycode For Key Events
**2.4.6**
* [Minimal Controller Support](CONTROLS.md)
* Fix Holding Left-Click When Attacking
* Fix Crashing On ARMHF
* Heavily Improved Crash Report Dialog
**2.4.5**
* Bundle QEMU
**2.4.4**
* Cache Previous Launcher Configuration
* Add `MCPI_API_PORT` Environmental Variable
* Fix Particles In Front-Facing View
* Fixed Launch Crash On Ubuntu ARM64
* PatchELF Replaced With LIEF
* Moved `3D Anaglyph` Feature Flag To Options Screen
* Add `Improved Classic Title Screen` Feature Flag (Enabled By Default)
* Add Quit button
* Add Options Button (Moved From `Fix Options Screen` Feature Flag)
* Add `Disable Speed Bridging` Feature Flag (Disabled By Default)
* Add `Disable Creative Mode Mining Delay` Feature Flag (Disabled By Default)
* Improved Feature Flag Names
* Miscellaneous Bug Fixes
* Improved Build System
**2.4.3**
* Fix Signs With CP-437
@ -17,11 +169,11 @@
* More Reliable AppImages
* CMake Refactors
* Disable Broken Touchscreen-Specific Block Outline Behavior
* Add ``Remove Forced GUI Lag (Can Break Joining Servers)`` Feature Flag (Disabled By Default)
* Add ``Add Buckets`` Feature Flag (Enabled By Default)
* Add ``Classic HUD`` Feature Flag (Enabled By Default)
* Add ``Translucent Toolbar`` Feature Flag (Enabled By Default)
* Add ``Force EGL`` Feature Flag (Disabled By Default)
* Add `Remove Forced GUI Lag (Can Break Joining Servers)` Feature Flag (Disabled By Default)
* Add `Add Buckets` Feature Flag (Enabled By Default)
* Add `Classic HUD` Feature Flag (Enabled By Default)
* Add `Translucent Toolbar` Feature Flag (Enabled By Default)
* Add `Force EGL` Feature Flag (Disabled By Default)
* Fix Sound Pitch/Volume/Attenuation
* Fix Holding Left-Click When Attacking
* Don't Force EGL (Should Fix Some NVIDIA Systems)
@ -35,7 +187,7 @@
* Bug Fixes
**2.3.11**
* ``--version`` Command Line Option
* `--version` Command Line Option
* TPS Measured In Benchmark & Server
* Front-Facing Third-Person
* GLESv1 Comparability Layer
@ -61,39 +213,39 @@
* Don't Append Hyphens To New World Name, Only Folder Names
**2.3.6**
* Fix ``Invert Y-axis`` Option Name
* Fix `Invert Y-axis` Option Name
* Improve Touch GUI Inventory In Non-Touch GUI
* New Create World Dialog
* Controlled By ``Implement Create World Dialog`` Feature Flag (Enabled By Default)
* Controlled By `Implement Create World Dialog` Feature Flag (Enabled By Default)
* Custom World Names
* Game-Mode Selection
* Custom Seeds
**2.3.5**
* Renamed Some Feature Flags
* Add ``Improved Title Background`` Feature Flag (Enabled By Default)
* Add `Improved Title Background` Feature Flag (Enabled By Default)
* Non-Touch GUI Rework
* Make ``Full Touch GUI`` Feature Flag Disabled By Default
* Add ``Force Touch GUI Button Behavior`` Feature Flag (Enabled By Default)
* Add ``Improved Button Hover Behavior`` Feature Flag (Enabled By Default)
* Make `Full Touch GUI` Feature Flag Disabled By Default
* Add `Force Touch GUI Button Behavior` Feature Flag (Enabled By Default)
* Add `Improved Button Hover Behavior` Feature Flag (Enabled By Default)
**2.3.4**
* AppImage Fixes
* Make Death Messages Customizable Server-Side
* Fix Q-Key Behavior Behavior When Editing Signs
* Add ``Force Touch Inventory`` Feature Flag (Disabled By Default)
* Add ``Fix Pause Menu`` Feature Flag (Enabled By Default)
* Add `Force Touch Inventory` Feature Flag (Disabled By Default)
* Add `Fix Pause Menu` Feature Flag (Enabled By Default)
* Enables Server Visibility Toggle Button
* Options Changes (Not Supported On Legacy)
* Add ``Fix Options Screen`` Feature Flag (Enabled By Default)
* Add `Fix Options Screen` Feature Flag (Enabled By Default)
* Adds Options Button To Classic UI Start Screen
* Removes Useless Options Toggles
* Fixes Options Toggles' Default Position
* Store Multiple Settings In `options.txt`
* ``Peaceful Mode`` Feature Flag Moved To ``game_difficulty``
* ``Smooth Lighting`` Feature Flag Moved To ``gfx_ao``
* ``Fancy Graphics`` Feature Flag Moved To ``gfx_fancygraphics``
* ``Disable Hosting LAN Worlds`` Feature Flag Moved To ``mp_server_visible_default``
* `Peaceful Mode` Feature Flag Moved To `game_difficulty`
* `Smooth Lighting` Feature Flag Moved To `gfx_ao`
* `Fancy Graphics` Feature Flag Moved To `gfx_fancygraphics`
* `Disable Hosting LAN Worlds` Feature Flag Moved To `mp_server_visible_default`
**2.3.3**
* Add More Blocks To Expanded Creative Inventory
@ -104,31 +256,31 @@
* Add More Blocks To Expanded Creative Inventory
* Fix Nether Reactor With Creative Restrictions Disabled
* Alphabetize Feature Flags
* Add ``Disable V-Sync`` Feature Flag (Disabled By Default)
* Add `Disable V-Sync` Feature Flag (Disabled By Default)
**2.3.1**
* Internal Refactor Of ``libreborn``
* Remove Use Of ``/bin/sh``
* Internal Refactor Of `libreborn`
* Remove Use Of `/bin/sh`
* Load Custom Mods First
* Use Zenity Dark Mode
* Add ``Improved Cursor Rendering`` Feature Flag (Enabled By Default)
* Add `Improved Cursor Rendering` Feature Flag (Enabled By Default)
**2.3.0**
* Switch To AppImage For Packaging
* Prevent OpenAL From Crashing When Out Of Memory
* Vendor GLFW & Zenity
* Seamless Wayland Support
* Add ``MCPI_DEBUG`` Environmental Variable
* Add ``Disable Hosting LAN Worlds`` Feature Flag (Disabled By Default)
* Add ``Fix Furnace Not Checking Item Auxiliary`` Feature Flag (Enabled By Default)
* Add ``Disable Raw Mouse Motion (Not Recommended)`` Feature Flag (Disabled By Default) For Broken X11 Setups
* Add `MCPI_DEBUG` Environmental Variable
* Add `Disable Hosting LAN Worlds` Feature Flag (Disabled By Default)
* Add `Fix Furnace Not Checking Item Auxiliary` Feature Flag (Enabled By Default)
* Add `Disable Raw Mouse Motion (Not Recommended)` Feature Flag (Disabled By Default) For Broken X11 Setups
* Added Back `~/.minecraft-pi/mods`
* Improve Build System
* Improve Documentation
**2.2.11**
* Add ``Close Current Screen On Death`` Feature Flag (Enabled By Default) To Prevent Bugs
* Fix More Furnace UI Bugs When Using "Disable 'gui_blocks' Atlas"
* Add `Close Current Screen On Death` Feature Flag (Enabled By Default) To Prevent Bugs
* Fix More Furnace UI Bugs When Using `Disable 'gui_blocks' Atlas`
**2.2.10**
* Fix Bug With Picking Up Items In "Remove Creative Mode Restrictions" Mode
@ -138,8 +290,8 @@
* Store Files In `/usr/lib`
**2.2.8**
* Add ``Hide Chat Messages`` Optional Feature Flag
* Add ``Remove Creative Mode Restrictions`` Optional Feature Flag
* Add `Hide Chat Messages` Optional Feature Flag
* Add `Remove Creative Mode Restrictions` Optional Feature Flag
* Improve GLFW->SDL Mouse Motion Event Conversion
* Performance Optimizations
* Make Majority Of Server-Specific Logging Code Also Apply To The Client
@ -171,15 +323,15 @@
* Make Missing Sound Event Cause Warning Rather Than Crash
**2.2.1**
* Prevent ``random.burp`` Sound From Crashing Game
* Prevent `random.burp` Sound From Crashing Game
* Always Cleanup Media Layer, Even On Crash
* Resolve All Sounds On Startup
**2.2.0**
* Sound Support
* Split Off ``Allow Joining Survival Servers`` From Game-Mode Mod
* Split Off `Allow Joining Survival Servers` From Game-Mode Mod
* Separate Headless Code From Server Code
* Fix Bug Where ``RakNetInstance`` Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
* Fix Bug Where `RakNetInstance` Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
* Clean-Up Code
* Remove Support For Debian Buster
@ -196,7 +348,7 @@
* Print Error Message If RakNet Fails To Start
**2.1.4**
* Fix ``RakNet::RakString`` Security Bug
* Fix `RakNet::RakString` Security Bug
**2.1.3**
* Workaround Broken Library Search Path On Some ARM 32-Bit Systems
@ -208,16 +360,16 @@
* Fix Symlink Code
**2.1.0**
* Allow Binding ``Q`` Key To Item Dropping
* Allow Binding `Q` Key To Item Dropping
* Expose More Feature Flags
* Replace ``Mob Spawning`` Feature Flag With ``Force Mob Spawning``
* Fix ``ESC`` Key In Options Menu When ``Miscellaneous Input Fixes`` Is Enabled
* Replace `Mob Spawning` Feature Flag With `Force Mob Spawning`
* Fix `ESC` Key In Options Menu When `Miscellaneous Input Fixes` Is Enabled
**2.0.9**
* Fix Translucent Preview Items In Furnace UI Being Fully Opaque When The ``gui_blocks`` Atlas Is Disabled
* Fix Translucent Preview Items In Furnace UI Being Fully Opaque When The `gui_blocks` Atlas Is Disabled
**2.0.8**
* Use Default Port In ``servers.txt`` If Not Specified
* Use Default Port In `servers.txt` If Not Specified
**2.0.7**
* Fix Sign Text Not Updating In Multiplayer When Exiting Editing UI Using Escape Button
@ -234,7 +386,7 @@
* Optimize Media Layer Proxy
**2.0.3**
* Make ``kill`` Admin Command Print Death Message
* Make `kill` Admin Command Print Death Message
**2.0.2**
* Fix Mouse Cursor Bugs

View File

@ -1,45 +0,0 @@
# Command Line Usage
## Command Line Arguments
### ``--version`` (Or ``-v``)
If you run MCPI-Reborn with ``--version`` it will print its version to ``stdout``.
### ``--print-available-feature-flags`` (Client Mode Only)
If you run MCPI-Reborn with ``--print-available-feature-flags``, it will print the available feature flags to ``stdout`` and then immediately exit.
The feature flags are printed in the following format:
```
TRUE This Flag Is On By Default
FALSE This Flag Is Off By Default
```
### ``--default`` (Client Mode Only)
If you run MCPI-Reborn with ``--default``, it will skip the startup configuration dialogs and just use the default values.
### ``--only-generate`` (Server Mode Only)
If you run MCPI-Reborn with ``--only-generate``, it will immediately exit once world generation has completed. This is mainly used for automatically testing MCPI-Reborn.
### ``--benchmark`` (Client Mode Only)
If you run MCPI-Reborn with ``--benchmark``, it will enter a simple benchmark mode. This means automatically loading a newly generated world, then rotating the camera for a period of time. When it has finished, it will then exit and print the average FPS while the world was loaded. In this mode, all user input is blocked. However you can still modify rendering settings by changing feature flags.
The world used will always be re-created on start and uses a hard-coded seed.
## Environmental Variables
### ``MCPI_DEBUG``
This enables debug logging if it is set.
### Client Mode Only
If any of the following variables aren't set, one configuration dialog will open on startup for each unset variable.
#### ``MCPI_FEATURE_FLAGS``
This corresponds to ``--print-available-feature-flags``. This is just a list of all enabled feature flags separated by ``|``.
For instance, the string ``Feature A|Feature B`` would enable both ``Feature A`` and ``Feature B`` and *disable every other available feature flag*.
#### ``MCPI_RENDER_DISTANCE``
This is the render distance. The possible values are: ``Far``, ``Normal``, ``Short``, and ``Tiny``.
#### ``MCPI_USERNAME``
This is the username.

26
docs/CONTROLS.md Normal file
View File

@ -0,0 +1,26 @@
# In-Game Controls
## Keyboard & Mouse
| Action | Function |
| --- | --- |
| W | Move Forward |
| A | Move Left |
| S | Move Backward |
| D | Move Right |
| Space | Jump |
| Shift | Sneak |
| E | Open Inventory |
| Q | Drop Item |
| Ctrl+Q | Drop Item Stack |
| 1-9 | Select Item In Toolbar/Hotbar |
| Escape | Pause |
| Tab | Lock/Unlock Mouse |
| F11 | Fullscreen |
| F2 | Screenshot |
| F1 | Hide GUI |
| F5 | Change Perspective |
| T | Open Chat |
| Mouse Movement | Camera Control |
| Scroll Wheel | Cycle Selected Item In Toolbar |
| Left-CLick | Attack/Destroy |
| Right-Click | Use Item/Place Block |

6
docs/CUSTOM_SKINS.md Normal file
View File

@ -0,0 +1,6 @@
# Custom Skins
MCPI-Reborn supports downloading custom skins from [a central skin server](https://github.com/MCPI-Revival/Skins). Skins are downloaded based on the current MCPI username.
This *does not* cache skins and *will not* work without internet access.
Custom skins can be disabled using the `Load Custom Skins` feature flag.

View File

@ -1,19 +1,14 @@
# Dedicated Server
The dedicated server is a version of Minecraft: Pi Edition modified to run in a headless environment. It loads settings from a ``server.properties`` file.
The dedicated server is a version of Minecraft: Pi Edition modified to run in a headless environment. It loads settings from a `server.properties` file.
This server is also compatible with MCPE Alpha v0.6.1[^1].
## Setup
### Debian Package
To use, install and run ``minecraft-pi-reborn-server``. It will generate the world and ``server.properties`` in the current directory.
### Docker Image
An official Docker image is also provided: [thebrokenrail/minecraft-pi-reborn-server](https://hub.docker.com/r/thebrokenrail/minecraft-pi-reborn-server).
To use, run the normal AppImage with the `--server` argument. It will generate the world and `server.properties` in the current directory.
## Server Limitations
* Player data is not saved because of limitations with MCPE LAN worlds
* An easy workaround is to place your inventory in a chest before logging off
* Survival Mode servers are incompatible with unmodded MCPI
* Survival Mode servers are incompatible with un-modded MCPI
[^1]: The exception to this is buckets, those will crash MCPE players.
[^1]: The exception to this is buckets and other modded items, those will crash MCPE players.

70
docs/GETTING_STARTED.md Normal file
View File

@ -0,0 +1,70 @@
---
gitea: none
include_toc: true
---
# Getting Started
Welcome to the official guide for setting up Minecraft: Pi Edition: Reborn (also known as MCPI-Reborn)! This document will help you through the installation and setup process.
## System Requirements
MCPI-Reborn requires support for OpenGL ES v2.0 (unlike the original game, which used OpenGL ES v1.1). It also only supports Linux-based systems.
In addition, while the original game could only be run on the Raspberry Pi, MCPI-Reborn is much more flexible. It supports running on 32-bit ARM (known as `armhf`), 64-bit ARM (known as `arm64`), and 64-bit x86 (known as `amd64`).
## Installation
There are three supported ways to install MCPI-Reborn.
### AppImage
The first supported way to install MCPI-Reborn is with an [AppImage](https://appimage.org). An AppImage is a portable application format that allows users to run software without installation.
To run MCPI-Reborn, all you need to do is [download the latest AppImage](https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/releases/latest) for your architecture and run it.
More details can be found [here](https://docs.appimage.org/introduction/quickstart.html#how-to-run-an-appimage).
<details>
<summary><b>Additional System Requirements</b></summary>
The AppImage requires Debian Bullseye or higher. This is equivalent to Ubuntu 20.04.
It also requires some additional packages. To install them, run:
```sh
sudo apt install -y libfuse2 libgtk-3-0 libopenal1 libglib2.0-0
```
</details>
### Flatpak
The next method is the official [Flatpak](https://www.flatpak.org/). This method has the additional benefit of built-in sandboxing. Unfortunately, it does not support 32-bit ARM systems.
It can be installed through [Flathub](https://flathub.org/apps/details/com.thebrokenrail.MCPIReborn).
### Pi-Apps
The final supported method is [Pi-Apps](https://github.com/Botspot/pi-apps). It is a ["well-maintained collection of app installation-scripts"](https://github.com/Botspot/pi-apps#:~:text=well-maintained%20collection%20of%20app%20installation-scripts) that includes support for MCPI-Reborn.
The list of systems supported by Pi-Apps can be found [here](https://github.com/Botspot/pi-apps?tab=readme-ov-file#supported-systems).
## Managing Game Data
Just as regular Minecraft stores game data at `~/.minecraft`, MCPI-Reborn uses `~/.minecraft-pi`[^1]. This is the profile directory and is where your worlds, screenshots, and game settings are stored.
The profile directory can easily be accessed by opening MCPI-Reborn and going to `Options -> Reborn -> Profile Directory`.
## Sound
One of MCPI-Reborn's most important modifications is the addition of a sound engine. However, due to copyright limitations, Minecraft's sounds cannot be distributed with MCPI-Reborn and must be installed manually.
Fortunately, installing the sound data is simple:
1. Obtain a valid Minecraft: Pocket Edition v0.6.1[^2] APK file.
2. Extract `lib/*/libminecraftpe.so` from the APK.
3. Create the directory `<Profile Directory>/overrides` if it does not already exist.
4. Copy `libminecraftpe.so` into `<Profile Directory>/overrides`.
5. Sound should now be fully functional!
## Custom Textures
MCPI-Reborn allows users to easily use custom textures through the use of an "overrides directory." Any files placed in this directory will automatically replace their equivalent file in MCPI-Reborn.
For instance, to override `data/images/terrain.png`, you would copy the replacement file to `<Overrides Folder>/images/terrain.png`.
The overrides directory is located at `<Profile Directory>/overrides`.
## Discord
If you have any questions or just want to talk about Minecraft: Pi Edition, there is an [official Discord server](https://discord.com/invite/aDqejQGMMy)!
[^1]: When using the Flatpak, the profile directory is located at `~/.var/app/com.thebrokenrail.MCPIReborn/.minecraft-pi`.
[^2]: This is not a strict requirement; a Minecraft: Pocket Edition v0.8.1 APK would likely work, but it is not guaranteed.

View File

@ -1,27 +0,0 @@
# Installation
## AppImage
Download packages [here](https://jenkins.thebrokenrail.com/job/minecraft-pi-reborn/job/master/lastSuccessfulBuild/artifact/out/).
### System Requirements
* Debian Buster/Ubuntu 18.04 Or Higher
* QEMU User-Mode
* Debian/Ubuntu: ``sudo apt install qemu-user``
* Arch: ``sudo pacman -Sy qemu-user``
* Client-Only Dependencies
* Graphics Drivers
* GTK+ 3
* Debian/Ubuntu: ``sudo apt install libgtk-3-0``
* Arch: ``sudo pacman -Sy gtk3``
* OpenAL
* Debian/Ubuntu: ``sudo apt install libopenal1``
* Arch: ``sudo pacman -Sy openal``
### Running
Follow [these](https://docs.appimage.org/introduction/quickstart.html#how-to-run-an-appimage) instructions.
## Flatpak
<a href="https://flathub.org/apps/details/com.thebrokenrail.MCPIReborn"><img width="240" alt="Download On Flathub" src="https://flathub.org/assets/badges/flathub-badge-en.svg" /></a>
### Note
Game data is stored in ``~/.var/app/com.thebrokenrail.MCPIReborn/.minecraft-pi`` instead of ``~/.minecraft-pi``.

View File

@ -5,9 +5,9 @@ MCPI-Reborn supports two ways to play multiplayer.
This is also supported by vanilla MCPI. Just load a world in MCPI and other devices on the network can join.
## External Servers
Unlike vanilla MCPI, MCPI-Reborn allows you to natively join a server outside of the local network. Just modify ``~/.minecraft-pi/servers.txt`` and it should show up in MCPI's server list.
Unlike vanilla MCPI, MCPI-Reborn allows you to natively join a server outside of the local network. Just modify `~/.minecraft-pi/servers.txt` and it should show up in MCPI's server list.
### Example ``~/.minecraft-pi/servers.txt``
### Example `~/.minecraft-pi/servers.txt`
```
# Default Port Is 19132
example.com

View File

@ -1,6 +0,0 @@
# Overriding Assets
To make overriding assets easier, MCPI-Reborn provides an overrides folder. Any file located in Minecraft: Pi Edition's ``data`` folder can be overridden by placing a file with the same name and path in the overrides folder. The overrides folder is located at ``~/.minecraft-pi/overrides``.
## Examples
- ``data/images/terrain.png`` -> ``~/.minecraft-pi/overrides/images/terrain.png``
- ``data/lang/en_US.lang`` -> ``~/.minecraft-pi/overrides/lang/en_US.lang``

View File

@ -1,12 +1,9 @@
# Documentation
* [View Installation](INSTALL.md)
* [View Overriding Assets](OVERRIDING_ASSETS.md)
* [View Getting Started](GETTING_STARTED.md)
* [View Dedicated Server](DEDICATED_SERVER.md)
* [View Credits](CREDITS.md)
* [View Terminology](TERMINOLOGY.md)
* [View Building](BUILDING.md)
* [View Architecture](ARCHITECTURE.md)
* [View Command Line Arguments](COMMAND_LINE.md)
* [View Multiplayer](MULTIPLAYER.md)
* [View Sound](SOUND.md)
* [View In-Game Controls](CONTROLS.md)
* [View Custom Skins](CUSTOM_SKINS.md)
* [View Changelog](CHANGELOG.md)

View File

@ -1,7 +0,0 @@
# Sound
One of MCPI-Reborn's main modifications is a sound-engine since MCPI doesn't include one by default[^1]. However, it can't be used out-of-box because MCPI doesn't contain any sound data and MCPI-Reborn can't include it because of copyright.
MCPE's sound data can be extracted from any MCPE v0.6.1[^2] APK file, just place its `libminecraftpe.so` into `~/.minecraft-pi/overrides` and you should have sound!
[^1]: The mute button is just leftover code from MCPE, it doesn't actually do anything in un-modded MCPI, however it is connected to MCPI-Reborn's sound-engine.
[^2]: This isn't a hard limit, an MCPE v0.8.1 APK would probably work, but don't rely on it.

View File

@ -1,19 +1,11 @@
# Example Mods
This is an example of a mod that cane be built using the modding SDK.
These are example mods that can be built using the modding SDK.
* **Expanded Creative Mod**: This specific mod adds even more items and blocks to the Creative Inventory. It was originally by [@Bigjango13](https://github.com/bigjango13).
* **Chat Commands Mod**: This specific mod makes an chat message starting with a ``/`` handled by the MCPI API.
* **Chat Commands Mod**: This specific mod makes a chat message starting with `/` handled by the MCPI API.
* **Recipes Mod**: This specific mod demos custom recipes.
## The SDK
The modding SDK is a collection of exported CMake targets that allows anyone to create their own MCPI mod!
The SDK is copied to ``~/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cmake`` whenever MCPI-Reborn is started.
## How do I use this?
```sh
mkdir build
cd build
cmake ..
cp libexpanded-creative.so ~/.minecraft-pi/mods
```
The SDK is copied to `~/.minecraft-pi/sdk` whenever MCPI-Reborn is started.

26
example-mods/build.sh Executable file
View File

@ -0,0 +1,26 @@
#!/bin/sh
set -e
# Create Output Directory
cd "$(dirname "$0")"
ROOT="$(pwd)"
OUT="${ROOT}/out"
rm -rf "${OUT}"
mkdir -p "${OUT}"
# Build
build() {
cd "${ROOT}/$1"
# Build
rm -rf build
mkdir build
cd build
cmake -GNinja ..
cmake --build .
# Copy Result
cp lib*.so "${OUT}"
}
build chat-commands
build expanded-creative
build recipes

View File

@ -3,13 +3,15 @@ cmake_minimum_required(VERSION 3.16.0)
# Build For ARM
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "arm")
# Start Project
project(chat-commands)
# Include SDK
include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cmake")
include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn/sdk/sdk.cmake")
# Build
add_library(chat-commands SHARED chat-commands.cpp)
target_link_libraries(chat-commands mods-headers reborn-patch symbols chat misc)
target_link_libraries(chat-commands mods reborn-patch symbols)

View File

@ -1,25 +1,41 @@
// Headers
#include <libreborn/libreborn.h>
#include <symbols/minecraft.h>
#include <mods/chat/chat.h>
#include <mods/misc/misc.h>
#include <mods/server/server.h>
// The Actual Mod
HOOK(chat_handle_packet_send, void, (unsigned char *minecraft, unsigned char *packet)) {
HOOK(chat_handle_packet_send, void, (const Minecraft *minecraft, ChatPacket *packet)) {
// Get Message
char *message = *(char **) (packet + ChatPacket_message_property_offset);
const char *message = packet->message.c_str();
if (message[0] == '/') {
// API Command
unsigned char *gui = minecraft + Minecraft_gui_property_offset;
std::string out = chat_send_api_command(minecraft, &message[1]);
Minecraft *mc = (Minecraft *) minecraft;
Gui *gui = &mc->gui;
std::string out = chat_send_api_command(mc, (char *) &message[1]);
if (out.length() > 0 && out[out.length() - 1] == '\n') {
out[out.length() - 1] = '\0';
}
misc_add_message(gui, out.c_str());
gui->addMessage(out);
} else {
// Call Original Method
ensure_chat_handle_packet_send();
(*real_chat_handle_packet_send)(minecraft, packet);
real_chat_handle_packet_send()(minecraft, packet);
}
}
// Add Server Command
HOOK(server_get_commands, std::vector<ServerCommand> *, (Minecraft *minecraft, ServerSideNetworkHandler *server_side_network_handler)) {
// Call Original Method
std::vector<ServerCommand> *commands = real_server_get_commands()(minecraft, server_side_network_handler);
// Add Command
commands->push_back({
.name = "greet",
.comment = "Example Custom Command",
.callback = [](__attribute__((unused)) const std::string &cmd) {
INFO("Hello World!");
}
});
// Return
return commands;
}

View File

@ -3,13 +3,15 @@ cmake_minimum_required(VERSION 3.16.0)
# Build For ARM
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "arm")
# Start Project
project(expanded-creative)
# Include SDK
include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cmake")
include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn/sdk/sdk.cmake")
# Build
add_library(expanded-creative SHARED expanded-creative.cpp)
target_link_libraries(expanded-creative mods-headers reborn-patch symbols misc)
target_link_libraries(expanded-creative mods reborn-patch symbols)

View File

@ -1,634 +1,632 @@
// Headers
#include <libreborn/libreborn.h>
#include <symbols/minecraft.h>
#include <mods/misc/misc.h>
// The Actual Mod
static void Inventory_setupDefault_FillingContainer_addItem_call_injection(unsigned char *filling_container) {
static void Inventory_setupDefault_FillingContainer_addItem_call_injection(FillingContainer *filling_container) {
ItemInstance *fire_instance = new ItemInstance;
ALLOC_CHECK(fire_instance);
fire_instance->count = 255;
fire_instance->auxiliary = 0;
fire_instance->id = 51;
(*FillingContainer_addItem)(filling_container, fire_instance);
filling_container->addItem(fire_instance);
ItemInstance *mushroomStew_instance = new ItemInstance;
ALLOC_CHECK(mushroomStew_instance);
mushroomStew_instance->count = 255;
mushroomStew_instance->auxiliary = 0;
mushroomStew_instance->id = 282;
(*FillingContainer_addItem)(filling_container, mushroomStew_instance);
filling_container->addItem(mushroomStew_instance);
ItemInstance *steak_instance = new ItemInstance;
ALLOC_CHECK(steak_instance);
steak_instance->count = 255;
steak_instance->auxiliary = 0;
steak_instance->id = 364;
(*FillingContainer_addItem)(filling_container, steak_instance);
filling_container->addItem(steak_instance);
ItemInstance *cookedChicken_instance = new ItemInstance;
ALLOC_CHECK(cookedChicken_instance);
cookedChicken_instance->count = 255;
cookedChicken_instance->auxiliary = 0;
cookedChicken_instance->id = 366;
(*FillingContainer_addItem)(filling_container, cookedChicken_instance);
filling_container->addItem(cookedChicken_instance);
ItemInstance *porkCooked_instance = new ItemInstance;
ALLOC_CHECK(porkCooked_instance);
porkCooked_instance->count = 255;
porkCooked_instance->auxiliary = 0;
porkCooked_instance->id = 320;
(*FillingContainer_addItem)(filling_container, porkCooked_instance);
filling_container->addItem(porkCooked_instance);
ItemInstance *apple_instance = new ItemInstance;
ALLOC_CHECK(apple_instance);
apple_instance->count = 255;
apple_instance->auxiliary = 0;
apple_instance->id = 260;
(*FillingContainer_addItem)(filling_container, apple_instance);
filling_container->addItem(apple_instance);
ItemInstance *tallGrass_instance = new ItemInstance;
ALLOC_CHECK(tallGrass_instance);
tallGrass_instance->count = 255;
tallGrass_instance->auxiliary = 0;
tallGrass_instance->id = 31;
(*FillingContainer_addItem)(filling_container, tallGrass_instance);
filling_container->addItem(tallGrass_instance);
ItemInstance *crops_instance = new ItemInstance;
ALLOC_CHECK(crops_instance);
crops_instance->count = 255;
crops_instance->auxiliary = 0;
crops_instance->id = 59;
(*FillingContainer_addItem)(filling_container, crops_instance);
filling_container->addItem(crops_instance);
ItemInstance *farmland_instance = new ItemInstance;
ALLOC_CHECK(farmland_instance);
farmland_instance->count = 255;
farmland_instance->auxiliary = 0;
farmland_instance->id = 60;
(*FillingContainer_addItem)(filling_container, farmland_instance);
filling_container->addItem(farmland_instance);
ItemInstance *activeFurnace_instance = new ItemInstance;
ALLOC_CHECK(activeFurnace_instance);
activeFurnace_instance->count = 255;
activeFurnace_instance->auxiliary = 0;
activeFurnace_instance->id = 62;
(*FillingContainer_addItem)(filling_container, activeFurnace_instance);
filling_container->addItem(activeFurnace_instance);
ItemInstance *ironDoor_instance = new ItemInstance;
ALLOC_CHECK(ironDoor_instance);
ironDoor_instance->count = 255;
ironDoor_instance->auxiliary = 0;
ironDoor_instance->id = 330;
(*FillingContainer_addItem)(filling_container, ironDoor_instance);
filling_container->addItem(ironDoor_instance);
ItemInstance *activeRedstoneOre_instance = new ItemInstance;
ALLOC_CHECK(activeRedstoneOre_instance);
activeRedstoneOre_instance->count = 255;
activeRedstoneOre_instance->auxiliary = 0;
activeRedstoneOre_instance->id = 74;
(*FillingContainer_addItem)(filling_container, activeRedstoneOre_instance);
filling_container->addItem(activeRedstoneOre_instance);
ItemInstance *pumkinStem_instance = new ItemInstance;
ALLOC_CHECK(pumkinStem_instance);
pumkinStem_instance->count = 255;
pumkinStem_instance->auxiliary = 0;
pumkinStem_instance->id = 105;
(*FillingContainer_addItem)(filling_container, pumkinStem_instance);
filling_container->addItem(pumkinStem_instance);
ItemInstance *newGrass_instance = new ItemInstance;
ALLOC_CHECK(newGrass_instance);
newGrass_instance->count = 255;
newGrass_instance->auxiliary = 0;
newGrass_instance->id = 253;
(*FillingContainer_addItem)(filling_container, newGrass_instance);
filling_container->addItem(newGrass_instance);
ItemInstance *reserved6_instance = new ItemInstance;
ALLOC_CHECK(reserved6_instance);
reserved6_instance->count = 255;
reserved6_instance->auxiliary = 0;
reserved6_instance->id = 1;
(*FillingContainer_addItem)(filling_container, reserved6_instance);
filling_container->addItem(reserved6_instance);
ItemInstance *doubleStoneSlab_instance = new ItemInstance;
ALLOC_CHECK(doubleStoneSlab_instance);
doubleStoneSlab_instance->count = 255;
doubleStoneSlab_instance->auxiliary = 0;
doubleStoneSlab_instance->id = 43;
(*FillingContainer_addItem)(filling_container, doubleStoneSlab_instance);
filling_container->addItem(doubleStoneSlab_instance);
ItemInstance *arrow_instance = new ItemInstance;
ALLOC_CHECK(arrow_instance);
arrow_instance->count = 255;
arrow_instance->auxiliary = 0;
arrow_instance->id = 262;
(*FillingContainer_addItem)(filling_container, arrow_instance);
filling_container->addItem(arrow_instance);
ItemInstance *coal_instance = new ItemInstance;
ALLOC_CHECK(coal_instance);
coal_instance->count = 255;
coal_instance->auxiliary = 0;
coal_instance->id = 263;
(*FillingContainer_addItem)(filling_container, coal_instance);
filling_container->addItem(coal_instance);
ItemInstance *diamond_instance = new ItemInstance;
ALLOC_CHECK(diamond_instance);
diamond_instance->count = 255;
diamond_instance->auxiliary = 0;
diamond_instance->id = 264;
(*FillingContainer_addItem)(filling_container, diamond_instance);
filling_container->addItem(diamond_instance);
ItemInstance *ironIngot_instance = new ItemInstance;
ALLOC_CHECK(ironIngot_instance);
ironIngot_instance->count = 255;
ironIngot_instance->auxiliary = 0;
ironIngot_instance->id = 265;
(*FillingContainer_addItem)(filling_container, ironIngot_instance);
filling_container->addItem(ironIngot_instance);
ItemInstance *goldIngot_instance = new ItemInstance;
ALLOC_CHECK(goldIngot_instance);
goldIngot_instance->count = 255;
goldIngot_instance->auxiliary = 0;
goldIngot_instance->id = 266;
(*FillingContainer_addItem)(filling_container, goldIngot_instance);
filling_container->addItem(goldIngot_instance);
ItemInstance *woodSword_instance = new ItemInstance;
ALLOC_CHECK(woodSword_instance);
woodSword_instance->count = 255;
woodSword_instance->auxiliary = 0;
woodSword_instance->id = 268;
(*FillingContainer_addItem)(filling_container, woodSword_instance);
filling_container->addItem(woodSword_instance);
ItemInstance *woodShovel_instance = new ItemInstance;
ALLOC_CHECK(woodShovel_instance);
woodShovel_instance->count = 255;
woodShovel_instance->auxiliary = 0;
woodShovel_instance->id = 269;
(*FillingContainer_addItem)(filling_container, woodShovel_instance);
filling_container->addItem(woodShovel_instance);
ItemInstance *woodPickaxe_instance = new ItemInstance;
ALLOC_CHECK(woodPickaxe_instance);
woodPickaxe_instance->count = 255;
woodPickaxe_instance->auxiliary = 0;
woodPickaxe_instance->id = 270;
(*FillingContainer_addItem)(filling_container, woodPickaxe_instance);
filling_container->addItem(woodPickaxe_instance);
ItemInstance *woodAxe_instance = new ItemInstance;
ALLOC_CHECK(woodAxe_instance);
woodAxe_instance->count = 255;
woodAxe_instance->auxiliary = 0;
woodAxe_instance->id = 271;
(*FillingContainer_addItem)(filling_container, woodAxe_instance);
filling_container->addItem(woodAxe_instance);
ItemInstance *stoneSword_instance = new ItemInstance;
ALLOC_CHECK(stoneSword_instance);
stoneSword_instance->count = 255;
stoneSword_instance->auxiliary = 0;
stoneSword_instance->id = 272;
(*FillingContainer_addItem)(filling_container, stoneSword_instance);
filling_container->addItem(stoneSword_instance);
ItemInstance *stoneShovel_instance = new ItemInstance;
ALLOC_CHECK(stoneShovel_instance);
stoneShovel_instance->count = 255;
stoneShovel_instance->auxiliary = 0;
stoneShovel_instance->id = 273;
(*FillingContainer_addItem)(filling_container, stoneShovel_instance);
filling_container->addItem(stoneShovel_instance);
ItemInstance *stonePickaxe_instance = new ItemInstance;
ALLOC_CHECK(stonePickaxe_instance);
stonePickaxe_instance->count = 255;
stonePickaxe_instance->auxiliary = 0;
stonePickaxe_instance->id = 274;
(*FillingContainer_addItem)(filling_container, stonePickaxe_instance);
filling_container->addItem(stonePickaxe_instance);
ItemInstance *stoneAxe_instance = new ItemInstance;
ALLOC_CHECK(stoneAxe_instance);
stoneAxe_instance->count = 255;
stoneAxe_instance->auxiliary = 0;
stoneAxe_instance->id = 275;
(*FillingContainer_addItem)(filling_container, stoneAxe_instance);
filling_container->addItem(stoneAxe_instance);
ItemInstance *shovelIron_instance = new ItemInstance;
ALLOC_CHECK(shovelIron_instance);
shovelIron_instance->count = 255;
shovelIron_instance->auxiliary = 0;
shovelIron_instance->id = 256;
(*FillingContainer_addItem)(filling_container, shovelIron_instance);
filling_container->addItem(shovelIron_instance);
ItemInstance *ironPick_instance = new ItemInstance;
ALLOC_CHECK(ironPick_instance);
ironPick_instance->count = 255;
ironPick_instance->auxiliary = 0;
ironPick_instance->id = 257;
(*FillingContainer_addItem)(filling_container, ironPick_instance);
filling_container->addItem(ironPick_instance);
ItemInstance *ironAxe_instance = new ItemInstance;
ALLOC_CHECK(ironAxe_instance);
ironAxe_instance->count = 255;
ironAxe_instance->auxiliary = 0;
ironAxe_instance->id = 258;
(*FillingContainer_addItem)(filling_container, ironAxe_instance);
filling_container->addItem(ironAxe_instance);
ItemInstance *diamondSword_instance = new ItemInstance;
ALLOC_CHECK(diamondSword_instance);
diamondSword_instance->count = 255;
diamondSword_instance->auxiliary = 0;
diamondSword_instance->id = 276;
(*FillingContainer_addItem)(filling_container, diamondSword_instance);
filling_container->addItem(diamondSword_instance);
ItemInstance *diamondShovel_instance = new ItemInstance;
ALLOC_CHECK(diamondShovel_instance);
diamondShovel_instance->count = 255;
diamondShovel_instance->auxiliary = 0;
diamondShovel_instance->id = 277;
(*FillingContainer_addItem)(filling_container, diamondShovel_instance);
filling_container->addItem(diamondShovel_instance);
ItemInstance *diamondPickaxe_instance = new ItemInstance;
ALLOC_CHECK(diamondPickaxe_instance);
diamondPickaxe_instance->count = 255;
diamondPickaxe_instance->auxiliary = 0;
diamondPickaxe_instance->id = 278;
(*FillingContainer_addItem)(filling_container, diamondPickaxe_instance);
filling_container->addItem(diamondPickaxe_instance);
ItemInstance *diamondAxe_instance = new ItemInstance;
ALLOC_CHECK(diamondAxe_instance);
diamondAxe_instance->count = 255;
diamondAxe_instance->auxiliary = 0;
diamondAxe_instance->id = 279;
(*FillingContainer_addItem)(filling_container, diamondAxe_instance);
filling_container->addItem(diamondAxe_instance);
ItemInstance *magicWand_instance = new ItemInstance;
ALLOC_CHECK(magicWand_instance);
magicWand_instance->count = 255;
magicWand_instance->auxiliary = 0;
magicWand_instance->id = 280;
(*FillingContainer_addItem)(filling_container, magicWand_instance);
filling_container->addItem(magicWand_instance);
ItemInstance *bowl_instance = new ItemInstance;
ALLOC_CHECK(bowl_instance);
bowl_instance->count = 255;
bowl_instance->auxiliary = 0;
bowl_instance->id = 281;
(*FillingContainer_addItem)(filling_container, bowl_instance);
filling_container->addItem(bowl_instance);
ItemInstance *goldSword_instance = new ItemInstance;
ALLOC_CHECK(goldSword_instance);
goldSword_instance->count = 255;
goldSword_instance->auxiliary = 0;
goldSword_instance->id = 283;
(*FillingContainer_addItem)(filling_container, goldSword_instance);
filling_container->addItem(goldSword_instance);
ItemInstance *goldShovel_instance = new ItemInstance;
ALLOC_CHECK(goldShovel_instance);
goldShovel_instance->count = 255;
goldShovel_instance->auxiliary = 0;
goldShovel_instance->id = 284;
(*FillingContainer_addItem)(filling_container, goldShovel_instance);
filling_container->addItem(goldShovel_instance);
ItemInstance *goldPickaxe_instance = new ItemInstance;
ALLOC_CHECK(goldPickaxe_instance);
goldPickaxe_instance->count = 255;
goldPickaxe_instance->auxiliary = 0;
goldPickaxe_instance->id = 285;
(*FillingContainer_addItem)(filling_container, goldPickaxe_instance);
filling_container->addItem(goldPickaxe_instance);
ItemInstance *goldAxe_instance = new ItemInstance;
ALLOC_CHECK(goldAxe_instance);
goldAxe_instance->count = 255;
goldAxe_instance->auxiliary = 0;
goldAxe_instance->id = 286;
(*FillingContainer_addItem)(filling_container, goldAxe_instance);
filling_container->addItem(goldAxe_instance);
ItemInstance *string_instance = new ItemInstance;
ALLOC_CHECK(string_instance);
string_instance->count = 255;
string_instance->auxiliary = 0;
string_instance->id = 287;
(*FillingContainer_addItem)(filling_container, string_instance);
filling_container->addItem(string_instance);
ItemInstance *feather_instance = new ItemInstance;
ALLOC_CHECK(feather_instance);
feather_instance->count = 255;
feather_instance->auxiliary = 0;
feather_instance->id = 288;
(*FillingContainer_addItem)(filling_container, feather_instance);
filling_container->addItem(feather_instance);
ItemInstance *gunpowder_instance = new ItemInstance;
ALLOC_CHECK(gunpowder_instance);
gunpowder_instance->count = 255;
gunpowder_instance->auxiliary = 0;
gunpowder_instance->id = 289;
(*FillingContainer_addItem)(filling_container, gunpowder_instance);
filling_container->addItem(gunpowder_instance);
ItemInstance *woodHoe_instance = new ItemInstance;
ALLOC_CHECK(woodHoe_instance);
woodHoe_instance->count = 255;
woodHoe_instance->auxiliary = 0;
woodHoe_instance->id = 290;
(*FillingContainer_addItem)(filling_container, woodHoe_instance);
filling_container->addItem(woodHoe_instance);
ItemInstance *stoneHoe_instance = new ItemInstance;
ALLOC_CHECK(stoneHoe_instance);
stoneHoe_instance->count = 255;
stoneHoe_instance->auxiliary = 0;
stoneHoe_instance->id = 291;
(*FillingContainer_addItem)(filling_container, stoneHoe_instance);
filling_container->addItem(stoneHoe_instance);
ItemInstance *flint1_instance = new ItemInstance;
ALLOC_CHECK(flint1_instance);
flint1_instance->count = 255;
flint1_instance->auxiliary = 0;
flint1_instance->id = 292;
(*FillingContainer_addItem)(filling_container, flint1_instance);
filling_container->addItem(flint1_instance);
ItemInstance *diamondHoe_instance = new ItemInstance;
ALLOC_CHECK(diamondHoe_instance);
diamondHoe_instance->count = 255;
diamondHoe_instance->auxiliary = 0;
diamondHoe_instance->id = 293;
(*FillingContainer_addItem)(filling_container, diamondHoe_instance);
filling_container->addItem(diamondHoe_instance);
ItemInstance *goldHoe_instance = new ItemInstance;
ALLOC_CHECK(goldHoe_instance);
goldHoe_instance->count = 255;
goldHoe_instance->auxiliary = 0;
goldHoe_instance->id = 294;
(*FillingContainer_addItem)(filling_container, goldHoe_instance);
filling_container->addItem(goldHoe_instance);
ItemInstance *seeds_instance = new ItemInstance;
ALLOC_CHECK(seeds_instance);
seeds_instance->count = 255;
seeds_instance->auxiliary = 0;
seeds_instance->id = 295;
(*FillingContainer_addItem)(filling_container, seeds_instance);
filling_container->addItem(seeds_instance);
ItemInstance *wheat_instance = new ItemInstance;
ALLOC_CHECK(wheat_instance);
wheat_instance->count = 255;
wheat_instance->auxiliary = 0;
wheat_instance->id = 296;
(*FillingContainer_addItem)(filling_container, wheat_instance);
filling_container->addItem(wheat_instance);
ItemInstance *bread_instance = new ItemInstance;
ALLOC_CHECK(bread_instance);
bread_instance->count = 255;
bread_instance->auxiliary = 0;
bread_instance->id = 297;
(*FillingContainer_addItem)(filling_container, bread_instance);
filling_container->addItem(bread_instance);
ItemInstance *diamondHelm_instance = new ItemInstance;
ALLOC_CHECK(diamondHelm_instance);
diamondHelm_instance->count = 255;
diamondHelm_instance->auxiliary = 0;
diamondHelm_instance->id = 310;
(*FillingContainer_addItem)(filling_container, diamondHelm_instance);
filling_container->addItem(diamondHelm_instance);
ItemInstance *diamondChest_instance = new ItemInstance;
ALLOC_CHECK(diamondChest_instance);
diamondChest_instance->count = 255;
diamondChest_instance->auxiliary = 0;
diamondChest_instance->id = 311;
(*FillingContainer_addItem)(filling_container, diamondChest_instance);
filling_container->addItem(diamondChest_instance);
ItemInstance *diamondLeg_instance = new ItemInstance;
ALLOC_CHECK(diamondLeg_instance);
diamondLeg_instance->count = 255;
diamondLeg_instance->auxiliary = 0;
diamondLeg_instance->id = 312;
(*FillingContainer_addItem)(filling_container, diamondLeg_instance);
filling_container->addItem(diamondLeg_instance);
ItemInstance *diamondBoot_instance = new ItemInstance;
ALLOC_CHECK(diamondBoot_instance);
diamondBoot_instance->count = 255;
diamondBoot_instance->auxiliary = 0;
diamondBoot_instance->id = 313;
(*FillingContainer_addItem)(filling_container, diamondBoot_instance);
filling_container->addItem(diamondBoot_instance);
ItemInstance *leatherCap_instance = new ItemInstance;
ALLOC_CHECK(leatherCap_instance);
leatherCap_instance->count = 255;
leatherCap_instance->auxiliary = 0;
leatherCap_instance->id = 298;
(*FillingContainer_addItem)(filling_container, leatherCap_instance);
filling_container->addItem(leatherCap_instance);
ItemInstance *leatherShirt_instance = new ItemInstance;
ALLOC_CHECK(leatherShirt_instance);
leatherShirt_instance->count = 255;
leatherShirt_instance->auxiliary = 0;
leatherShirt_instance->id = 299;
(*FillingContainer_addItem)(filling_container, leatherShirt_instance);
filling_container->addItem(leatherShirt_instance);
ItemInstance *leatherPants_instance = new ItemInstance;
ALLOC_CHECK(leatherPants_instance);
leatherPants_instance->count = 255;
leatherPants_instance->auxiliary = 0;
leatherPants_instance->id = 300;
(*FillingContainer_addItem)(filling_container, leatherPants_instance);
filling_container->addItem(leatherPants_instance);
ItemInstance *leatherBoots_instance = new ItemInstance;
ALLOC_CHECK(leatherBoots_instance);
leatherBoots_instance->count = 255;
leatherBoots_instance->auxiliary = 0;
leatherBoots_instance->id = 301;
(*FillingContainer_addItem)(filling_container, leatherBoots_instance);
filling_container->addItem(leatherBoots_instance);
ItemInstance *chainHelm_instance = new ItemInstance;
ALLOC_CHECK(chainHelm_instance);
chainHelm_instance->count = 255;
chainHelm_instance->auxiliary = 0;
chainHelm_instance->id = 302;
(*FillingContainer_addItem)(filling_container, chainHelm_instance);
filling_container->addItem(chainHelm_instance);
ItemInstance *chainShirt_instance = new ItemInstance;
ALLOC_CHECK(chainShirt_instance);
chainShirt_instance->count = 255;
chainShirt_instance->auxiliary = 0;
chainShirt_instance->id = 303;
(*FillingContainer_addItem)(filling_container, chainShirt_instance);
filling_container->addItem(chainShirt_instance);
ItemInstance *chainLegs_instance = new ItemInstance;
ALLOC_CHECK(chainLegs_instance);
chainLegs_instance->count = 255;
chainLegs_instance->auxiliary = 0;
chainLegs_instance->id = 304;
(*FillingContainer_addItem)(filling_container, chainLegs_instance);
filling_container->addItem(chainLegs_instance);
ItemInstance *chainBoots_instance = new ItemInstance;
ALLOC_CHECK(chainBoots_instance);
chainBoots_instance->count = 255;
chainBoots_instance->auxiliary = 0;
chainBoots_instance->id = 305;
(*FillingContainer_addItem)(filling_container, chainBoots_instance);
filling_container->addItem(chainBoots_instance);
ItemInstance *goldHelm_instance = new ItemInstance;
ALLOC_CHECK(goldHelm_instance);
goldHelm_instance->count = 255;
goldHelm_instance->auxiliary = 0;
goldHelm_instance->id = 314;
(*FillingContainer_addItem)(filling_container, goldHelm_instance);
filling_container->addItem(goldHelm_instance);
ItemInstance *goldChest_instance = new ItemInstance;
ALLOC_CHECK(goldChest_instance);
goldChest_instance->count = 255;
goldChest_instance->auxiliary = 0;
goldChest_instance->id = 315;
(*FillingContainer_addItem)(filling_container, goldChest_instance);
filling_container->addItem(goldChest_instance);
ItemInstance *goldLegs_instance = new ItemInstance;
ALLOC_CHECK(goldLegs_instance);
goldLegs_instance->count = 255;
goldLegs_instance->auxiliary = 0;
goldLegs_instance->id = 316;
(*FillingContainer_addItem)(filling_container, goldLegs_instance);
filling_container->addItem(goldLegs_instance);
ItemInstance *goldBoots_instance = new ItemInstance;
ALLOC_CHECK(goldBoots_instance);
goldBoots_instance->count = 255;
goldBoots_instance->auxiliary = 0;
goldBoots_instance->id = 317;
(*FillingContainer_addItem)(filling_container, goldBoots_instance);
filling_container->addItem(goldBoots_instance);
ItemInstance *ironHelm_instance = new ItemInstance;
ALLOC_CHECK(ironHelm_instance);
ironHelm_instance->count = 255;
ironHelm_instance->auxiliary = 0;
ironHelm_instance->id = 306;
(*FillingContainer_addItem)(filling_container, ironHelm_instance);
filling_container->addItem(ironHelm_instance);
ItemInstance *ironChest_instance = new ItemInstance;
ALLOC_CHECK(ironChest_instance);
ironChest_instance->count = 255;
ironChest_instance->auxiliary = 0;
ironChest_instance->id = 307;
(*FillingContainer_addItem)(filling_container, ironChest_instance);
filling_container->addItem(ironChest_instance);
ItemInstance *ironLegs_instance = new ItemInstance;
ALLOC_CHECK(ironLegs_instance);
ironLegs_instance->count = 255;
ironLegs_instance->auxiliary = 0;
ironLegs_instance->id = 308;
(*FillingContainer_addItem)(filling_container, ironLegs_instance);
filling_container->addItem(ironLegs_instance);
ItemInstance *ironBoots_instance = new ItemInstance;
ALLOC_CHECK(ironBoots_instance);
ironBoots_instance->count = 255;
ironBoots_instance->auxiliary = 0;
ironBoots_instance->id = 309;
(*FillingContainer_addItem)(filling_container, ironBoots_instance);
filling_container->addItem(ironBoots_instance);
ItemInstance *flint2_instance = new ItemInstance;
ALLOC_CHECK(flint2_instance);
flint2_instance->count = 255;
flint2_instance->auxiliary = 0;
flint2_instance->id = 318;
(*FillingContainer_addItem)(filling_container, flint2_instance);
filling_container->addItem(flint2_instance);
ItemInstance *porkRaw_instance = new ItemInstance;
ALLOC_CHECK(porkRaw_instance);
porkRaw_instance->count = 255;
porkRaw_instance->auxiliary = 0;
porkRaw_instance->id = 319;
(*FillingContainer_addItem)(filling_container, porkRaw_instance);
filling_container->addItem(porkRaw_instance);
ItemInstance *leather_instance = new ItemInstance;
ALLOC_CHECK(leather_instance);
leather_instance->count = 255;
leather_instance->auxiliary = 0;
leather_instance->id = 334;
(*FillingContainer_addItem)(filling_container, leather_instance);
filling_container->addItem(leather_instance);
ItemInstance *clayBrick_instance = new ItemInstance;
ALLOC_CHECK(clayBrick_instance);
clayBrick_instance->count = 255;
clayBrick_instance->auxiliary = 0;
clayBrick_instance->id = 336;
(*FillingContainer_addItem)(filling_container, clayBrick_instance);
filling_container->addItem(clayBrick_instance);
ItemInstance *clay_instance = new ItemInstance;
ALLOC_CHECK(clay_instance);
clay_instance->count = 255;
clay_instance->auxiliary = 0;
clay_instance->id = 337;
(*FillingContainer_addItem)(filling_container, clay_instance);
filling_container->addItem(clay_instance);
ItemInstance *notepad_instance = new ItemInstance;
ALLOC_CHECK(notepad_instance);
notepad_instance->count = 255;
notepad_instance->auxiliary = 0;
notepad_instance->id = 339;
(*FillingContainer_addItem)(filling_container, notepad_instance);
filling_container->addItem(notepad_instance);
ItemInstance *book_instance = new ItemInstance;
ALLOC_CHECK(book_instance);
book_instance->count = 255;
book_instance->auxiliary = 0;
book_instance->id = 340;
(*FillingContainer_addItem)(filling_container, book_instance);
filling_container->addItem(book_instance);
ItemInstance *slimeball_instance = new ItemInstance;
ALLOC_CHECK(slimeball_instance);
slimeball_instance->count = 255;
slimeball_instance->auxiliary = 0;
slimeball_instance->id = 341;
(*FillingContainer_addItem)(filling_container, slimeball_instance);
filling_container->addItem(slimeball_instance);
ItemInstance *compass_instance = new ItemInstance;
ALLOC_CHECK(compass_instance);
compass_instance->count = 255;
compass_instance->auxiliary = 0;
compass_instance->id = 345;
(*FillingContainer_addItem)(filling_container, compass_instance);
filling_container->addItem(compass_instance);
ItemInstance *clock_instance = new ItemInstance;
ALLOC_CHECK(clock_instance);
clock_instance->count = 255;
clock_instance->auxiliary = 0;
clock_instance->id = 347;
(*FillingContainer_addItem)(filling_container, clock_instance);
filling_container->addItem(clock_instance);
ItemInstance *glowDust_instance = new ItemInstance;
ALLOC_CHECK(glowDust_instance);
glowDust_instance->count = 255;
glowDust_instance->auxiliary = 0;
glowDust_instance->id = 348;
(*FillingContainer_addItem)(filling_container, glowDust_instance);
filling_container->addItem(glowDust_instance);
ItemInstance *bone_instance = new ItemInstance;
ALLOC_CHECK(bone_instance);
bone_instance->count = 255;
bone_instance->auxiliary = 0;
bone_instance->id = 352;
(*FillingContainer_addItem)(filling_container, bone_instance);
filling_container->addItem(bone_instance);
ItemInstance *sugar_instance = new ItemInstance;
ALLOC_CHECK(sugar_instance);
sugar_instance->count = 255;
sugar_instance->auxiliary = 0;
sugar_instance->id = 353;
(*FillingContainer_addItem)(filling_container, sugar_instance);
filling_container->addItem(sugar_instance);
ItemInstance *melon_instance = new ItemInstance;
ALLOC_CHECK(melon_instance);
melon_instance->count = 255;
melon_instance->auxiliary = 0;
melon_instance->id = 360;
(*FillingContainer_addItem)(filling_container, melon_instance);
filling_container->addItem(melon_instance);
ItemInstance *beefRaw_instance = new ItemInstance;
ALLOC_CHECK(beefRaw_instance);
beefRaw_instance->count = 255;
beefRaw_instance->auxiliary = 0;
beefRaw_instance->id = 363;
(*FillingContainer_addItem)(filling_container, beefRaw_instance);
filling_container->addItem(beefRaw_instance);
ItemInstance *chickenRaw_instance = new ItemInstance;
ALLOC_CHECK(chickenRaw_instance);
chickenRaw_instance->count = 255;
chickenRaw_instance->auxiliary = 0;
chickenRaw_instance->id = 365;
(*FillingContainer_addItem)(filling_container, chickenRaw_instance);
filling_container->addItem(chickenRaw_instance);
}
// Init

View File

@ -3,13 +3,15 @@ cmake_minimum_required(VERSION 3.16.0)
# Build For ARM
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "arm")
# Start Project
project(recipes)
# Include SDK
include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn-client/sdk/sdk.cmake")
include("$ENV{HOME}/.minecraft-pi/sdk/lib/minecraft-pi-reborn/sdk/sdk.cmake")
# Build
add_library(recipes SHARED recipes.cpp)
target_link_libraries(recipes mods-headers reborn-util symbols misc)
target_link_libraries(recipes mods reborn-util symbols)

View File

@ -1,18 +1,18 @@
// Headers
#include <libreborn/libreborn.h>
#include <symbols/minecraft.h>
#include <mods/misc/misc.h>
// Custom Crafting Recipes
static void Recipes_injection(unsigned char *recipes) {
#define SAND 12
static void Recipes_injection(Recipes *recipes) {
// Add
Recipes_Type type1 = {
.item = 0,
.tile = 0,
.instance = {
.count = 1,
.id = 12,
.id = SAND,
.auxiliary = 0
},
.letter = 'a'
@ -32,13 +32,19 @@ static void Recipes_injection(unsigned char *recipes) {
.id = 344,
.auxiliary = 0
};
(*Recipes_addShapelessRecipe)(recipes, result, {type1, type2});
std::vector<Recipes_Type> types = {type1, type2};
recipes->addShapelessRecipe(result, types);
}
// Custom Furnace Recipes
static void FurnaceRecipes_injection(unsigned char *recipes) {
static void FurnaceRecipes_injection(FurnaceRecipes *recipes) {
// Add
(*FurnaceRecipes_addFurnaceRecipe)(recipes, 49, {.count = 1, .id = 246, .auxiliary = 0});
ItemInstance result = {
.count = 1,
.id = 246,
.auxiliary = 0
};
recipes->addFurnaceRecipe(49, result);
}
// Init
@ -49,4 +55,10 @@ __attribute__((constructor)) static void init_recipes() {
// Setup
misc_run_on_recipes_setup(Recipes_injection);
misc_run_on_furnace_recipes_setup(FurnaceRecipes_injection);
// Recipe Remainder
overwrite_calls(Minecraft_init, [](Minecraft_init_t original, Minecraft *self) {
original(self);
Item::items[SAND]->craftingRemainingItem = Item::snowball;
});
}

View File

@ -1,23 +1,38 @@
project(images)
# Logo
install(
FILES "modern_logo.png"
DESTINATION "${MCPI_INSTALL_DIR}/data/images/gui"
)
# Title Background
if(NOT MCPI_HEADLESS_MODE)
install(
FILES "background.png"
DESTINATION "${MCPI_INSTALL_DIR}/data/images/gui"
RENAME "titleBG.png"
)
endif()
install(
FILES "background.png"
DESTINATION "${MCPI_INSTALL_DIR}/data/images/gui"
RENAME "titleBG.png"
)
# Mojang Textures
install(
FILES "mojang/chest.png"
DESTINATION "${MCPI_INSTALL_DIR}/data/images/item"
)
install(
FILES "mojang/shadow.png" "mojang/vignette.png"
DESTINATION "${MCPI_INSTALL_DIR}/data/images/misc"
)
# Icon
set(ICON_DIR "${MCPI_SHARE_DIR}/icons/hicolor/512x512/apps")
install(
FILES "icon.png"
DESTINATION "${MCPI_SHARE_DIR}/icons/hicolor/scalable/apps"
DESTINATION "${ICON_DIR}"
RENAME "${MCPI_APP_ID}.png"
)
# AppImage
if(MCPI_IS_APPIMAGE_BUILD)
install_symlink("${MCPI_SHARE_DIR}/icons/hicolor/scalable/apps/${MCPI_APP_ID}.png" "${MCPI_APP_ID}.png")
install_symlink("${ICON_DIR}/${MCPI_APP_ID}.png" "${MCPI_APP_ID}.png")
install_symlink("${MCPI_APP_ID}.png" ".DirIcon")
endif()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 40 KiB

BIN
images/modern_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
images/mojang/chest.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
images/mojang/shadow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

BIN
images/mojang/vignette.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 115 KiB

View File

@ -1,19 +1,24 @@
project(launcher)
# Dependencies
add_subdirectory(dependencies)
# Launcher
add_executable(launcher src/bootstrap.c src/patchelf.c src/crash-report.c)
if(MCPI_SERVER_MODE)
target_sources(launcher PRIVATE src/server/launcher.c)
else()
embed_resource(launcher src/client/available-feature-flags)
target_sources(launcher PRIVATE src/client/launcher.cpp)
endif()
target_link_libraries(launcher reborn-util)
add_executable(launcher
src/bootstrap.cpp
src/patchelf.cpp
src/util.cpp
src/crash-report.cpp
src/sdk.cpp
src/mods.cpp
src/options/parser.cpp
src/main.cpp
src/client/configuration.cpp
src/client/cache.cpp
src/client/available-feature-flags # Show In IDE
)
embed_resource(launcher src/client/available-feature-flags)
target_link_libraries(launcher reborn-util LIB_LIEF trampoline-headers)
# RPath
set_target_properties(launcher PROPERTIES INSTALL_RPATH "$ORIGIN/lib/native")
target_link_options(launcher PRIVATE "LINKER:--disable-new-dtags")
# Install
install(TARGETS launcher DESTINATION "${MCPI_INSTALL_DIR}")
@ -29,18 +34,11 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
"Type=Application\n"
"Categories=Game;\n"
)
if(MCPI_HEADLESS_MODE)
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
"Terminal=true\n"
"NoDisplay=true\n"
)
else()
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
"Terminal=false\n"
"StartupNotify=false\n"
"StartupWMClass=${MCPI_APP_ID}\n"
)
endif()
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
"Terminal=false\n"
"StartupNotify=false\n"
"StartupWMClass=${MCPI_APP_ID}\n"
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
DESTINATION "${MCPI_SHARE_DIR}/applications"
@ -91,17 +89,11 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/appstream.xml"
" <releases>\n"
" <release version=\"${MCPI_VERSION}\" date=\"${MCPI_VERSION_DATE}\"></release>\n"
" </releases>\n"
)
if(NOT MCPI_HEADLESS_MODE)
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/appstream.xml"
" <screenshots>\n"
" <screenshot type=\"default\">\n"
" <image>https://gitea.thebrokenrail.com/TheBrokenRail/minecraft-pi-reborn/raw/branch/master/images/start.png</image>\n"
" </screenshot>\n"
" </screenshots>\n"
)
endif()
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/appstream.xml"
" <screenshots>\n"
" <screenshot type=\"default\">\n"
" <image>https://gitea.thebrokenrail.com/TheBrokenRail/minecraft-pi-reborn/raw/branch/master/images/start.png</image>\n"
" </screenshot>\n"
" </screenshots>\n"
"</component>\n"
)
install(

View File

@ -1,4 +0,0 @@
project(launcher-dependencies)
# PatchELF
add_subdirectory(patchelf)

View File

@ -1,17 +0,0 @@
project(patchelf)
# Silence Warnings
add_compile_options(-w)
## PatchELF
# Build
add_executable(patchelf src/src/patchelf.cc)
target_compile_definitions(patchelf PRIVATE -D_FILE_OFFSET_BITS=64)
set_target_properties(patchelf PROPERTIES CXX_STANDARD 17)
# Install
install(TARGETS patchelf DESTINATION "${MCPI_BIN_DIR}")
# License
install(FILES src/COPYING DESTINATION "${MCPI_LEGAL_DIR}/patchelf")

@ -1 +0,0 @@
Subproject commit 734daa3d0f79cf1a0c81f927d846ace5d6a2c8e1

View File

@ -1,466 +0,0 @@
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>
#include <libreborn/libreborn.h>
#include "bootstrap.h"
#include "patchelf.h"
#include "crash-report.h"
// Get All Mods In Folder
static void load(char **ld_preload, char *folder) {
int folder_name_length = strlen(folder);
// Retry Until Successful
while (1) {
// Open Folder
DIR *dp = opendir(folder);
if (dp != NULL) {
// Loop Through Folder
struct dirent *entry = NULL;
errno = 0;
while (1) {
errno = 0;
entry = readdir(dp);
if (entry != NULL) {
// Check If File Is Regular
if (entry->d_type == DT_REG) {
// Get Full Name
int name_length = strlen(entry->d_name);
int total_length = folder_name_length + name_length;
char name[total_length + 1];
// Concatenate Folder Name And File Name
for (int i = 0; i < folder_name_length; i++) {
name[i] = folder[i];
}
for (int i = 0; i < name_length; i++) {
name[folder_name_length + i] = entry->d_name[i];
}
// Add Terminator
name[total_length] = '\0';
// Check If File Is Accessible
int result = access(name, R_OK);
if (result == 0) {
// Add To LD_PRELOAD
string_append(ld_preload, "%s%s", *ld_preload == NULL ? "" : ":", name);
} else if (result == -1 && errno != 0) {
// Fail
WARN("Unable To Access: %s: %s", name, strerror(errno));
errno = 0;
}
}
} else if (errno != 0) {
// Error Reading Contents Of Folder
ERR("Error Reading Directory: %s: %s", folder, strerror(errno));
} else {
// Done!
break;
}
}
// Close Folder
closedir(dp);
// Exit Function
return;
} else if (errno == ENOENT) {
// Folder Doesn't Exists, Attempt Creation
int ret = mkdir(folder, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
if (ret != 0) {
// Unable To Create Folder
ERR("Error Creating Directory: %s: %s", folder, strerror(errno));
}
// Continue Retrying
} else {
// Unable To Open Folder
ERR("Error Opening Directory: %s: %s", folder, strerror(errno));
}
}
}
#define MCPI_BINARY "minecraft-pi"
#define QEMU_BINARY "qemu-arm"
// Exit Handler
static void exit_handler(__attribute__((unused)) int signal_id) {
// Pass Signal To Child
murder_children();
while (wait(NULL) > 0) {}
_exit(EXIT_SUCCESS);
}
// Pre-Bootstrap
void pre_bootstrap(int argc, char *argv[]) {
// Disable stdout Buffering
setvbuf(stdout, NULL, _IONBF, 0);
// Set Default Native Component Environment
#define set_variable_default(name) set_and_print_env("MCPI_NATIVE_" name, getenv(name));
for_each_special_environmental_variable(set_variable_default);
// Print Version
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "-v") == 0) {
// Print
printf("Reborn v%s\n", MCPI_VERSION);
fflush(stdout);
exit(EXIT_SUCCESS);
}
}
// GTK Dark Mode
#ifndef MCPI_SERVER_MODE
set_and_print_env("GTK_THEME", "Adwaita:dark");
#endif
// Debug Zenity
#ifndef MCPI_SERVER_MODE
{
const char *is_debug = getenv("MCPI_DEBUG");
if (is_debug != NULL && strlen(is_debug) > 0) {
set_and_print_env("ZENITY_DEBUG", "1");
}
}
#endif
// AppImage
#ifdef MCPI_IS_APPIMAGE_BUILD
{
char *owd = getenv("OWD");
if (owd != NULL && chdir(owd) != 0) {
ERR("AppImage: Unable To Fix Current Directory: %s", strerror(errno));
}
}
#endif
// Get Binary Directory
char *binary_directory = get_binary_directory();
// Configure PATH
{
// Add Library Directory
char *new_path = NULL;
safe_asprintf(&new_path, "%s/bin", binary_directory);
// Add Existing PATH
{
char *value = getenv("PATH");
if (value != NULL && strlen(value) > 0) {
string_append(&new_path, ":%s", value);
}
}
// Set And Free
set_and_print_env("PATH", new_path);
free(new_path);
}
// Free Binary Directory
free(binary_directory);
// Setup Crash Reports
setup_crash_report();
// Install Signal Handlers
struct sigaction act_sigint;
memset((void *) &act_sigint, 0, sizeof (struct sigaction));
act_sigint.sa_flags = SA_RESTART;
act_sigint.sa_handler = &exit_handler;
sigaction(SIGINT, &act_sigint, NULL);
struct sigaction act_sigterm;
memset((void *) &act_sigterm, 0, sizeof (struct sigaction));
act_sigterm.sa_flags = SA_RESTART;
act_sigterm.sa_handler = &exit_handler;
sigaction(SIGTERM, &act_sigterm, NULL);
}
// Copy SDK Into ~/.minecraft-pi
static void run_simple_command(const char *const command[], const char *error) {
int status = 0;
char *output = run_command(command, &status);
if (output != NULL) {
free(output);
}
if (!is_exit_status_success(status)) {
ERR("%s", error);
}
}
static void copy_sdk(char *binary_directory) {
// Output Directory
char *output = NULL;
safe_asprintf(&output, "%s" HOME_SUBDIRECTORY_FOR_GAME_DATA "/sdk/" MCPI_SDK_DIR, getenv("HOME"));
// Source Directory
char *source = NULL;
safe_asprintf(&source, "%s/sdk/.", binary_directory);
// Clean
{
const char *const command[] = {"rm", "-rf", output, NULL};
run_simple_command(command, "Unable To Clean SDK Output Directory");
}
// Make Directory
{
const char *const command[] = {"mkdir", "-p", output, NULL};
run_simple_command(command, "Unable To Create SDK Output Directory");
}
// Copy
{
const char *const command[] = {"cp", "-ar", source, output, NULL};
run_simple_command(command, "Unable To Copy SDK");
}
// Free
free(output);
free(source);
}
// Bootstrap
void bootstrap(int argc, char *argv[]) {
INFO("Configuring Game...");
// Get Binary Directory
char *binary_directory = get_binary_directory();
// Copy SDK
copy_sdk(binary_directory);
// Set MCPI_REBORN_ASSETS_PATH
{
char *assets_path = realpath("/proc/self/exe", NULL);
ALLOC_CHECK(assets_path);
chop_last_component(&assets_path);
string_append(&assets_path, "/data");
set_and_print_env("MCPI_REBORN_ASSETS_PATH", assets_path);
free(assets_path);
}
// Resolve Binary Path & Set MCPI_DIRECTORY
char *resolved_path = NULL;
{
// Log
DEBUG("Resolving File Paths...");
// Resolve Full Binary Path
char *full_path = NULL;
safe_asprintf(&full_path, "%s/" MCPI_BINARY, binary_directory);
resolved_path = realpath(full_path, NULL);
ALLOC_CHECK(resolved_path);
free(full_path);
}
// Fix MCPI Dependencies
char new_mcpi_exe_path[] = MCPI_PATCHED_DIR "/XXXXXX";
{
// Log
DEBUG("Patching ELF Dependencies...");
// Find Linker
char *linker = NULL;
// Select Linker
#ifdef MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN
// Use ARM Sysroot Linker
safe_asprintf(&linker, "%s/sysroot/lib/ld-linux-armhf.so.3", binary_directory);
#else
// Use Current Linker
char *exe = realpath("/proc/self/exe", NULL);
ALLOC_CHECK(exe);
linker = patch_get_interpreter(exe);
free(exe);
#endif
// Patch
patch_mcpi_elf_dependencies(resolved_path, new_mcpi_exe_path, linker);
// Free Linker Path
if (linker != NULL) {
free(linker);
}
// Verify
if (!starts_with(new_mcpi_exe_path, MCPI_PATCHED_DIR)) {
IMPOSSIBLE();
}
}
// Set MCPI_VANILLA_ASSETS_PATH
{
char *assets_path = strdup(resolved_path);
ALLOC_CHECK(assets_path);
chop_last_component(&assets_path);
string_append(&assets_path, "/data");
set_and_print_env("MCPI_VANILLA_ASSETS_PATH", assets_path);
free(assets_path);
}
// Free Resolved Path
free(resolved_path);
// Configure Library Search Path
{
// Log
DEBUG("Setting Linker Search Paths...");
// Prepare
char *transitive_ld_path = NULL;
char *mcpi_ld_path = NULL;
// Library Search Path For Native Components
{
// Add Native Library Directory
safe_asprintf(&transitive_ld_path, "%s/lib/native", binary_directory);
// Add Host LD_LIBRARY_PATH
{
char *value = getenv("LD_LIBRARY_PATH");
if (value != NULL && strlen(value) > 0) {
string_append(&transitive_ld_path, ":%s", value);
}
}
// Set
set_and_print_env("MCPI_NATIVE_LD_LIBRARY_PATH", transitive_ld_path);
free(transitive_ld_path);
}
// Library Search Path For ARM Components
{
// Add ARM Library Directory
safe_asprintf(&mcpi_ld_path, "%s/lib/arm", binary_directory);
// Add ARM Sysroot Libraries (Ensure Priority) (Ignore On Actual ARM System)
#ifdef MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN
string_append(&mcpi_ld_path, ":%s/sysroot/lib:%s/sysroot/lib/arm-linux-gnueabihf:%s/sysroot/usr/lib:%s/sysroot/usr/lib/arm-linux-gnueabihf", binary_directory, binary_directory, binary_directory, binary_directory);
#endif
// Add Host LD_LIBRARY_PATH
{
char *value = getenv("LD_LIBRARY_PATH");
if (value != NULL && strlen(value) > 0) {
string_append(&mcpi_ld_path, ":%s", value);
}
}
// Set
set_and_print_env("MCPI_ARM_LD_LIBRARY_PATH", mcpi_ld_path);
free(mcpi_ld_path);
}
// Setup iconv
{
// Native Components
char *host_gconv_path = getenv("GCONV_PATH");
set_and_print_env("MCPI_NATIVE_GCONV_PATH", host_gconv_path);
// ARM Components
#ifdef MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN
char *gconv_path = NULL;
safe_asprintf(&gconv_path, "%s/sysroot/usr/lib/gconv", binary_directory);
set_and_print_env("MCPI_ARM_GCONV_PATH", gconv_path);
free(gconv_path);
#else
set_and_print_env("MCPI_ARM_GCONV_PATH", host_gconv_path);
#endif
}
}
// Configure Preloaded Objects
{
// Log
DEBUG("Locating Mods...");
// Native Components
char *host_ld_preload = getenv("LD_PRELOAD");
set_and_print_env("MCPI_NATIVE_LD_PRELOAD", host_ld_preload);
// ARM Components
{
// Prepare
char *preload = NULL;
// ~/.minecraft-pi/mods
{
// Get Mods Folder
char *mods_folder = NULL;
safe_asprintf(&mods_folder, "%s" HOME_SUBDIRECTORY_FOR_GAME_DATA "/mods/", getenv("HOME"));
// Load Mods From ./mods
load(&preload, mods_folder);
// Free Mods Folder
free(mods_folder);
}
// Built-In Mods
{
// Get Mods Folder
char *mods_folder = NULL;
safe_asprintf(&mods_folder, "%s/mods/", binary_directory);
// Load Mods From ./mods
load(&preload, mods_folder);
// Free Mods Folder
free(mods_folder);
}
// Add LD_PRELOAD
{
char *value = getenv("LD_PRELOAD");
if (value != NULL && strlen(value) > 0) {
string_append(&preload, ":%s", value);
}
}
// Set
set_and_print_env("MCPI_ARM_LD_PRELOAD", preload);
free(preload);
}
}
// Free Binary Directory
free(binary_directory);
// Start Game
INFO("Starting Game...");
// Arguments
int argv_start = 1; // argv = &new_args[argv_start]
const char *new_args[argv_start /* 1 Potential Prefix Argument (QEMU) */ + argc + 1 /* NULL-Terminator */]; //
// Copy Existing Arguments
for (int i = 1; i < argc; i++) {
new_args[i + argv_start] = argv[i];
}
// NULL-Terminator
new_args[argv_start + argc] = NULL;
// Set Executable Argument
new_args[argv_start] = new_mcpi_exe_path;
// Non-ARM Systems Need QEMU
#ifndef __ARM_ARCH
argv_start--;
new_args[argv_start] = QEMU_BINARY;
#endif
// Setup Environment
setup_exec_environment(1);
// Pass LD_* Variables Through QEMU
#ifndef __ARM_ARCH
char *qemu_set_env = NULL;
#define pass_variable_through_qemu(name) string_append(&qemu_set_env, "%s%s=%s", qemu_set_env == NULL ? "" : ",", name, getenv(name));
for_each_special_environmental_variable(pass_variable_through_qemu);
set_and_print_env("QEMU_SET_ENV", qemu_set_env);
free(qemu_set_env);
// Treat QEMU Itself As A Native Component
setup_exec_environment(0);
#endif
// Run
const char **new_argv = &new_args[argv_start];
safe_execvpe(new_argv, (const char *const *) environ);
}

196
launcher/src/bootstrap.cpp Normal file
View File

@ -0,0 +1,196 @@
#define _FILE_OFFSET_BITS 64
#include <string>
#include <vector>
#include <libreborn/libreborn.h>
#include <trampoline/types.h>
#include "util.h"
#include "bootstrap.h"
#include "patchelf.h"
#define MCPI_BINARY "minecraft-pi"
#define REQUIRED_PAGE_SIZE 4096
// Debug Information
static void run_debug_command(const char *const command[], const char *prefix) {
int status = 0;
char *output = run_command(command, &status, nullptr);
if (output != nullptr) {
// Remove Newline
size_t length = strlen(output);
if (length > 0 && output[length - 1] == '\n') {
output[length - 1] = '\0';
}
// Print
DEBUG("%s: %s", prefix, output);
free(output);
}
if (!is_exit_status_success(status)) {
ERR("Unable To Gather Debug Information");
}
}
static void print_debug_information() {
// System Information
const char *const command[] = {"uname", "-a", nullptr};
run_debug_command(command, "System Information");
// Version
DEBUG("Reborn Version: v%s", MCPI_VERSION);
// Architecture
const char *arch =
#ifdef __x86_64__
"AMD64"
#elif defined(__aarch64__)
"ARM64"
#elif defined(__arm__)
"ARM32"
#else
"Unknown"
#endif
;
DEBUG("Reborn Target Architecture: %s", arch);
}
// Bootstrap
void bootstrap(const options_t &options) {
// Debug Information
print_debug_information();
// Check Page Size (Not Needed When Using QEMU)
long page_size = sysconf(_SC_PAGESIZE);
if (page_size != REQUIRED_PAGE_SIZE) {
CONDITIONAL_ERR(!options.skip_pagesize_check, "Invalid page size! A page size of %ld bytes is required, but the system size is %ld bytes.", (long) REQUIRED_PAGE_SIZE, page_size);
}
// Get Binary Directory
const std::string binary_directory = get_binary_directory();
DEBUG("Binary Directory: %s", binary_directory.c_str());
// Copy SDK
if (!reborn_is_server()) {
copy_sdk(binary_directory, true);
}
// Set MCPI_REBORN_ASSETS_PATH
{
std::string assets_path = safe_realpath("/proc/self/exe");
chop_last_component(assets_path);
assets_path += "/data";
set_and_print_env(_MCPI_REBORN_ASSETS_PATH_ENV, assets_path.c_str());
}
// Resolve Binary Path & Set MCPI_DIRECTORY
std::string original_game_binary;
std::string game_binary;
{
// Log
DEBUG("Resolving File Paths...");
// Resolve Full Binary Path
const std::string full_path = binary_directory + ("/" MCPI_BINARY);
original_game_binary = safe_realpath(full_path);
const char *custom_binary = getenv(MCPI_BINARY_ENV);
if (custom_binary != nullptr) {
game_binary = safe_realpath(custom_binary);
} else {
game_binary = original_game_binary;
}
}
// Configure Preloaded Objects
std::vector<std::string> mcpi_ld_preload;
{
// Log
DEBUG("Locating Mods...");
// ARM Components
mcpi_ld_preload = bootstrap_mods(binary_directory);
}
// Configure Library Search Path
std::vector<std::string> mcpi_ld_path;
{
// Log
DEBUG("Setting Linker Search Paths...");
// Library Search Path For ARM Components
{
// Add ARM Library Directory
mcpi_ld_path.push_back("lib/arm");
// Add ARM Sysroot Libraries (Ensure Priority) (Ignore On Actual ARM System)
#ifdef MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN
mcpi_ld_path.push_back("sysroot/lib");
mcpi_ld_path.push_back("sysroot/lib/arm-linux-gnueabihf");
mcpi_ld_path.push_back("sysroot/usr/lib");
mcpi_ld_path.push_back("sysroot/usr/lib/arm-linux-gnueabihf");
#endif
// Fix Paths
for (std::string &path : mcpi_ld_path) {
path = binary_directory + '/' + path;
}
}
}
// Fix MCPI Dependencies
char new_mcpi_exe_path[] = MCPI_PATCHED_DIR "/XXXXXX";
{
// Log
DEBUG("Patching ELF...");
// Find Linker
std::string linker = "/lib/ld-linux-armhf.so.3";
#ifdef MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN
// Use ARM Sysroot Linker
linker = binary_directory + "/sysroot" + linker;
#endif
// Patch
patch_mcpi_elf_dependencies(game_binary, new_mcpi_exe_path, linker, mcpi_ld_path, mcpi_ld_preload);
// Verify
if (!starts_with(new_mcpi_exe_path, MCPI_PATCHED_DIR)) {
IMPOSSIBLE();
}
}
// Set MCPI_VANILLA_ASSETS_PATH
{
std::string assets_path = original_game_binary;
chop_last_component(assets_path);
assets_path += "/data";
set_and_print_env(_MCPI_VANILLA_ASSETS_PATH_ENV, assets_path.c_str());
}
// Start Game
INFO("Starting Game...");
// Arguments
std::vector<std::string> args;
// Use Extra If Needed
#ifdef MCPI_BUILD_RUNTIME
args.push_back("runtime");
#endif
// Fix QEMU Bug
#ifdef MCPI_RUNTIME_IS_QEMU
args.push_back("-B");
args.push_back(std::to_string(QEMU_GUEST_BASE));
#endif
// Specify MCPI Binary
args.push_back(new_mcpi_exe_path);
// Run
const char *new_argv[args.size() + 1];
for (std::vector<std::string>::size_type i = 0; i < args.size(); i++) {
new_argv[i] = args[i].c_str();
}
new_argv[args.size()] = nullptr;
safe_execvpe(new_argv, environ);
}

View File

@ -1,12 +1,10 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include <string>
#include <vector>
void pre_bootstrap(int argc, char *argv[]);
void bootstrap(int argc, char *argv[]);
#include "options/parser.h"
#ifdef __cplusplus
}
#endif
void bootstrap(const options_t &options);
void copy_sdk(const std::string &binary_directory, bool log_with_debug);
std::vector<std::string> bootstrap_mods(const std::string &binary_directory);

View File

@ -6,18 +6,22 @@ TRUE Disable Autojump By Default
TRUE Display Nametags By Default
TRUE Fix Sign Placement
TRUE Show Block Outlines
FALSE Expand Creative Inventory
FALSE Expand Creative Mode Inventory
FALSE Remove Creative Mode Restrictions
FALSE Display Slot Count In Creative Mode
FALSE Force Survival Mode Inventory UI
FALSE Force Survival Mode Inventory Behavior
FALSE Maximize Creative Mode Inventory Stack Size
TRUE Animated Water
TRUE Remove Invalid Item Background
TRUE Disable "gui_blocks" Atlas
FALSE 3D Anaglyph
TRUE Animated Lava
TRUE Animated Fire
TRUE Regenerate "gui_blocks" Atlas
TRUE Fix Camera Rendering
TRUE Implement Chat
FALSE Hide Chat Messages
TRUE Implement Death Messages
TRUE Implement Game-Mode Switching
TRUE Allow Joining Survival Servers
TRUE Allow Joining Survival Mode Servers
TRUE Miscellaneous Input Fixes
TRUE Bind "Q" Key To Item Dropping
TRUE Bind Common Toggleable Options To Function Keys
@ -33,7 +37,7 @@ TRUE Disable V-Sync
TRUE Fix Options Screen
TRUE Force Touch GUI Inventory
TRUE Fix Pause Menu
TRUE Improved Title Background
TRUE Add Title Screen Background
TRUE Force Touch GUI Button Behavior
TRUE Improved Button Hover Behavior
TRUE Implement Create World Dialog
@ -42,3 +46,69 @@ TRUE Add Buckets
TRUE Classic HUD
TRUE Translucent Toolbar
FALSE Force EGL
TRUE Improved Classic Title Screen
FALSE Disable Speed Bridging
FALSE Disable Creative Mode Mining Delay
FALSE Add Biome Colors To Grass
TRUE Generate Caves
FALSE Disable Block Tinting
TRUE Disable Hostile AI In Creative Mode
TRUE Load Custom Skins
TRUE 3D Chest Model
TRUE Replace Block Highlight With Outline
TRUE Add Cake
TRUE Use Java Beta 1.3 Light Ramp
TRUE Send Full Level When Hosting Game
FALSE Food Overlay
TRUE Add Splashes
TRUE Display Date In Select World Screen
TRUE Optimized Chunk Sorting
TRUE Fix Held Item Caching
TRUE Add Reborn Info To Options
FALSE Log FPS
TRUE Add Welcome Screen
TRUE F3 Debug Information
TRUE Multidraw Rendering
TRUE Add Missing Language Strings
TRUE Fix Pigmen Burning In The Sun
TRUE Fix Carried Grass's Bottom Texture
TRUE Hide Crosshair In Third-Person
TRUE Fix Camera Legs
TRUE Implement Crafting Remainders
TRUE Fix Door Duplication
TRUE Fix Cobweb Lighting
TRUE Fix Sneaking Syncing
TRUE Fix Fire Immunity
TRUE Fix Fire Syncing
TRUE Fix Sunlight Not Properly Setting Mobs On Fire
TRUE Stop Creative Players From Burning
TRUE Render Fire In Third-Person
TRUE Improved Water Rendering
TRUE Classic Item Count UI
TRUE Fix Screen Rendering When Hiding HUD
TRUE Sanitize Usernames
TRUE Patch RakNet Security Bug
TRUE Log RakNet Startup Errors
TRUE Prevent Unnecessary Server Pinging
TRUE Proper OpenGL Buffer Generation
TRUE Fix Furnace Screen Visual Bug
TRUE Fix Text Wrapping
TRUE Fullscreen Support
TRUE Always Save Chest Tile Entities
TRUE Fix Transferring Durability When Using Items
TRUE Fix Switching Perspective While Sneaking
TRUE Log Chat Messages
TRUE Log Game Status
TRUE Screenshot Support
TRUE Fix Camera Functionality
TRUE Allow High-Resolution Title
TRUE Improved Classic Title Positioning
TRUE Use Updated Title
TRUE Hide Block Outline When GUI Is Hidden
TRUE Fix Crash When Generating Certain Seeds
TRUE Click Buttons On Mouse Down
TRUE 3D Dropped Items
TRUE Render Entity Shadows
TRUE Render Vignette
TRUE Increase Render Chunk Size
TRUE Proper Entity Shading

View File

@ -0,0 +1,172 @@
#include <cstdlib>
#include <string>
#include <fstream>
#include <unordered_map>
#include <sstream>
#include <sys/stat.h>
#include <unistd.h>
#include <libreborn/libreborn.h>
#include "configuration.h"
#include "cache.h"
// Get Cache Path
static std::string get_cache_path() {
const char *home = getenv(_MCPI_HOME_ENV);
if (home == nullptr) {
IMPOSSIBLE();
}
return std::string(home) + get_home_subdirectory_for_game_data() + "/.launcher-cache";
}
// Load
launcher_cache empty_cache = {
.username = DEFAULT_USERNAME,
.render_distance = DEFAULT_RENDER_DISTANCE,
.feature_flags = {}
};
launcher_cache load_cache() {
// Log
DEBUG("Loading Launcher Cache...");
// Return Value
launcher_cache ret = empty_cache;
// Open File
std::ifstream stream(get_cache_path(), std::ios::in | std::ios::binary);
if (!stream) {
// Fail
struct stat s;
// No Warning If File Doesn't Exist
if (stat(get_cache_path().c_str(), &s) == 0) {
WARN("Unable To Open Launcher Cache For Loading");
}
} else {
// Lock File
int lock_fd = lock_file(get_cache_path().c_str());
// Check Version
unsigned char cache_version;
stream.read((char *) &cache_version, 1);
if (stream.eof() || cache_version != (unsigned char) CACHE_VERSION) {
// Fail
if (!stream.eof()) {
WARN("Invalid Launcher Cache Version (Expected: %i, Actual: %i)", (int) CACHE_VERSION, (int) cache_version);
} else {
WARN("Unable To Read Launcher Cache Version");
}
stream.close();
} else {
// Load Username And Render Distance
launcher_cache cache;
std::getline(stream, cache.username, '\0');
std::getline(stream, cache.render_distance, '\0');
// Load Feature Flags
std::string flag;
while (!stream.eof() && std::getline(stream, flag, '\0')) {
if (flag.length() > 0) {
unsigned char is_enabled = 0;
stream.read((char *) &is_enabled, 1);
cache.feature_flags[flag] = is_enabled != (unsigned char) 0;
}
stream.peek();
}
// Finish
stream.close();
if (!stream) {
// Fail
WARN("Failure While Loading Launcher Cache");
} else {
// Success
ret = cache;
}
}
// Unlock File
unlock_file(get_cache_path().c_str(), lock_fd);
}
// Return
return ret;
}
// Save
#define write_env_to_stream(stream, env) \
{ \
const char *env_value = getenv(env); \
if (env == NULL) { \
IMPOSSIBLE(); \
} \
stream.write(env_value, strlen(env_value) + 1); \
}
void save_cache() {
// Log
DEBUG("Saving Launcher Cache...");
// Open File
std::ofstream stream(get_cache_path(), std::ios::out | std::ios::binary);
if (!stream) {
// Fail
WARN("Unable To Open Launcher Cache For Saving");
} else {
// Lock File
int lock_fd = lock_file(get_cache_path().c_str());
// Save Cache Version
unsigned char cache_version = (unsigned char) CACHE_VERSION;
stream.write((const char *) &cache_version, 1);
// Save Username And Render Distance
write_env_to_stream(stream, MCPI_USERNAME_ENV);
write_env_to_stream(stream, MCPI_RENDER_DISTANCE_ENV);
// Save Feature Flags
std::unordered_map<std::string, bool> flags;
load_available_feature_flags([&flags](std::string flag) {
std::string stripped_flag = strip_feature_flag_default(flag, nullptr);
flags[stripped_flag] = false;
});
{
const char *enabled_flags = getenv(MCPI_FEATURE_FLAGS_ENV);
if (enabled_flags == nullptr) {
IMPOSSIBLE();
}
std::istringstream enabled_flags_stream(enabled_flags);
std::string flag;
while (std::getline(enabled_flags_stream, flag, '|')) {
if (flag.length() > 0) {
flags[flag] = true;
}
}
}
for (auto &it : flags) {
stream.write(it.first.c_str(), it.first.size() + 1);
unsigned char val = it.second ? (unsigned char) 1 : (unsigned char) 0;
stream.write((const char *) &val, 1);
}
// Finish
stream.close();
if (!stream.good()) {
WARN("Failure While Saving Launcher Cache");
}
// Unlock File
unlock_file(get_cache_path().c_str(), lock_fd);
}
}
// Wipe Cache
void wipe_cache() {
// Log
INFO("Wiping Launcher Cache...");
// Unlink File
const int ret = unlink(get_cache_path().c_str());
if (ret != 0 && errno != ENOENT) {
WARN("Failure While Wiping Cache: %s", strerror(errno));
}
}

View File

@ -0,0 +1,22 @@
#pragma once
#include <string>
#include <unordered_map>
// Cache Version
#define CACHE_VERSION 0
// Load Cache
typedef struct {
std::string username;
std::string render_distance;
std::unordered_map<std::string, bool> feature_flags;
} launcher_cache;
extern launcher_cache empty_cache;
launcher_cache load_cache();
// Save Cache
void save_cache();
// Wipe Cache
void wipe_cache();

View File

@ -9,23 +9,25 @@
#include <libreborn/libreborn.h>
#include "../bootstrap.h"
#include "../util.h"
#include "configuration.h"
#include "cache.h"
// Strip Feature Flag Default
static std::string strip_feature_flag_default(std::string flag, bool *default_ret) {
std::string strip_feature_flag_default(const std::string &flag, bool *default_ret) {
// Valid Values
std::string true_str = "TRUE ";
std::string false_str = "FALSE ";
// Test
if (flag.rfind(true_str, 0) == 0) {
// Enabled By Default
if (default_ret != NULL) {
if (default_ret != nullptr) {
*default_ret = true;
}
return flag.substr(true_str.length(), std::string::npos);
} else if (flag.rfind(false_str, 0) == 0) {
// Disabled By Default
if (default_ret != NULL) {
if (default_ret != nullptr) {
*default_ret = false;
}
return flag.substr(false_str.length(), std::string::npos);
@ -38,13 +40,9 @@ static std::string strip_feature_flag_default(std::string flag, bool *default_re
// Load Available Feature Flags
extern unsigned char available_feature_flags[];
extern size_t available_feature_flags_len;
static void load_available_feature_flags(std::function<void(std::string)> callback) {
// Get Path
char *binary_directory = get_binary_directory();
std::string path = std::string(binary_directory) + "/available-feature-flags";
free(binary_directory);
// Load File
std::string data(available_feature_flags, available_feature_flags + available_feature_flags_len);
void load_available_feature_flags(const std::function<void(std::string)> &callback) {
// Load Data
const std::string data(available_feature_flags, available_feature_flags + available_feature_flags_len);
std::stringstream stream(data);
// Store Lines
std::vector<std::string> lines;
@ -52,7 +50,7 @@ static void load_available_feature_flags(std::function<void(std::string)> callba
{
std::string line;
while (std::getline(stream, line)) {
if (line.length() > 0) {
if (!line.empty()) {
// Verify Line
if (line.find('|') == std::string::npos) {
lines.push_back(line);
@ -64,15 +62,15 @@ static void load_available_feature_flags(std::function<void(std::string)> callba
}
}
// Sort
std::sort(lines.begin(), lines.end(), [](std::string a, std::string b) {
std::sort(lines.begin(), lines.end(), [](const std::string &a, const std::string &b) {
// Strip Defaults
std::string stripped_a = strip_feature_flag_default(a, NULL);
std::string stripped_b = strip_feature_flag_default(b, NULL);
const std::string stripped_a = strip_feature_flag_default(a, nullptr);
const std::string stripped_b = strip_feature_flag_default(b, nullptr);
// Sort
return stripped_a < stripped_b;
});
// Run Callbacks
for (std::string &line : lines) {
for (const std::string &line : lines) {
callback(line);
}
}
@ -80,13 +78,15 @@ static void load_available_feature_flags(std::function<void(std::string)> callba
// Run Command And Set Environmental Variable
static void run_command_and_set_env(const char *env_name, const char *command[]) {
// Only Run If Environmental Variable Is NULL
if (getenv(env_name) == NULL) {
if (getenv(env_name) == nullptr) {
// Check $DISPLAY
reborn_check_display();
// Run
int return_code;
char *output = run_command(command, &return_code);
if (output != NULL) {
char *output = run_command(command, &return_code, nullptr);
if (output != nullptr) {
// Trim
int length = strlen(output);
const size_t length = strlen(output);
if (output[length - 1] == '\n') {
output[length - 1] = '\0';
}
@ -97,7 +97,7 @@ static void run_command_and_set_env(const char *env_name, const char *command[])
}
// Check Return Code
if (!is_exit_status_success(return_code)) {
INFO("Launch Interrupted");
// Launch Interrupted
exit(EXIT_SUCCESS);
}
}
@ -119,14 +119,14 @@ static void run_zenity_and_set_env(const char *env_name, std::vector<std::string
for (std::vector<std::string>::size_type i = 0; i < full_command.size(); i++) {
full_command_array[i] = full_command[i].c_str();
}
full_command_array[full_command.size()] = NULL;
full_command_array[full_command.size()] = nullptr;
// Run
run_command_and_set_env(env_name, full_command_array);
}
// Set Variable If Not Already Set
static void set_env_if_unset(const char *env_name, std::function<std::string()> callback) {
if (getenv(env_name) == NULL) {
static void set_env_if_unset(const char *env_name, const std::function<std::string()> &callback) {
if (getenv(env_name) == nullptr) {
char *value = strdup(callback().c_str());
ALLOC_CHECK(value);
set_and_print_env(env_name, value);
@ -134,82 +134,59 @@ static void set_env_if_unset(const char *env_name, std::function<std::string()>
}
}
// Defaults
#define DEFAULT_USERNAME "StevePi"
#define DEFAULT_RENDER_DISTANCE "Short"
// Handle Non-Launch Commands
void handle_non_launch_client_only_commands(const options_t &options) {
// Print Available Feature Flags
if (options.print_available_feature_flags) {
load_available_feature_flags([](const std::string &line) {
printf("%s\n", line.c_str());
fflush(stdout);
});
exit(EXIT_SUCCESS);
}
// Wipe Cache If Needed
if (options.wipe_cache) {
wipe_cache();
exit(EXIT_SUCCESS);
}
}
// Launch
// Configure Client Options
#define LIST_DIALOG_SIZE "400"
int main(int argc, char *argv[]) {
// Don't Run As Root
if (getenv("_MCPI_SKIP_ROOT_CHECK") == NULL && (getuid() == 0 || geteuid() == 0)) {
ERR("Don't Run As Root");
}
// Pre-Bootstrap
pre_bootstrap(argc, argv);
// Print Features
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--print-available-feature-flags") == 0) {
// Print Available Feature Flags
load_available_feature_flags([](std::string line) {
printf("%s\n", line.c_str());
fflush(stdout);
});
return 0;
}
}
void configure_client(const options_t &options) {
// Load Cache
launcher_cache cache = options.no_cache ? empty_cache : load_cache();
// --default
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--default") == 0) {
// Use Default Feature Flags
set_env_if_unset("MCPI_FEATURE_FLAGS", []() {
std::string feature_flags = "";
load_available_feature_flags([&feature_flags](std::string flag) {
bool default_value;
// Strip Default Value
std::string stripped_flag = strip_feature_flag_default(flag, &default_value);
// Specify Default Value
if (default_value) {
// Enabled By Default
feature_flags += stripped_flag + '|';
}
});
if (feature_flags.length() > 0 && feature_flags[feature_flags.length() - 1] == '|') {
feature_flags.pop_back();
if (options.use_default) {
// Use Default Feature Flags
set_env_if_unset(MCPI_FEATURE_FLAGS_ENV, [&cache]() {
std::string feature_flags = "";
load_available_feature_flags([&feature_flags, &cache](const std::string &flag) {
bool value;
// Strip Default Value
std::string stripped_flag = strip_feature_flag_default(flag, &value);
// Use Cache
if (cache.feature_flags.count(stripped_flag) > 0) {
value = cache.feature_flags[stripped_flag];
}
return feature_flags;
});
set_env_if_unset("MCPI_RENDER_DISTANCE", []() {
return DEFAULT_RENDER_DISTANCE;
});
set_env_if_unset("MCPI_USERNAME", []() {
return DEFAULT_USERNAME;
});
break;
}
}
// Create ~/.minecraft-pi If Needed
// Minecraft Folder
{
char *minecraft_folder = NULL;
safe_asprintf(&minecraft_folder, "%s/.minecraft-pi", getenv("HOME"));
{
// Check Minecraft Folder
struct stat obj;
if (stat(minecraft_folder, &obj) != 0 || !S_ISDIR(obj.st_mode)) {
// Create Minecraft Folder
int ret = mkdir(minecraft_folder, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
if (ret != 0) {
// Unable To Create Folder
ERR("Error Creating Directory: %s: %s", minecraft_folder, strerror(errno));
// Specify Default Value
if (value) {
// Enabled By Default
feature_flags += stripped_flag + '|';
}
});
if (!feature_flags.empty() && feature_flags[feature_flags.length() - 1] == '|') {
feature_flags.pop_back();
}
}
free(minecraft_folder);
return feature_flags;
});
set_env_if_unset(MCPI_RENDER_DISTANCE_ENV, [&cache]() {
return cache.render_distance;
});
set_env_if_unset(MCPI_USERNAME_ENV, [&cache]() {
return cache.username;
});
}
// Setup MCPI_FEATURE_FLAGS
@ -225,12 +202,16 @@ int main(int argc, char *argv[]) {
command.push_back("Enabled");
command.push_back("--column");
command.push_back("Feature");
load_available_feature_flags([&command](std::string flag) {
bool default_value;
load_available_feature_flags([&command, &cache](const std::string &flag) {
bool value;
// Strip Default Value
std::string stripped_flag = strip_feature_flag_default(flag, &default_value);
std::string stripped_flag = strip_feature_flag_default(flag, &value);
// Use Cache
if (cache.feature_flags.count(stripped_flag) > 0) {
value = cache.feature_flags[stripped_flag];
}
// Specify Default Value
if (default_value) {
if (value) {
// Enabled By Default
command.push_back("TRUE");
} else {
@ -241,7 +222,7 @@ int main(int argc, char *argv[]) {
command.push_back(stripped_flag);
});
// Run
run_zenity_and_set_env("MCPI_FEATURE_FLAGS", command);
run_zenity_and_set_env(MCPI_FEATURE_FLAGS_ENV, command);
}
// Setup MCPI_RENDER_DISTANCE
{
@ -260,11 +241,11 @@ int main(int argc, char *argv[]) {
command.push_back("Name");
std::string render_distances[] = {"Far", "Normal", "Short", "Tiny"};
for (std::string &render_distance : render_distances) {
command.push_back(render_distance.compare(DEFAULT_RENDER_DISTANCE) == 0 ? "TRUE" : "FALSE");
command.push_back(render_distance == cache.render_distance ? "TRUE" : "FALSE");
command.push_back(render_distance);
}
// Run
run_zenity_and_set_env("MCPI_RENDER_DISTANCE", command);
run_zenity_and_set_env(MCPI_RENDER_DISTANCE_ENV, command);
}
// Setup MCPI_USERNAME
{
@ -273,11 +254,13 @@ int main(int argc, char *argv[]) {
command.push_back("--text");
command.push_back("Enter Minecraft Username:");
command.push_back("--entry-text");
command.push_back(DEFAULT_USERNAME);
command.push_back(cache.username);
// Run
run_zenity_and_set_env("MCPI_USERNAME", command);
run_zenity_and_set_env(MCPI_USERNAME_ENV, command);
}
// Bootstrap
bootstrap(argc, argv);
// Save Cache
if (!options.no_cache) {
save_cache();
}
}

View File

@ -0,0 +1,20 @@
#pragma once
#include <string>
#include <functional>
#include "../options/parser.h"
// Defaults
#define DEFAULT_USERNAME "StevePi"
#define DEFAULT_RENDER_DISTANCE "Short"
// Feature Flags
std::string strip_feature_flag_default(const std::string& flag, bool *default_ret);
void load_available_feature_flags(const std::function<void(std::string)> &callback);
// Handle Non-Launch Commands
void handle_non_launch_client_only_commands(const options_t &options);
// Configure Client Options
void configure_client(const options_t &options);

View File

@ -1,246 +0,0 @@
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <signal.h>
#include <poll.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <libreborn/libreborn.h>
#include "crash-report.h"
// Show Crash Report Dialog
#ifndef MCPI_HEADLESS_MODE
#define DIALOG_TITLE "Crash Report"
#define CRASH_REPORT_DIALOG_WIDTH "640"
#define CRASH_REPORT_DIALOG_HEIGHT "480"
static void show_report(const char *log_filename) {
const char *command[] = {
"zenity",
"--title", DIALOG_TITLE,
"--name", MCPI_APP_ID,
"--width", CRASH_REPORT_DIALOG_WIDTH,
"--height", CRASH_REPORT_DIALOG_HEIGHT,
"--text-info",
"--text", "Minecraft: Pi Edition: Reborn has crashed!\n\nNeed help? Consider asking on the <a href=\"https://discord.com/invite/aDqejQGMMy\">Discord server</a>!",
"--filename", log_filename,
"--no-wrap",
"--font", "Monospace",
NULL
};
free(run_command(command, NULL));
}
#endif
// Exit Handler
static void exit_handler(__attribute__((unused)) int signal) {
// Murder
murder_children();
}
// Setup
#define PIPE_READ 0
#define PIPE_WRITE 1
#define MCPI_LOGS_DIR "/tmp/.minecraft-pi-logs"
void setup_crash_report() {
// Store Output
int output_pipe[2];
safe_pipe2(output_pipe, 0);
int error_pipe[2];
safe_pipe2(error_pipe, 0);
int input_pipe[2];
safe_pipe2(input_pipe, 0);
// Fork
pid_t ret = fork();
if (ret == -1) {
ERR("Unable To Fork: %s", strerror(errno));
} else if (ret == 0) {
// Child Process
// Pipe stdio
dup2(output_pipe[PIPE_WRITE], STDOUT_FILENO);
close(output_pipe[PIPE_READ]);
close(output_pipe[PIPE_WRITE]);
dup2(error_pipe[PIPE_WRITE], STDERR_FILENO);
close(error_pipe[PIPE_READ]);
close(error_pipe[PIPE_WRITE]);
dup2(input_pipe[PIPE_READ], STDIN_FILENO);
close(input_pipe[PIPE_READ]);
close(input_pipe[PIPE_WRITE]);
// Create New Process Group
setpgid(0, 0);
// Continue Execution
} else {
// Parent Process
track_child(ret);
// Install Signal Handlers
struct sigaction act_sigint;
memset((void *) &act_sigint, 0, sizeof (struct sigaction));
act_sigint.sa_flags = SA_RESTART;
act_sigint.sa_handler = &exit_handler;
sigaction(SIGINT, &act_sigint, NULL);
struct sigaction act_sigterm;
memset((void *) &act_sigterm, 0, sizeof (struct sigaction));
act_sigterm.sa_flags = SA_RESTART;
act_sigterm.sa_handler = &exit_handler;
sigaction(SIGTERM, &act_sigterm, NULL);
// Close Unneeded File Descriptors
close(output_pipe[PIPE_WRITE]);
close(error_pipe[PIPE_WRITE]);
close(input_pipe[PIPE_READ]);
// Setup Logging
#define BUFFER_SIZE 1024
char buf[BUFFER_SIZE];
// Ensure Temporary Directory
{
// Check If It Exists
struct stat tmp_stat;
int exists = stat(MCPI_LOGS_DIR, &tmp_stat) != 0 ? 0 : S_ISDIR(tmp_stat.st_mode);
if (!exists) {
// Doesn't Exist
if (mkdir(MCPI_LOGS_DIR, S_IRUSR | S_IWUSR | S_IXUSR) != 0) {
ERR("Unable To Create Temporary Folder: %s", strerror(errno));
}
}
}
// Create Temporary File
char log_filename[] = MCPI_LOGS_DIR "/XXXXXX";
int log_file_fd = mkstemp(log_filename);
if (log_file_fd == -1) {
ERR("Unable To Create Log File: %s", strerror(errno));
}
// Setup Polling
int number_fds = 3;
struct pollfd poll_fds[number_fds];
poll_fds[0].fd = output_pipe[PIPE_READ];
poll_fds[1].fd = error_pipe[PIPE_READ];
poll_fds[2].fd = STDIN_FILENO;
for (int i = 0; i < number_fds; i++) {
poll_fds[i].events = POLLIN;
}
// Poll Data
int number_open_fds = number_fds;
while (number_open_fds > 0) {
int poll_ret = poll(poll_fds, number_fds, -1);
if (poll_ret == -1) {
if (errno == EINTR) {
continue;
} else {
ERR("Unable To Poll Data: %s", strerror(errno));
}
}
// Handle Data
for (int i = 0; i < number_fds; i++) {
if (poll_fds[i].revents != 0) {
if (poll_fds[i].revents & POLLIN) {
if (poll_fds[i].fd == STDIN_FILENO) {
// Data Available From stdin
int bytes_available;
if (ioctl(fileno(stdin), FIONREAD, &bytes_available) == -1) {
bytes_available = 0;
}
// Read
ssize_t bytes_read = read(poll_fds[i].fd, (void *) buf, BUFFER_SIZE);
if (bytes_read == -1) {
ERR("Unable To Read Log Data: %s", strerror(errno));
}
// Write To Child
if (write(input_pipe[PIPE_WRITE], (void *) buf, bytes_read) == -1) {
ERR("Unable To Write Input To Child: %s", strerror(errno));
}
} else {
// Data Available From Child's stdout/stderr
ssize_t bytes_read = read(poll_fds[i].fd, (void *) buf, BUFFER_SIZE - 1 /* Account For NULL-Terminator */);
if (bytes_read == -1) {
ERR("Unable To Read Log Data: %s", strerror(errno));
}
// Print To Terminal
buf[bytes_read] = '\0';
fprintf(i == 0 ? stdout : stderr, "%s", buf);
// Write To log
if (write(log_file_fd, (void *) buf, bytes_read) == -1) {
ERR("Unable To Write Log Data: %s", strerror(errno));
}
}
} else {
// File Descriptor No Longer Accessible
if (poll_fds[i].events != 0 && close(poll_fds[i].fd) == -1) {
ERR("Unable To Close File Descriptor: %s", strerror(errno));
}
poll_fds[i].events = 0;
number_open_fds--;
}
}
}
}
// Close Input Pipe
close(input_pipe[PIPE_WRITE]);
// Get Return Code
int status;
waitpid(ret, &status, 0);
untrack_child(ret);
// Check If Is Crash
int is_crash = !is_exit_status_success(status);
// Log Exit Code To log If Crash
if (is_crash) {
// Create Exit Code Log Line
char *exit_status = NULL;
get_exit_status_string(status, &exit_status);
char *exit_code_line = NULL;
safe_asprintf(&exit_code_line, "[CRASH]: Terminated%s\n", exit_status);
free(exit_status);
// Print Exit Code Log Line
fprintf(stderr, "%s", exit_code_line);
// Write Exit Code Log Line
if (write(log_file_fd, (void *) exit_code_line, strlen(exit_code_line)) == -1) {
ERR("Unable To Write Exit Code To Log: %s", strerror(errno));
}
// Free Exit Code Log Line
free(exit_code_line);
}
// Close Log File FD
if (close(log_file_fd) == -1) {
ERR("Unable To Close Log File Descriptor: %s", strerror(errno));
}
// Show Crash Log
#ifndef MCPI_HEADLESS_MODE
if (is_crash) {
show_report(log_filename);
}
#endif
// Delete Log File
if (unlink(log_filename) == -1) {
ERR("Unable To Delete Log File: %s", strerror(errno));
}
// Exit
exit(WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
}
}

View File

@ -0,0 +1,259 @@
#include <unistd.h>
#include <cstring>
#include <cerrno>
#include <cstdlib>
#include <cstdio>
#include <cstdint>
#include <csignal>
#include <poll.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/prctl.h>
#include <ctime>
#include <string>
#include <libreborn/libreborn.h>
#include "crash-report.h"
// Show Crash Report Dialog
#define DIALOG_TITLE "Crash Report"
#define CRASH_REPORT_DIALOG_WIDTH "640"
#define CRASH_REPORT_DIALOG_HEIGHT "480"
static void show_report(const char *log_filename) {
// Fork
pid_t pid = fork();
if (pid == 0) {
// Child
setsid();
ALLOC_CHECK(freopen("/dev/null", "w", stdout));
ALLOC_CHECK(freopen("/dev/null", "w", stderr));
ALLOC_CHECK(freopen("/dev/null", "r", stdin));
const char *command[] = {
"zenity",
"--title", DIALOG_TITLE,
"--name", MCPI_APP_ID,
"--width", CRASH_REPORT_DIALOG_WIDTH,
"--height", CRASH_REPORT_DIALOG_HEIGHT,
"--text-info",
"--text", MCPI_APP_TITLE " has crashed!\n\nNeed help? Consider asking on the <a href=\"" MCPI_DISCORD_INVITE "\">Discord server</a>! <i>If you believe this is a problem with " MCPI_APP_TITLE " itself, please upload this crash report to the #bugs Discord channel.</i>",
"--filename", log_filename,
"--no-wrap",
"--font", "Monospace",
"--save-filename", MCPI_VARIANT_NAME "-crash-report.log",
"--ok-label", "Exit",
NULL
};
safe_execvpe(command, (const char *const *) environ);
}
}
// Exit Handler
static pid_t child_pid = -1;
static void exit_handler(__attribute__((unused)) int signal) {
// Murder
kill(child_pid, SIGTERM);
}
// Log File
static std::string log_filename;
static int log_fd;
static void setup_log_file() {
// Get Log Directory
const std::string home = std::string(getenv(_MCPI_HOME_ENV)) + get_home_subdirectory_for_game_data();
ensure_directory(home.c_str());
const std::string logs = home + "/logs";
ensure_directory(logs.c_str());
// Get Timestamp
time_t raw_time;
time(&raw_time);
const tm *time_info = localtime(&raw_time);
char time[512];
strftime(time, 512, "%Y-%m-%d", time_info);
// Get Log Filename
std::string file;
int num = 1;
do {
file = std::string(time) + '-' + std::to_string(num) + ".log";
log_filename = logs + '/' + file;
num++;
} while (access(log_filename.c_str(), F_OK) != -1);
// Create latest.log Symlink
const std::string latest_log = logs + "/latest.log";
unlink(latest_log.c_str());
if (symlink(file.c_str(), latest_log.c_str()) != 0) {
WARN("Unable To Create Latest Log Symlink: %s", strerror(errno));
}
// Create File
log_fd = open(log_filename.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (log_fd == -1) {
ERR("Unable To Create Log File: %s", strerror(errno));
}
reborn_set_log(log_fd);
}
// Setup
#define PIPE_READ 0
#define PIPE_WRITE 1
#define BUFFER_SIZE 1024
static void safe_write(int fd, const void *buf, size_t size) {
const ssize_t bytes_written = write(fd, buf, size);
if (bytes_written < 0) {
ERR("Unable To Write Data: %s", strerror(errno));
}
}
void setup_crash_report() {
// Setup Logging
setup_log_file();
// Store Output
int output_pipe[2];
safe_pipe2(output_pipe, 0);
int error_pipe[2];
safe_pipe2(error_pipe, 0);
int input_pipe[2];
safe_pipe2(input_pipe, 0);
// Fork
pid_t ret = fork();
if (ret == -1) {
ERR("Unable To Fork: %s", strerror(errno));
} else if (ret == 0) {
// Child Process
// Pipe stdio
dup2(output_pipe[PIPE_WRITE], STDOUT_FILENO);
close(output_pipe[PIPE_READ]);
close(output_pipe[PIPE_WRITE]);
dup2(error_pipe[PIPE_WRITE], STDERR_FILENO);
close(error_pipe[PIPE_READ]);
close(error_pipe[PIPE_WRITE]);
dup2(input_pipe[PIPE_READ], STDIN_FILENO);
close(input_pipe[PIPE_READ]);
close(input_pipe[PIPE_WRITE]);
// Create New Process Group
setpgid(0, 0);
// Kill Child If Parent Exits First
prctl(PR_SET_PDEATHSIG, SIGKILL);
// Continue Execution
} else {
// Install Signal Handlers
child_pid = ret;
struct sigaction act_sigint = {};
act_sigint.sa_flags = SA_RESTART;
act_sigint.sa_handler = &exit_handler;
sigaction(SIGINT, &act_sigint, nullptr);
struct sigaction act_sigterm = {};
act_sigterm.sa_flags = SA_RESTART;
act_sigterm.sa_handler = &exit_handler;
sigaction(SIGTERM, &act_sigterm, nullptr);
// Close Unneeded File Descriptors
close(output_pipe[PIPE_WRITE]);
close(error_pipe[PIPE_WRITE]);
close(input_pipe[PIPE_READ]);
// Set Debug Tag
reborn_debug_tag = "(Crash Reporter) ";
// Setup Polling
const int number_fds = 3;
pollfd poll_fds[number_fds];
poll_fds[0].fd = output_pipe[PIPE_READ];
poll_fds[1].fd = error_pipe[PIPE_READ];
poll_fds[2].fd = STDIN_FILENO;
for (pollfd &poll_fd : poll_fds) {
poll_fd.events = POLLIN;
}
// Poll Data
int status;
while (waitpid(ret, &status, WNOHANG) != ret) {
const int poll_ret = poll(poll_fds, number_fds, -1);
if (poll_ret == -1) {
if (errno == EINTR) {
continue;
} else {
ERR("Unable To Poll Data: %s", strerror(errno));
}
}
// Handle Data
for (pollfd &poll_fd : poll_fds) {
if (poll_fd.revents != 0) {
if (poll_fd.revents & POLLIN) {
char buf[BUFFER_SIZE];
if (poll_fd.fd == STDIN_FILENO) {
// Data Available From stdin
int bytes_available;
if (ioctl(fileno(stdin), FIONREAD, &bytes_available) == -1) {
bytes_available = 0;
}
// Read
const ssize_t bytes_read = read(poll_fd.fd, buf, BUFFER_SIZE);
if (bytes_read == -1) {
ERR("Unable To Read Input: %s", strerror(errno));
}
// Write To Child
safe_write(input_pipe[PIPE_WRITE], buf, bytes_read);
} else {
// Data Available From Child's stdout/stderr
const ssize_t bytes_read = read(poll_fd.fd, buf, BUFFER_SIZE);
if (bytes_read == -1) {
ERR("Unable To Read Log Data: %s", strerror(errno));
}
// Print To Terminal
safe_write(poll_fd.fd == output_pipe[PIPE_READ] ? STDOUT_FILENO : STDERR_FILENO, buf, bytes_read);
// Write To log
safe_write(reborn_get_log_fd(), buf, bytes_read);
}
} else {
// File Descriptor No Longer Accessible
poll_fd.events = 0;
}
}
}
}
// Close Pipes
close(output_pipe[PIPE_READ]);
close(error_pipe[PIPE_READ]);
close(input_pipe[PIPE_WRITE]);
// Check If Is Crash
const bool is_crash = !is_exit_status_success(status);
// Log Exit Code To log If Crash
if (is_crash) {
// Create Exit Code Log Line
char *exit_status = nullptr;
get_exit_status_string(status, &exit_status);
const std::string exit_code_line = "[CRASH]: Terminated" + std::string(exit_status) + '\n';
free(exit_status);
// Print Exit Code Log Line
safe_write(STDERR_FILENO, exit_code_line.c_str(), strlen(exit_code_line.c_str()));
// Write Exit Code Log Line
safe_write(reborn_get_log_fd(), exit_code_line.c_str(), strlen(exit_code_line.c_str()));
}
// Close Log File
close(log_fd);
unsetenv(_MCPI_LOG_FD_ENV);
// Show Crash Log
if (is_crash && !reborn_is_headless()) {
show_report(log_filename.c_str());
}
// Exit
exit(WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
}
}

123
launcher/src/main.cpp Normal file
View File

@ -0,0 +1,123 @@
#include <cstdlib>
#include <libreborn/libreborn.h>
#include <sys/stat.h>
#include "bootstrap.h"
#include "options/parser.h"
#include "crash-report.h"
#include "util.h"
#include "client/configuration.h"
// Bind Options To Environmental Variable
static void bind_to_env(const char *env, const bool value) {
if (value) {
set_and_print_env(env, "1");
}
}
static void setup_environment(const options_t &options) {
// Clear Internal Variables
clear_internal_env_vars();
// Passthrough Options To Game
bind_to_env(_MCPI_SERVER_MODE_ENV, options.server_mode);
bind_to_env(_MCPI_BENCHMARK_ENV, options.benchmark);
bind_to_env(_MCPI_ONLY_GENERATE_ENV, options.only_generate);
bind_to_env(_MCPI_FORCE_HEADLESS_ENV, options.force_headless);
bind_to_env(_MCPI_FORCE_NON_HEADLESS_ENV, options.force_non_headless);
// GTK Dark Mode
set_and_print_env("GTK_THEME", "Adwaita:dark");
// Configure PATH
{
// Get Binary Directory
const std::string binary_directory = get_binary_directory();
std::string new_path = binary_directory + "/bin";
// Add Existing PATH
{
const char *value = getenv("PATH");
if (value != nullptr && strlen(value) > 0) {
new_path += std::string(":") + value;
}
}
// Set And Free
set_and_print_env("PATH", new_path.c_str());
}
// Setup MCPI_HOME
if (const char *custom_profile_directory = getenv(MCPI_PROFILE_DIRECTORY_ENV); custom_profile_directory != nullptr) {
// Custom Directory
custom_profile_directory = realpath(custom_profile_directory, nullptr);
ALLOC_CHECK(custom_profile_directory);
set_and_print_env(_MCPI_HOME_ENV, custom_profile_directory);
free((void *) custom_profile_directory);
} else if (!reborn_is_server()) {
// Ensure $HOME
const char *home = getenv("HOME");
if (home == nullptr) {
ERR("$HOME Is Not Set");
}
set_and_print_env(_MCPI_HOME_ENV, home);
} else {
// Set Home To Current Directory, So World Data Is Stored There
char *launch_directory = getcwd(nullptr, 0);
ALLOC_CHECK(launch_directory);
set_and_print_env(_MCPI_HOME_ENV, launch_directory);
free(launch_directory);
}
// Create If Needed
const std::string minecraft_folder = std::string(getenv(_MCPI_HOME_ENV)) + get_home_subdirectory_for_game_data();
ensure_directory(minecraft_folder.c_str());
}
// Non-Launch Commands
static void handle_non_launch_commands(const options_t &options) {
if (options.copy_sdk) {
const std::string binary_directory = get_binary_directory();
copy_sdk(binary_directory, false);
fflush(stdout);
exit(EXIT_SUCCESS);
}
}
// Start The Game
static void start_game(const options_t &options) {
// Disable stdout Buffering
setvbuf(stdout, nullptr, _IONBF, 0);
// Setup Crash Reporting
if (!options.disable_crash_report) {
setup_crash_report();
}
// Configure Client Options
if (!reborn_is_server()) {
configure_client(options);
}
// Bootstrap
bootstrap(options);
}
// Main
int main(int argc, char *argv[]) {
// Parse Options
options_t options = parse_options(argc, argv);
// Set Debug Tag
reborn_debug_tag = "(Launcher) ";
// Debug Logging
unsetenv(_MCPI_LOG_FD_ENV);
bind_to_env(MCPI_DEBUG_ENV, options.debug);
// Setup Environment
setup_environment(options);
// Handle Non-Launch Commands (Copy SDK, Print Feature Flags, Etc)
handle_non_launch_commands(options);
handle_non_launch_client_only_commands(options);
// Start The Game
start_game(options);
}

100
launcher/src/mods.cpp Normal file
View File

@ -0,0 +1,100 @@
#include <dirent.h>
#include <cerrno>
#include <sys/stat.h>
#include <unistd.h>
#include <libreborn/libreborn.h>
#include "bootstrap.h"
// Get All Mods In Folder
static void load(std::vector<std::string> &ld_preload, const std::string &folder, int recursion_limit = 128);
static void handle_file(std::vector<std::string> &ld_preload, const std::string &file, const int recursion_limit) {
// Check Type
struct stat file_stat = {};
lstat(file.c_str(), &file_stat);
if (S_ISDIR(file_stat.st_mode)) {
// Recurse Into Directory
load(ld_preload, std::string(file) + '/', recursion_limit - 1);
} else if (S_ISLNK(file_stat.st_mode)) {
// Resolve Symlink
char *resolved_file = realpath(file.c_str(), nullptr);
ALLOC_CHECK(resolved_file);
handle_file(ld_preload, resolved_file, recursion_limit);
free(resolved_file);
} else if (S_ISREG(file_stat.st_mode)) {
// Check If File Is Accessible
const int result = access(file.c_str(), R_OK);
if (result == 0) {
// Add To LD_PRELOAD
DEBUG("Found Mod: %s", file.c_str());
ld_preload.push_back(file);
} else if (result == -1 && errno != 0) {
// Fail
WARN("Unable To Access: %s: %s", file.c_str(), strerror(errno));
errno = 0;
}
}
}
static void load(std::vector<std::string> &ld_preload, const std::string &folder, const int recursion_limit) {
// Check Recursion
if (recursion_limit <= 0) {
ERR("Reached Recursion Limit While Loading Mods");
}
// Open Folder
ensure_directory(folder.c_str());
DIR *dp = opendir(folder.c_str());
if (dp == nullptr) {
// Unable To Open Folder
ERR("Error Opening Directory: %s: %s", folder.c_str(), strerror(errno));
}
// Loop Through Folder
while (true) {
errno = 0;
const dirent *entry = readdir(dp);
if (entry != nullptr) {
// Block Pseudo-Directories
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
// Get Full Name
std::string name = folder + entry->d_name;
// Handle
handle_file(ld_preload, name, recursion_limit);
} else if (errno != 0) {
// Error Reading Contents Of Folder
ERR("Error Reading Directory: %s: %s", folder.c_str(), strerror(errno));
} else {
// Done!
break;
}
}
// Close Folder
closedir(dp);
}
// Bootstrap Mods
#define SUBDIRECTORY_FOR_MODS "/mods/"
std::vector<std::string> bootstrap_mods(const std::string &binary_directory) {
// Prepare
std::vector<std::string> preload;
// ~/.minecraft-pi/mods
{
// Get Mods Folder
const std::string mods_folder = std::string(getenv(_MCPI_HOME_ENV)) + get_home_subdirectory_for_game_data() + SUBDIRECTORY_FOR_MODS;
// Load Mods From ./mods
load(preload, mods_folder);
}
// Built-In Mods
{
// Get Mods Folder
const std::string mods_folder = binary_directory + SUBDIRECTORY_FOR_MODS;
// Load Mods From ./mods
load(preload, mods_folder);
}
// Return
return preload;
}

View File

@ -0,0 +1,13 @@
OPTION(debug, "debug", 'd', "Enable Debug Logging")
OPTION(copy_sdk, "copy-sdk", -2, "Extract Modding SDK And Exit")
OPTION(disable_crash_report, "disable-crash-report", -1, "Disable Crash Report Dialog")
OPTION(use_default, "default", -3, "Skip Client-Mode Configuration Dialogs")
OPTION(no_cache, "no-cache", -4, "Disable Client-Mode Configuration Cache")
OPTION(wipe_cache, "wipe-cache", -5, "Wipe Cached Client-Mode Configuration And Exit")
OPTION(print_available_feature_flags, "print-available-feature-flags", -6, "Print Available Client-Mode Feature Flags")
OPTION(benchmark, "benchmark", -7, "Run Client-Mode Benchmark")
OPTION(only_generate, "only-generate", -8, "Generate World And Exit (Server-Mode Only)")
OPTION(force_headless, "force-headless", -9, "Force Disable Game Rendering")
OPTION(force_non_headless, "force-non-headless", -10, "Force Enable Game Rendering")
OPTION(server_mode, "server", -11, "Run In Server-Mode")
OPTION(skip_pagesize_check, "skip-pagesize-check", -12, "Skip Page-Size Check (Not Recommended)")

View File

@ -0,0 +1,45 @@
#include <argp.h>
#include "parser.h"
// Globals
const char *argp_program_version = "Reborn v" MCPI_VERSION;
const char *argp_program_bug_address = "<" MCPI_DISCORD_INVITE ">";
static char doc[] = "Minecraft: Pi Edition Modding Project";
// Options
static int env_key = -100;
static argp_option options_data[] = {
{nullptr, 0, nullptr, 0, "Game Options:", 0},
#define OPTION(ignored, name, key, doc) {name, key, nullptr, 0, doc, 0},
#include "option-list.h"
#undef OPTION
{nullptr, 0, nullptr, 0, "Environmental Variables:", 0},
#define ENV(name, doc) {#name, env_key--, nullptr, OPTION_DOC | OPTION_NO_USAGE | (is_env_var_internal(name##_ENV) ? OPTION_HIDDEN : 0), doc, 0},
#include <libreborn/env-list.h>
#undef ENV
{nullptr, 0, nullptr, 0, "Help Options:", -1},
{nullptr, 0, nullptr, 0, nullptr, 0}
};
// Parse Options
#define OPTION(name, ignored, key, ...) \
case key: \
options->name = true; \
break;
static error_t parse_opt(int key, __attribute__((unused)) char *arg, argp_state *state) {
options_t *options = (options_t *) state->input;
switch (key) {
#include "option-list.h"
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
#undef OPTION
static argp argp = {options_data, parse_opt, nullptr, doc, nullptr, nullptr, nullptr};
options_t parse_options(int argc, char *argv[]) {
options_t options = {};
argp_parse(&argp, argc, argv, 0, nullptr, &options);
return options;
}

View File

@ -0,0 +1,10 @@
#pragma once
#include <libreborn/libreborn.h>
#define OPTION(name, ...) bool name;
struct options_t {
#include "option-list.h"
};
#undef OPTION
options_t parse_options(int argc, char *argv[]);

View File

@ -1,136 +0,0 @@
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <libreborn/libreborn.h>
#include "bootstrap.h"
#include "patchelf.h"
// Duplicate MCPI Executable Into /tmp
static void duplicate_mcpi_executable(const char *original_path, char *new_path) {
// Ensure Temporary Directory
{
// Check If It Exists
struct stat tmp_stat;
int exists = stat(MCPI_PATCHED_DIR, &tmp_stat) != 0 ? 0 : S_ISDIR(tmp_stat.st_mode);
if (!exists) {
// Doesn't Exist
if (mkdir(MCPI_PATCHED_DIR, S_IRUSR | S_IWUSR | S_IXUSR) != 0) {
ERR("Unable To Create Temporary Folder: %s", strerror(errno));
}
}
}
// Generate New File
int new_file_fd = mkstemp(new_path);
if (new_file_fd == -1) {
ERR("Unable To Create Temporary File: %s", strerror(errno));
}
FILE *new_file = fdopen(new_file_fd, "wb");
if (new_file == NULL) {
ERR("Unable To Open Temporary File: %s", strerror(errno));
}
// Copy Original File
{
// Open Original File
FILE *original_file = fopen(original_path, "rb");
if (original_file == NULL) {
ERR("Unable To Open File: %s", original_path);
}
// Copy
#define BUFFER_SIZE 1024
char buf[BUFFER_SIZE];
size_t bytes_read = 0;
while ((bytes_read = fread((void *) buf, 1, BUFFER_SIZE, original_file)) > 0) {
fwrite((void *) buf, 1, bytes_read, new_file);
if (ferror(new_file) != 0) {
ERR("Unable To Write File: %s", new_path);
}
}
if (ferror(original_file) != 0) {
ERR("Unable To Read File: %s", original_path);
}
// Close Original File
fclose(original_file);
}
// Close New File
fclose(new_file);
close(new_file_fd);
}
// Fix MCPI Dependencies
#define patch_mcpi_elf_dependencies_with_extra_patchelf_args(...) \
({ \
const char *const _macro_command[] = { \
"patchelf", \
##__VA_ARGS__, \
"--remove-needed", "libbcm_host.so", \
"--remove-needed", "libX11.so.6", \
"--remove-needed", "libEGL.so", \
"--remove-needed", "libGLESv2.so", \
"--remove-needed", "libSDL-1.2.so.0", \
"--add-needed", "libmedia-layer-core.so", \
new_path, \
NULL \
}; \
int _macro_return_code = 0; \
char *_macro_output = run_command(_macro_command, &_macro_return_code); \
if (_macro_output != NULL) { \
free(_macro_output); \
} \
_macro_return_code; \
})
void patch_mcpi_elf_dependencies(const char *original_path, char *new_path, const char *linker) {
// Duplicate MCPI executable into /tmp so it can be modified.
duplicate_mcpi_executable(original_path, new_path);
// Run patchelf
int return_code;
if (linker == NULL) {
return_code = patch_mcpi_elf_dependencies_with_extra_patchelf_args();
} else {
return_code = patch_mcpi_elf_dependencies_with_extra_patchelf_args("--set-interpreter", linker);
}
if (!is_exit_status_success(return_code)) {
char *exit_status_line = NULL;
get_exit_status_string(return_code, &exit_status_line);
ERR("patchelf Failed%s", exit_status_line);
}
// Fix Permissions
if (chmod(new_path, S_IRUSR | S_IXUSR) != 0) {
ERR("Unable To Set File Permissions: %s: %s", new_path, strerror(errno));
}
}
// Get Interpreter
char *patch_get_interpreter(const char *file) {
// Run
const char *const command[] = {
"patchelf",
"--print-interpreter",
file,
NULL
};
int return_code;
char *output = run_command(command, &return_code);
if (!is_exit_status_success(return_code)) {
char *exit_status_line = NULL;
get_exit_status_string(return_code, &exit_status_line);
ERR("patchelf Failed%s", exit_status_line);
}
if (output != NULL) {
// Trim
int length = strlen(output);
if (output[length - 1] == '\n') {
output[length - 1] = '\0';
}
}
// Return
return output;
}

98
launcher/src/patchelf.cpp Normal file
View File

@ -0,0 +1,98 @@
#include <cstdlib>
#include <sys/stat.h>
#include <ranges>
#include <LIEF/ELF.hpp>
#include <dlfcn.h>
#include <link.h>
#include <libreborn/libreborn.h>
#include "patchelf.h"
// Duplicate MCPI Executable Into /tmp
static void duplicate_mcpi_executable(char *new_path) {
// Ensure Temporary Directory
ensure_directory(MCPI_PATCHED_DIR);
// Generate New File
const int new_file_fd = mkstemp(new_path);
if (new_file_fd == -1) {
ERR("Unable To Create Temporary File: %s", strerror(errno));
}
close(new_file_fd);
}
// Fix MCPI Dependencies
static std::vector<std::string> needed_libraries = {
"libmedia-layer-core.so",
"libpng12.so.0",
"libstdc++.so.6",
"libm.so.6",
"libgcc_s.so.1",
"libc.so.6",
"libpthread.so.0"
};
static std::vector<std::string> function_prefixes_to_patch = {
"SDL_",
"gl"
};
void patch_mcpi_elf_dependencies(const std::string &original_path, char *new_path, const std::string &interpreter, const std::vector<std::string> &rpath, const std::vector<std::string> &mods) {
// Duplicate MCPI executable into /tmp so it can be modified.
duplicate_mcpi_executable(new_path);
// Load Binary
std::unique_ptr<LIEF::ELF::Binary> binary = LIEF::ELF::Parser::parse(original_path);
// Set Interpreter
if (!interpreter.empty()) {
binary->interpreter(interpreter);
}
// Remove Existing Needed Libraries
std::vector<std::string> to_remove;
for (const LIEF::ELF::DynamicEntry &entry : binary->dynamic_entries()) {
const LIEF::ELF::DynamicEntryLibrary *library = dynamic_cast<const LIEF::ELF::DynamicEntryLibrary *>(&entry);
if (library) {
to_remove.push_back(library->name());
}
}
for (const std::string &library : to_remove) {
binary->remove_library(library);
}
// Setup RPath
binary->add(LIEF::ELF::DynamicEntryRpath(rpath));
// Add Libraries
std::vector<std::string> all_libraries;
for (const std::vector<std::string> &list : {mods, needed_libraries}) {
all_libraries.insert(all_libraries.end(), list.begin(), list.end());
}
for (const std::string &library : all_libraries | std::views::reverse) {
binary->add_library(library);
}
// Fix Symbol Names
for (LIEF::ELF::Symbol &symbol : binary->dynamic_symbols()) {
if (symbol.is_function()) {
for (const std::string &prefix : function_prefixes_to_patch) {
if (symbol.name().rfind(prefix, 0) == 0) {
symbol.name("media_" + symbol.name());
break;
}
}
}
}
// Write Binary
LIEF::ELF::Builder builder{*binary};
builder.build();
builder.write(new_path);
// Fix Permissions
if (chmod(new_path, S_IRUSR | S_IXUSR) != 0) {
ERR("Unable To Set File Permissions: %s: %s", new_path, strerror(errno));
}
}

View File

@ -1,14 +1,8 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include <string>
#include <vector>
#define MCPI_PATCHED_DIR "/tmp/.minecraft-pi-patched"
void patch_mcpi_elf_dependencies(const char *original_path, char *new_path, const char *linker);
char *patch_get_interpreter(const char *file);
#ifdef __cplusplus
}
#endif
void patch_mcpi_elf_dependencies(const std::string &original_path, char *new_path, const std::string &interpreter, const std::vector<std::string> &rpath, const std::vector<std::string> &mods);

59
launcher/src/sdk.cpp Normal file
View File

@ -0,0 +1,59 @@
#include <libreborn/libreborn.h>
#include "bootstrap.h"
#include "util.h"
// Log
#define LOG(is_debug, ...) \
{ \
if (is_debug) { \
DEBUG(__VA_ARGS__); \
} else { \
INFO(__VA_ARGS__); \
} \
}
// Copy SDK Into ~/.minecraft-pi
#define HOME_SUBDIRECTORY_FOR_SDK (std::string(get_home_subdirectory_for_game_data()) + "/sdk")
void copy_sdk(const std::string &binary_directory, const bool log_with_debug) {
// Ensure SDK Directory
std::string sdk_path;
{
sdk_path = std::string(getenv(_MCPI_HOME_ENV)) + HOME_SUBDIRECTORY_FOR_SDK;
const char *const command[] = {"mkdir", "-p", sdk_path.c_str(), nullptr};
run_simple_command(command, "Unable To Create SDK Directory");
}
// Lock File
const std::string lock_file_path = sdk_path + "/.lock";
const int lock_file_fd = lock_file(lock_file_path.c_str());
// Output Directory
const std::string output = sdk_path + "/" MCPI_SDK_DIR;
// Source Directory
const std::string source = binary_directory + "/sdk/.";
// Clean
{
const char *const command[] = {"rm", "-rf", output.c_str(), nullptr};
run_simple_command(command, "Unable To Clean SDK Output Directory");
}
// Make Directory
{
const char *const command[] = {"mkdir", "-p", output.c_str(), nullptr};
run_simple_command(command, "Unable To Create SDK Output Directory");
}
// Copy
{
const char *const command[] = {"cp", "-ar", source.c_str(), output.c_str(), nullptr};
run_simple_command(command, "Unable To Copy SDK");
}
// Log
LOG(log_with_debug, "Copied SDK To: %s", output.c_str());
// Unlock File
unlock_file(lock_file_path.c_str(), lock_file_fd);
}

View File

@ -1,19 +0,0 @@
#include <stdlib.h>
#include <unistd.h>
#include <libreborn/libreborn.h>
#include "../bootstrap.h"
int main(int argc, char *argv[]) {
// Pre-Bootstrap
pre_bootstrap(argc, argv);
// Set Home To Current Directory, So World Data Is Stored There
char *launch_directory = getcwd(NULL, 0);
set_and_print_env("HOME", launch_directory);
free(launch_directory);
// Bootstrap
bootstrap(argc, argv);
}

43
launcher/src/util.cpp Normal file
View File

@ -0,0 +1,43 @@
#include <libreborn/libreborn.h>
#include "util.h"
// Simpler Version Of run_command()
void run_simple_command(const char *const command[], const char *error) {
int status = 0;
char *output = run_command(command, &status, nullptr);
if (output != nullptr) {
free(output);
}
if (!is_exit_status_success(status)) {
ERR("%s", error);
}
}
// Chop Off Last Component
void chop_last_component(std::string &str) {
const std::string::size_type pos = str.find_last_of('/');
if (pos == std::string::npos) {
return;
}
str = str.substr(0, pos);
}
// Get Binary Directory (Remember To Free)
std::string safe_realpath(const std::string &path) {
char *raw = realpath(path.c_str(), nullptr);
if (raw == nullptr) {
ERR("Unable To Resolve: %s", path.c_str());
}
std::string str = raw;
free(raw);
return str;
}
std::string get_binary_directory() {
// Get Path To Current Executable
std::string exe = safe_realpath("/proc/self/exe");
// Chop Off Last Component
chop_last_component(exe);
// Return
return exe;
}

9
launcher/src/util.h Normal file
View File

@ -0,0 +1,9 @@
#pragma once
#include <string>
void run_simple_command(const char *const command[], const char *error);
void chop_last_component(std::string &str);
std::string safe_realpath(const std::string &path);
std::string get_binary_directory();

View File

@ -5,7 +5,14 @@ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include/libreborn")
configure_file(include/libreborn/config.h.in "${CMAKE_CURRENT_BINARY_DIR}/include/libreborn/config.h" ESCAPE_QUOTES @ONLY)
# Util
add_library(reborn-util SHARED src/util/elf.c src/util/exec.c src/util/string.c src/util/util.c)
add_library(reborn-util SHARED
src/util/exec.c
src/util/string.c
src/util/util.c
src/util/log.c
src/util/cp437.cpp
src/util/env.c
)
target_include_directories(
reborn-util
PUBLIC
@ -13,6 +20,7 @@ target_include_directories(
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
"$<INSTALL_INTERFACE:${MCPI_SDK_INCLUDE_DIR}/libreborn>"
)
target_link_libraries(reborn-util PRIVATE utf8cpp)
# Install
install(TARGETS reborn-util DESTINATION "${MCPI_LIB_DIR}")
# SDK
@ -24,7 +32,12 @@ endif()
# Patch
if(BUILD_ARM_COMPONENTS)
add_library(reborn-patch SHARED src/patch/patch.c)
add_library(reborn-patch SHARED
src/patch/patch.cpp
src/patch/segments.cpp
src/patch/code-block.cpp
src/patch/instruction.cpp
)
target_link_libraries(reborn-patch dl pthread reborn-util)
target_compile_definitions(reborn-patch PUBLIC -DREBORN_HAS_PATCH_CODE)
# Install
@ -32,3 +45,15 @@ if(BUILD_ARM_COMPONENTS)
# SDK
install(TARGETS reborn-patch EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")
endif()
# Fake LibPNG To Satisfy Symbol Versioning Requirement
if(BUILD_ARM_COMPONENTS)
add_library(fake-libpng SHARED src/fake-libpng/empty.c)
set_target_properties(fake-libpng PROPERTIES
OUTPUT_NAME "png12"
SOVERSION 0
)
target_link_options(fake-libpng PRIVATE "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/fake-libpng/empty.vers")
# Install
install(TARGETS fake-libpng DESTINATION "${MCPI_LIB_DIR}")
endif()

View File

@ -1,11 +1,14 @@
#pragma once
#cmakedefine MCPI_SERVER_MODE
#cmakedefine MCPI_HEADLESS_MODE
#cmakedefine MCPI_IS_APPIMAGE_BUILD
#cmakedefine MCPI_IS_FLATPAK_BUILD
#cmakedefine MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN
#cmakedefine MCPI_USE_GLES1_COMPATIBILITY_LAYER
#cmakedefine MCPI_APP_BASE_TITLE "@MCPI_APP_BASE_TITLE@"
#cmakedefine MCPI_APP_TITLE "@MCPI_APP_TITLE@"
#cmakedefine MCPI_APP_ID "@MCPI_APP_ID@"
#cmakedefine MCPI_VERSION "@MCPI_VERSION@"
#cmakedefine MCPI_VARIANT_NAME "@MCPI_VARIANT_NAME@"
#cmakedefine MCPI_SDK_DIR "@MCPI_SDK_DIR@"
#cmakedefine MCPI_SKIN_SERVER "@MCPI_SKIN_SERVER@"
#cmakedefine MCPI_DISCORD_INVITE "@MCPI_DISCORD_INVITE@"
#cmakedefine MCPI_DOCUMENTATION "@MCPI_DOCUMENTATION@"

View File

@ -1,22 +0,0 @@
#pragma once
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <elf.h>
#include <link.h>
#include "log.h"
#include "exec.h"
#ifdef __cplusplus
extern "C" {
#endif
// Find And Iterate Over All Segments In Current Binary
typedef void (*segment_callback_t)(ElfW(Addr) section, ElfW(Word) size, void *data);
void iterate_segments(segment_callback_t callback, void *data);
#ifdef __cplusplus
}
#endif

Some files were not shown because too many files have changed in this diff Show More