Compare commits
477 Commits
Author | SHA1 | Date |
---|---|---|
TheBrokenRail | eeef63d9ef | |
TheBrokenRail | e1f0787e48 | |
TheBrokenRail | 37e1abbdd3 | |
TheBrokenRail | c88db307d7 | |
TheBrokenRail | 75fc48da24 | |
TheBrokenRail | cd39733177 | |
TheBrokenRail | 592d6c4e63 | |
TheBrokenRail | d519142a8a | |
TheBrokenRail | 09bae1cf3e | |
TheBrokenRail | 4523935d62 | |
Bigjango13 | f3f8e342d8 | |
Bigjango13 | f010e51c3a | |
Bigjango13 | 91ee97f005 | |
Bigjango13 | a6b01da677 | |
Bigjango13 | 2549670ee4 | |
Bigjango13 | d0954a22f3 | |
TheBrokenRail | 49a54a7396 | |
TheBrokenRail | a305cf9e38 | |
TheBrokenRail | cf6989bed2 | |
TheBrokenRail | b2a7fe3eaf | |
TheBrokenRail | 7739fb6b9b | |
TheBrokenRail | f3755387e8 | |
TheBrokenRail | b1b28defd5 | |
TheBrokenRail | 18c5d34974 | |
Bigjango13 | 76a66a0ba5 | |
Bigjango13 | a6ad1994de | |
Bigjango13 | 8de638eb1a | |
Bigjango13 | 5e5088e3ef | |
Bigjango13 | a6e0cd8f13 | |
Bigjango13 | 3ff24c2a92 | |
TheBrokenRail | d74d1501ce | |
TheBrokenRail | fb84bcc06b | |
TheBrokenRail | 117c5d2702 | |
TheBrokenRail | 9556d13791 | |
Bigjango13 | f8bd6d380b | |
Bigjango13 | 5d57253d56 | |
Bigjango13 | 6ac808919f | |
Bigjango13 | 5353bc188d | |
Bigjango13 | f57c0a6190 | |
TheBrokenRail | b033912633 | |
TheBrokenRail | a2b3bb128b | |
TheBrokenRail | 180ba9dcaf | |
TheBrokenRail | 71cc24104c | |
TheBrokenRail | 6951ebe620 | |
TheBrokenRail | 28dbb2eacd | |
TheBrokenRail | d86018717e | |
TheBrokenRail | db22caa50f | |
TheBrokenRail | ecbcfb2922 | |
TheBrokenRail | 781377005e | |
TheBrokenRail | 6e306e500d | |
TheBrokenRail | 7e300a6e1b | |
bigjango13 | f5a680af7b | |
Bigjango13 | c62d5264a8 | |
Bigjango13 | 93498ce9c0 | |
TheBrokenRail | 90a2b0ac85 | |
Bigjango13 | 2d9d4a638a | |
Bigjango13 | 8c265a69d9 | |
TheBrokenRail | b5e9486460 | |
TheBrokenRail | 7fc5638143 | |
TheBrokenRail | 7ba9daa84e | |
TheBrokenRail | 930d0120f3 | |
TheBrokenRail | 31fcff13e9 | |
TheBrokenRail | 41fcc942fa | |
TheBrokenRail | ddd9226e9e | |
TheBrokenRail | a336cd1c7b | |
TheBrokenRail | eaf6dd2fe2 | |
TheBrokenRail | 99b43ddb5a | |
TheBrokenRail | 4f32cfab45 | |
TheBrokenRail | 69211eb31d | |
TheBrokenRail | 58713976d4 | |
TheBrokenRail | d175f692e0 | |
TheBrokenRail | 6d4ff44092 | |
TheBrokenRail | 1771919cc1 | |
TheBrokenRail | 522cee2d3b | |
TheBrokenRail | ccc7e5b190 | |
TheBrokenRail | 7c9d16d662 | |
TheBrokenRail | 49f56bd90d | |
TheBrokenRail | 0b252faa5f | |
Bigjango13 | 233e8d691b | |
Bigjango13 | 83a282551d | |
Bigjango13 | 29b49ac70a | |
Bigjango13 | 118fc6f396 | |
Bigjango13 | e95236023c | |
TheBrokenRail | 46241c9aa0 | |
TheBrokenRail | f7be586a4c | |
Bigjango13 | 5c5538df2f | |
Bigjango13 | 2995d1c9ad | |
Bigjango13 | b9b44a62bc | |
Bigjango13 | 7e546a4a09 | |
Bigjango13 | be5bcf24c4 | |
TheBrokenRail | 91ff082c97 | |
TheBrokenRail | 40cd1b0a14 | |
TheBrokenRail | 5c607d96b8 | |
TheBrokenRail | 6e9b364f81 | |
TheBrokenRail | 67a0d3017b | |
TheBrokenRail | e4d9ee4f20 | |
TheBrokenRail | d32fa2d265 | |
TheBrokenRail | 34c24378f3 | |
TheBrokenRail | b7b60876d8 | |
TheBrokenRail | 4dff667749 | |
TheBrokenRail | aa92da6fdd | |
TheBrokenRail | 0be1f4fce8 | |
TheBrokenRail | 631cbc07d0 | |
TheBrokenRail | 5f8c700081 | |
TheBrokenRail | ac55d7d6b3 | |
TheBrokenRail | ef29e4fc0e | |
TheBrokenRail | 35c6adf94b | |
TheBrokenRail | 1d08b8a29e | |
TheBrokenRail | 7296fcee83 | |
TheBrokenRail | 97b46ad01a | |
TheBrokenRail | 17d11647e7 | |
TheBrokenRail | 48137f9665 | |
TheBrokenRail | c956151603 | |
TheBrokenRail | 73b51be43f | |
TheBrokenRail | 71b11b314b | |
TheBrokenRail | 168b825bf4 | |
TheBrokenRail | edca3ad394 | |
TheBrokenRail | 1aed33a48b | |
TheBrokenRail | 177c5262a6 | |
TheBrokenRail | 7969fb2127 | |
TheBrokenRail | b0aac13057 | |
TheBrokenRail | 80c0f24a5d | |
TheBrokenRail | 0f9da6148b | |
TheBrokenRail | ea48728a68 | |
TheBrokenRail | 3e7037f621 | |
TheBrokenRail | 11230c120d | |
TheBrokenRail | 1f05424651 | |
TheBrokenRail | 98db527a13 | |
TheBrokenRail | 85e04fbcc6 | |
TheBrokenRail | 018e506c80 | |
TheBrokenRail | 945ce81fe1 | |
TheBrokenRail | fab66319ea | |
taylorthemushroom | 99424546f8 | |
taylorthemushroom | cef22a5325 | |
taylorthemushroom | 67ef365505 | |
taylorthemushroom | 588eb5feb0 | |
TheBrokenRail | c711c8b019 | |
TheBrokenRail | 864c096785 | |
TheBrokenRail | 9ef0868889 | |
TheBrokenRail | 5b792fbf3a | |
TheBrokenRail | c908d46d54 | |
TheBrokenRail | db03d964de | |
TheBrokenRail | c0cd9b8b1f | |
TheBrokenRail | a8835153b0 | |
TheBrokenRail | e1f2867d78 | |
TheBrokenRail | 7a5fef7024 | |
TheBrokenRail | da9edee160 | |
TheBrokenRail | 9e517f5e60 | |
TheBrokenRail | 85e3cb6228 | |
TheBrokenRail | 1dd0526197 | |
TheBrokenRail | 7ecc6cb00b | |
TheBrokenRail | 4189f3fd1d | |
TheBrokenRail | de18189b44 | |
TheBrokenRail | a622858a18 | |
TheBrokenRail | b005106b44 | |
TheBrokenRail | 61add936cc | |
TheBrokenRail | d3b78acbef | |
TheBrokenRail | 07a27d4dd9 | |
TheBrokenRail | 6779905830 | |
TheBrokenRail | c3fda82642 | |
TheBrokenRail | e0ab968fa3 | |
TheBrokenRail | 45b93534fa | |
TheBrokenRail | 5273d6cdf9 | |
TheBrokenRail | 06af8c821f | |
TheBrokenRail | 7b4729b8ec | |
TheBrokenRail | ffad36224e | |
TheBrokenRail | 236f7e385d | |
TheBrokenRail | f506b10051 | |
TheBrokenRail | 9b4a9994ba | |
TheBrokenRail | 32cd0c426f | |
TheBrokenRail | 5690df3ebe | |
TheBrokenRail | b4bebfb701 | |
TheBrokenRail | 1fa444f810 | |
TheBrokenRail | f3dc145d4a | |
TheBrokenRail | 5d65b4092f | |
TheBrokenRail | 81aa01daf9 | |
TheBrokenRail | 2edfa62c25 | |
TheBrokenRail | 4870afcc7f | |
TheBrokenRail | c178e5e5eb | |
TheBrokenRail | 57b0bce12c | |
TheBrokenRail | 95345a5f1b | |
TheBrokenRail | 717b4a11a7 | |
TheBrokenRail | 40a527bb23 | |
TheBrokenRail | 2766611878 | |
TheBrokenRail | 8532e7707f | |
TheBrokenRail | 703ced337b | |
TheBrokenRail | bedd5ea53a | |
TheBrokenRail | eb3c5d2e6f | |
TheBrokenRail | ab1dbd2996 | |
TheBrokenRail | 29bc6faf3d | |
TheBrokenRail | 5aae95fd37 | |
TheBrokenRail | 5739c5f999 | |
TheBrokenRail | 34ef2d51aa | |
TheBrokenRail | f328800ce8 | |
TheBrokenRail | 02c73176a5 | |
TheBrokenRail | 16ce586e9c | |
TheBrokenRail | 6378a18494 | |
TheBrokenRail | 6994671c6d | |
TheBrokenRail | 58f329bb4f | |
TheBrokenRail | d03a1a96ff | |
TheBrokenRail | 35cafec1ee | |
TheBrokenRail | 4ab6b7aed1 | |
TheBrokenRail | edd346dd66 | |
TheBrokenRail | 0d9f498aa7 | |
TheBrokenRail | d761ad8614 | |
TheBrokenRail | 4977898bcd | |
TheBrokenRail | 513628d91f | |
TheBrokenRail | 9a521ebca2 | |
TheBrokenRail | deae36ed94 | |
TheBrokenRail | 00d6ee4f9a | |
TheBrokenRail | 8dd562a20f | |
TheBrokenRail | c11c7203ef | |
TheBrokenRail | 379da809cd | |
TheBrokenRail | 96baf9627a | |
TheBrokenRail | 279b101e46 | |
TheBrokenRail | b190851d36 | |
TheBrokenRail | c3c7d22006 | |
TheBrokenRail | 3abbb0cb16 | |
TheBrokenRail | dda511f8ff | |
TheBrokenRail | 0ccc1ba6e8 | |
TheBrokenRail | 9d3a0964b0 | |
TheBrokenRail | ed9bef8492 | |
TheBrokenRail | c4e26c5be2 | |
TheBrokenRail | 0c82db4116 | |
TheBrokenRail | ce168c1c16 | |
TheBrokenRail | 93eb7807aa | |
TheBrokenRail | 12074e15d9 | |
TheBrokenRail | 010aaa89e3 | |
TheBrokenRail | 0e32fd36c8 | |
TheBrokenRail | 6c89e64f8b | |
TheBrokenRail | 9fe6a2fb39 | |
TheBrokenRail | c87a6fa3c0 | |
TheBrokenRail | 69d3832815 | |
TheBrokenRail | 67002006f3 | |
TheBrokenRail | eb96d80e5a | |
TheBrokenRail | 968001897d | |
TheBrokenRail | 68519f06fd | |
TheBrokenRail | b3b935dd1d | |
TheBrokenRail | 006243d02f | |
TheBrokenRail | 3c1bce876c | |
TheBrokenRail | 484d3e7f90 | |
TheBrokenRail | 23df63abb7 | |
TheBrokenRail | 126c3d618d | |
TheBrokenRail | 3937f88084 | |
TheBrokenRail | 4bd2fecfa2 | |
TheBrokenRail | b539491713 | |
TheBrokenRail | ea4c5c77a1 | |
TheBrokenRail | e506dbb1bb | |
TheBrokenRail | 699d83c61b | |
TheBrokenRail | 329f92c0a4 | |
TheBrokenRail | bfa0567ac9 | |
TheBrokenRail | a94708a1ae | |
TheBrokenRail | 905a569c09 | |
TheBrokenRail | 53f602403a | |
TheBrokenRail | 2f64552926 | |
TheBrokenRail | 2b920f50ba | |
TheBrokenRail | d859a16b5a | |
TheBrokenRail | 78e17d8c18 | |
TheBrokenRail | 0e7a108a0a | |
TheBrokenRail | ca21877000 | |
TheBrokenRail | f1ec29ec86 | |
TheBrokenRail | 13ac816baa | |
TheBrokenRail | 6ba86b9193 | |
TheBrokenRail | 49f8da2a80 | |
TheBrokenRail | e8faee62fa | |
TheBrokenRail | a8ff58f0c4 | |
TheBrokenRail | daccf65361 | |
TheBrokenRail | 3d508d7609 | |
TheBrokenRail | 0061edb3b2 | |
TheBrokenRail | baeeceeaac | |
TheBrokenRail | 211bf265ff | |
TheBrokenRail | 0dd0706f52 | |
TheBrokenRail | 1743626113 | |
TheBrokenRail | 4ed11b67e7 | |
TheBrokenRail | 365e238c29 | |
TheBrokenRail | 36c4ed7e4d | |
TheBrokenRail | cf1faf4835 | |
TheBrokenRail | cb4560a602 | |
TheBrokenRail | b3a96dc3e2 | |
TheBrokenRail | be300a2809 | |
TheBrokenRail | 77d7b82a14 | |
TheBrokenRail | b59c580f6a | |
TheBrokenRail | 524a390921 | |
TheBrokenRail | ead7e575f3 | |
TheBrokenRail | f2a9b274d2 | |
TheBrokenRail | dd4972172d | |
TheBrokenRail | 8822a22987 | |
TheBrokenRail | 53cb68beee | |
TheBrokenRail | 47ae13ac51 | |
TheBrokenRail | 492725ed63 | |
TheBrokenRail | 7c2d0d5625 | |
TheBrokenRail | 9449cdf747 | |
TheBrokenRail | d95a9e1871 | |
TheBrokenRail | 8a83702c3c | |
TheBrokenRail | be7e44fd3c | |
TheBrokenRail | 651c49980e | |
TheBrokenRail | 46a53ba3cf | |
TheBrokenRail | 186728ca5f | |
TheBrokenRail | 9412c07c45 | |
TheBrokenRail | 2717e062b3 | |
TheBrokenRail | 0723fb1894 | |
TheBrokenRail | 16f919d147 | |
TheBrokenRail | e18fc9fc63 | |
TheBrokenRail | 3ebdffd396 | |
TheBrokenRail | 82b6252927 | |
TheBrokenRail | 4a35935daf | |
TheBrokenRail | 89c29f14b1 | |
TheBrokenRail | 4edfaeead4 | |
TheBrokenRail | bfcdd3c7e9 | |
TheBrokenRail | 5467b5178f | |
TheBrokenRail | 8f49c550ba | |
TheBrokenRail | 50eb4801a0 | |
TheBrokenRail | a3eef9fc3b | |
TheBrokenRail | f455780833 | |
TheBrokenRail | 0150879d2b | |
TheBrokenRail | 623cf06516 | |
TheBrokenRail | 0b1849a9ad | |
TheBrokenRail | 157d51e6b6 | |
TheBrokenRail | ed58356dd8 | |
TheBrokenRail | fae728061a | |
TheBrokenRail | 353565ce5a | |
TheBrokenRail | efa21bc8a5 | |
TheBrokenRail | 61f9a329ea | |
TheBrokenRail | 3c0c260920 | |
TheBrokenRail | 0592db9bdf | |
TheBrokenRail | 3fee57ce60 | |
TheBrokenRail | b3c32b211b | |
TheBrokenRail | ea92e5188e | |
TheBrokenRail | 9a4b70b5ca | |
TheBrokenRail | b5974f3f46 | |
TheBrokenRail | 709de17558 | |
TheBrokenRail | 3894e98a04 | |
TheBrokenRail | bf890d190b | |
TheBrokenRail | a40da62b70 | |
TheBrokenRail | 59b8fd9f54 | |
TheBrokenRail | 55a815643b | |
TheBrokenRail | aa471fb4ba | |
TheBrokenRail | 4c33b6da9a | |
TheBrokenRail | 3048b3bf50 | |
TheBrokenRail | 03312f44b6 | |
TheBrokenRail | bdeb45eed2 | |
TheBrokenRail | 9f63fa712f | |
TheBrokenRail | e319d46ea0 | |
TheBrokenRail | c88cbd151e | |
TheBrokenRail | 46abc4c4bd | |
TheBrokenRail | 00f8ed4752 | |
TheBrokenRail | 0fd8ba7de9 | |
TheBrokenRail | 07baea7b5a | |
TheBrokenRail | 8792e5749d | |
TheBrokenRail | 53b2c20b8b | |
TheBrokenRail | 244a69d1aa | |
TheBrokenRail | a1f777f632 | |
TheBrokenRail | 5d8a1e4230 | |
TheBrokenRail | 742ead51e1 | |
TheBrokenRail | c33a27b2ea | |
TheBrokenRail | c1377d4f2a | |
TheBrokenRail | e0ebc7fc32 | |
TheBrokenRail | 0fcda17120 | |
TheBrokenRail | e9e9b90bdb | |
TheBrokenRail | 0fd562af40 | |
TheBrokenRail | 1eb06b6b60 | |
TheBrokenRail | c6983ac6c5 | |
TheBrokenRail | 4a69d38e35 | |
TheBrokenRail | 5636abc051 | |
TheBrokenRail | 33c7d025a5 | |
TheBrokenRail | 7f7bc08201 | |
TheBrokenRail | b36df1d8ff | |
TheBrokenRail | bf58129164 | |
TheBrokenRail | 654c719187 | |
TheBrokenRail | e1e2977c29 | |
TheBrokenRail | a85fc1f5fa | |
TheBrokenRail | e3a4cabf61 | |
TheBrokenRail | 4c3fefae89 | |
TheBrokenRail | 729eff232a | |
TheBrokenRail | 560c040416 | |
TheBrokenRail | ea49470450 | |
TheBrokenRail | 5a5fe4c731 | |
TheBrokenRail | 406aa3f9a6 | |
TheBrokenRail | 55679dd54c | |
TheBrokenRail | dbee357ebc | |
TheBrokenRail | bc461d39d5 | |
TheBrokenRail | 21de7487bb | |
TheBrokenRail | 7ad36d0ce1 | |
TheBrokenRail | d17416421a | |
TheBrokenRail | 154adea292 | |
TheBrokenRail | 291e560c8f | |
TheBrokenRail | 472f5d67a5 | |
TheBrokenRail | a79a601c59 | |
TheBrokenRail | e85231bf69 | |
TheBrokenRail | da0aef568d | |
TheBrokenRail | f8b7af1370 | |
TheBrokenRail | 6a7d881258 | |
TheBrokenRail | 2e9ee42d75 | |
TheBrokenRail | 941572063e | |
TheBrokenRail | 43d27e8e11 | |
TheBrokenRail | 7e3cfaa1a8 | |
TheBrokenRail | 320e0c652a | |
TheBrokenRail | e5fc2a61aa | |
TheBrokenRail | 5cf4d7f915 | |
TheBrokenRail | 51d7974ded | |
TheBrokenRail | 16ebea9ed6 | |
TheBrokenRail | 05587efc04 | |
TheBrokenRail | 9ad6cc3906 | |
TheBrokenRail | 12de038f37 | |
TheBrokenRail | 1daede7dba | |
TheBrokenRail | 28a6d59c2d | |
TheBrokenRail | f2bd893241 | |
TheBrokenRail | 28424aa86a | |
TheBrokenRail | 637f1c1132 | |
TheBrokenRail | 74d14ecaa6 | |
TheBrokenRail | f3eaa57041 | |
TheBrokenRail | 015235b889 | |
TheBrokenRail | 8c356dd65c | |
TheBrokenRail | 6a9a22ac25 | |
TheBrokenRail | c45211ad22 | |
TheBrokenRail | 7498c1e932 | |
TheBrokenRail | 734bded289 | |
TheBrokenRail | b7b130e675 | |
TheBrokenRail | 0a65c91d14 | |
TheBrokenRail | 55475a3a0c | |
TheBrokenRail | f9acb08e4f | |
TheBrokenRail | db64afc550 | |
TheBrokenRail | 0465dc75a7 | |
TheBrokenRail | 68a252c3df | |
TheBrokenRail | 866ebfe159 | |
TheBrokenRail | 1f3036c7e1 | |
TheBrokenRail | a338c11f9d | |
TheBrokenRail | 647a482fbd | |
TheBrokenRail | 6c791d6c9d | |
TheBrokenRail | d18afddf1b | |
TheBrokenRail | d851a8f3e1 | |
TheBrokenRail | a762654e35 | |
TheBrokenRail | 4aeb2fd95b | |
TheBrokenRail | c60fb51fae | |
TheBrokenRail | 4597e824bb | |
TheBrokenRail | d372169c79 | |
TheBrokenRail | 99b709fea7 | |
TheBrokenRail | 578bb1c89f | |
TheBrokenRail | 80d5674781 | |
TheBrokenRail | a925463fdf | |
TheBrokenRail | a9830c3bba | |
TheBrokenRail | d114a2d668 | |
TheBrokenRail | 8f782099da | |
TheBrokenRail | 99f33cab61 | |
TheBrokenRail | 4652efcd65 | |
TheBrokenRail | 665fe30a5f | |
TheBrokenRail | e8ae2a9230 | |
TheBrokenRail | 7b4a8a4d4f | |
TheBrokenRail | 6e6537eea1 | |
TheBrokenRail | a196581bbe | |
TheBrokenRail | b32c6013fb | |
TheBrokenRail | 1877996874 | |
TheBrokenRail | bf14e71c87 | |
TheBrokenRail | 07d79b66ea | |
TheBrokenRail | 0bce0d17ac | |
TheBrokenRail | 0c0a61cd23 | |
TheBrokenRail | 989dd7983b | |
TheBrokenRail | 73f900f8b4 | |
TheBrokenRail | 053bf4aa5f | |
TheBrokenRail | 2b0d1d55ff | |
TheBrokenRail | b1d81e860f | |
TheBrokenRail | bf937f8c86 | |
TheBrokenRail | d72c65b7ab | |
TheBrokenRail | 9d1b6aea65 | |
TheBrokenRail | f0439e9683 | |
TheBrokenRail | 6d79beeeb6 | |
TheBrokenRail | 747d2032e6 | |
TheBrokenRail | 0f6c3c2e43 | |
TheBrokenRail | 4fad749cdf | |
TheBrokenRail | f84ffebf8c | |
TheBrokenRail | e73596fd57 | |
TheBrokenRail | 005492fad4 | |
TheBrokenRail | 80d6385d68 | |
TheBrokenRail | 42ef5b9b8b | |
TheBrokenRail | d0c2b98ca6 | |
TheBrokenRail | e252afbe22 | |
TheBrokenRail | 352c9de936 |
|
@ -1,9 +0,0 @@
|
||||||
/.git
|
|
||||||
/.gitignore
|
|
||||||
/Dockerfile*
|
|
||||||
/Jenkinsfile
|
|
||||||
/out
|
|
||||||
/LICENSE
|
|
||||||
*.md
|
|
||||||
/debian
|
|
||||||
/scripts
|
|
|
@ -0,0 +1,122 @@
|
||||||
|
name: 'CI'
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
- '!flatpak'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Build Project
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
mode:
|
||||||
|
- Client
|
||||||
|
- Server
|
||||||
|
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 ${{ matrix.arch }}
|
||||||
|
# Build
|
||||||
|
- name: Build
|
||||||
|
run: ./scripts/build.mjs appimage ${{ matrix.mode }} ${{ matrix.arch }}
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ matrix.mode }} (${{ matrix.arch }})
|
||||||
|
path: ./out/*.AppImage*
|
||||||
|
if-no-files-found: error
|
||||||
|
# Test Project
|
||||||
|
test:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
mode:
|
||||||
|
- Client
|
||||||
|
- Server
|
||||||
|
name: Test
|
||||||
|
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
|
||||||
|
# Test
|
||||||
|
- name: Test
|
||||||
|
run: ./scripts/test.sh ${{ matrix.mode }}
|
||||||
|
# Example Mods
|
||||||
|
example-mods:
|
||||||
|
name: Build Example Mods
|
||||||
|
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
|
||||||
|
- name: Install ARM Toolchain
|
||||||
|
run: apt-get install --no-install-recommends -y g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf
|
||||||
|
# Build SDK
|
||||||
|
- name: Build SDK
|
||||||
|
run: |
|
||||||
|
./scripts/build.mjs none client host
|
||||||
|
export _MCPI_SKIP_ROOT_CHECK=1
|
||||||
|
export DISPLAY=
|
||||||
|
./out/client/host/usr/bin/minecraft-pi-reborn-client --copy-sdk
|
||||||
|
# Build Example Mods
|
||||||
|
- name: Build Example Mods
|
||||||
|
run: ./example-mods/build.sh
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Example Mods
|
||||||
|
path: ./example-mods/out/*
|
||||||
|
if-no-files-found: error
|
||||||
|
# Create Release
|
||||||
|
release:
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
needs: build
|
||||||
|
name: Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: node:lts-bullseye
|
||||||
|
steps:
|
||||||
|
# Dependencies
|
||||||
|
- name: Install Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '>=1.20.1'
|
||||||
|
# Download Artifacts
|
||||||
|
- name: Download Artifacts
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
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)"
|
|
@ -1,3 +1,18 @@
|
||||||
/out
|
/out
|
||||||
/debian/tmp
|
/debian/tmp
|
||||||
/.vscode
|
/.vscode
|
||||||
|
/build*
|
||||||
|
/CMakeLists.txt.user
|
||||||
|
*.autosave
|
||||||
|
/AppImageBuilder.yml
|
||||||
|
/appimage-builder-cache
|
||||||
|
/appimage-build
|
||||||
|
/AppDir
|
||||||
|
/*.zsync
|
||||||
|
/*.AppImage
|
||||||
|
/core*
|
||||||
|
/qemu_*
|
||||||
|
/example-mods/out
|
||||||
|
/.testing-tmp
|
||||||
|
/cmake-build-*
|
||||||
|
/.idea
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
[submodule "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/minecraft-pi-reborn/zenity.git
|
||||||
|
[submodule "dependencies/LIEF/src"]
|
||||||
|
path = dependencies/LIEF/src
|
||||||
|
url = https://github.com/lief-project/LIEF.git
|
||||||
|
[submodule "media-layer/core/gles/dependencies/gles-compatibility-layer"]
|
||||||
|
path = dependencies/gles-compatibility-layer/src
|
||||||
|
url = https://gitea.thebrokenrail.com/minecraft-pi-reborn/gles-compatibility-layer.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
|
|
@ -0,0 +1,182 @@
|
||||||
|
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
|
||||||
|
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/util.cmake)
|
||||||
|
|
||||||
|
# Sanity Checks
|
||||||
|
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}")
|
||||||
|
|
||||||
|
# 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)\n"
|
||||||
|
" add_link_options(-s)\n"
|
||||||
|
"else()\n"
|
||||||
|
" add_compile_options(-g)\n"
|
||||||
|
"endif()\n"
|
||||||
|
|
||||||
|
# PIC
|
||||||
|
"set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)\n"
|
||||||
|
|
||||||
|
# Warnings
|
||||||
|
"add_link_options(-Wl,--no-undefined)\n"
|
||||||
|
|
||||||
|
# C Standard
|
||||||
|
"add_definitions(-D_GNU_SOURCE)\n"
|
||||||
|
"set(CMAKE_C_STANDARD 99)\n"
|
||||||
|
"set(CMAKE_CXX_STANDARD 11)\n"
|
||||||
|
|
||||||
|
# Skip RPath
|
||||||
|
"set(CMAKE_SKIP_BUILD_RPATH TRUE)"
|
||||||
|
)
|
||||||
|
cmake_language(EVAL CODE "${COMPILE_FLAGS_SETUP}")
|
||||||
|
|
||||||
|
# Fast Math
|
||||||
|
add_compile_options(-ffast-math)
|
||||||
|
|
||||||
|
# Warnings
|
||||||
|
add_compile_options(-Wall -Wextra -Werror -Wpointer-arith -Wshadow -Wnull-dereference)
|
||||||
|
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)
|
||||||
|
endif()
|
||||||
|
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 11.0)
|
||||||
|
add_compile_options(-Wno-array-bounds -Wno-stringop-overread)
|
||||||
|
endif()
|
||||||
|
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)
|
||||||
|
|
||||||
|
# Build Media Layer
|
||||||
|
add_subdirectory(media-layer)
|
||||||
|
|
||||||
|
# Build Launcher
|
||||||
|
if(BUILD_NATIVE_COMPONENTS)
|
||||||
|
add_subdirectory(launcher)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include Symbols
|
||||||
|
if(BUILD_ARM_COMPONENTS)
|
||||||
|
add_subdirectory(symbols)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Build Mods
|
||||||
|
if(BUILD_ARM_COMPONENTS)
|
||||||
|
add_subdirectory(mods)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include Images
|
||||||
|
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)
|
||||||
|
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"
|
||||||
|
)
|
||||||
|
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>/install")
|
||||||
|
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>/install"
|
||||||
|
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}/install/${MCPI_INSTALL_DIR}/" DESTINATION "${MCPI_INSTALL_DIR}")
|
||||||
|
endif()
|
|
@ -0,0 +1,19 @@
|
||||||
|
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"]
|
|
@ -1,3 +0,0 @@
|
||||||
FROM ubuntu:focal
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y docker.io rsync
|
|
|
@ -1,52 +0,0 @@
|
||||||
# Runtime Base Environment
|
|
||||||
FROM arm32v7/debian:bullseye-slim AS runtime-base
|
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
|
||||||
RUN \
|
|
||||||
# Install Runtime Dependencies
|
|
||||||
apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends tini libgles1 libx11-6 zlib1g libfreeimage3 libglfw3 xinput libxfixes3 gosu tk && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Compile Environment
|
|
||||||
FROM runtime-base AS build
|
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
|
||||||
RUN \
|
|
||||||
# Install Dependencies
|
|
||||||
apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends libgles-dev libx11-dev libxrandr-dev libsdl1.2-dev gcc g++ libc-dev make cmake zlib1g-dev git wget ca-certificates libfreeimage-dev libglfw3-dev xinput libxfixes-dev && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Add Build Scripts
|
|
||||||
ADD ./build /app/build
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
# Download MCPI
|
|
||||||
./build/download-minecraft-pi.sh && \
|
|
||||||
# Build LibPNG12
|
|
||||||
./build/build-libpng12.sh
|
|
||||||
|
|
||||||
# Add Code
|
|
||||||
ADD . /app
|
|
||||||
|
|
||||||
# Build Mods
|
|
||||||
RUN ./build/build-mods.sh
|
|
||||||
|
|
||||||
# Runtime Environment
|
|
||||||
FROM runtime-base AS runtime
|
|
||||||
|
|
||||||
# Setup /home Permissions
|
|
||||||
RUN \
|
|
||||||
mkdir -p /home && \
|
|
||||||
chmod -R a+rw /home
|
|
||||||
|
|
||||||
# Copy Build
|
|
||||||
COPY --from=build /app/minecraft-pi /app/minecraft-pi
|
|
||||||
|
|
||||||
WORKDIR /app/minecraft-pi
|
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
|
||||||
CMD ["./run.sh"]
|
|
|
@ -1,3 +0,0 @@
|
||||||
FROM thebrokenrail/minecraft-pi-reborn:client
|
|
||||||
|
|
||||||
ENV MCPI_MODE=server
|
|
|
@ -1,38 +0,0 @@
|
||||||
pipeline {
|
|
||||||
agent {
|
|
||||||
dockerfile {
|
|
||||||
filename 'Dockerfile.build'
|
|
||||||
args '-v /var/run/docker.sock:/var/run/docker.sock'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stages {
|
|
||||||
stage('Install QEMU') {
|
|
||||||
steps {
|
|
||||||
sh 'docker run --rm --privileged multiarch/qemu-user-static --reset -p yes'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Build') {
|
|
||||||
steps {
|
|
||||||
sh 'DOCKER_BUILD_OPTIONS="--no-cache" ./scripts/build.sh'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Publish') {
|
|
||||||
steps {
|
|
||||||
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'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('Package') {
|
|
||||||
steps {
|
|
||||||
sh './scripts/package.sh'
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
success {
|
|
||||||
archiveArtifacts artifacts: 'out/**', fingerprint: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2021 TheBrokenRail
|
Copyright (c) 2024 TheBrokenRail
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
14
README.md
14
README.md
|
@ -5,17 +5,5 @@
|
||||||
# Minecraft: Pi Edition: Reborn
|
# Minecraft: Pi Edition: Reborn
|
||||||
Minecraft: Pi Edition Modding Project
|
Minecraft: Pi Edition Modding Project
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### Option A: Pi-Apps (Raspberry Pi Only)
|
|
||||||
[![Pi-Apps](https://github.com/Botspot/pi-apps/blob/master/icons/badge.png?raw=true)](https://github.com/Botspot/pi-apps)
|
|
||||||
|
|
||||||
### Option B: Manual Installation
|
|
||||||
[View Manual Installation](docs/INSTALL.md)
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
- [View Overriding Assets](docs/OVERRIDING_ASSETS.md)
|
[View Documentation](docs/README.md)
|
||||||
- [View Troubleshooting](docs/TROUBLESHOOTING.md)
|
|
||||||
- [View Dedicated Server](docs/DEDICATED_SERVER.md)
|
|
||||||
- [View Modding](docs/MODDING.md)
|
|
||||||
- [View Credits](docs/CREDITS.md)
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 37d4baec5874b39e10cafda2f9fcf6b63129c85a
|
|
@ -1,18 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
git clone --depth 1 https://git.code.sf.net/p/libpng/code libpng -b libpng12
|
|
||||||
|
|
||||||
cd libpng
|
|
||||||
|
|
||||||
./configure
|
|
||||||
|
|
||||||
make -j$(nproc)
|
|
||||||
|
|
||||||
mkdir -p ../minecraft-pi/lib
|
|
||||||
cp -L .libs/libpng12.so.0 ../minecraft-pi/lib
|
|
||||||
|
|
||||||
cd ../
|
|
||||||
|
|
||||||
rm -rf libpng
|
|
|
@ -1,25 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cd launcher
|
|
||||||
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
|
|
||||||
cmake ..
|
|
||||||
make -j$(nproc)
|
|
||||||
make install DESTDIR=../../minecraft-pi
|
|
||||||
|
|
||||||
cd ../../
|
|
||||||
|
|
||||||
cd mods
|
|
||||||
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
|
|
||||||
cmake ..
|
|
||||||
make -j$(nproc)
|
|
||||||
make install DESTDIR=../../minecraft-pi
|
|
||||||
|
|
||||||
cd ../../
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
URL="https://www.minecraft.net/content/dam/minecraft/edition-pi/minecraft-pi-0.1.1.tar.gz"
|
|
||||||
|
|
||||||
mkdir minecraft-pi
|
|
||||||
wget -O - "${URL}" | tar -xz --strip-components 1 -C minecraft-pi
|
|
|
@ -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")
|
|
@ -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)
|
|
@ -0,0 +1,21 @@
|
||||||
|
# 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()
|
|
@ -0,0 +1,79 @@
|
||||||
|
# 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()
|
||||||
|
|
||||||
|
# Server/Headless Builds
|
||||||
|
mcpi_option(SERVER_MODE "Server Mode" BOOL FALSE)
|
||||||
|
mcpi_option(HEADLESS_MODE "Headless Mode" BOOL "${MCPI_SERVER_MODE}")
|
||||||
|
|
||||||
|
# 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
|
||||||
|
if(NOT MCPI_HEADLESS_MODE)
|
||||||
|
set(DEFAULT_USE_MEDIA_LAYER_PROXY FALSE)
|
||||||
|
if(BUILD_NATIVE_COMPONENTS AND NOT IS_ARM_TARGETING)
|
||||||
|
set(DEFAULT_USE_MEDIA_LAYER_PROXY TRUE)
|
||||||
|
endif()
|
||||||
|
mcpi_option(USE_MEDIA_LAYER_PROXY "Whether To Enable The Media Layer Proxy" BOOL "${DEFAULT_USE_MEDIA_LAYER_PROXY}")
|
||||||
|
mcpi_option(USE_GLES1_COMPATIBILITY_LAYER "Whether To Enable The GLESv1_CM Compatibility Layer" BOOL TRUE)
|
||||||
|
else()
|
||||||
|
set(MCPI_USE_MEDIA_LAYER_PROXY FALSE)
|
||||||
|
endif()
|
||||||
|
if(MCPI_USE_MEDIA_LAYER_PROXY)
|
||||||
|
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")
|
||||||
|
if(MCPI_SERVER_MODE)
|
||||||
|
string(APPEND MCPI_VARIANT_NAME "-server")
|
||||||
|
else()
|
||||||
|
string(APPEND MCPI_VARIANT_NAME "-client")
|
||||||
|
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()
|
||||||
|
mcpi_option(APP_ID "App ID" STRING "${DEFAULT_APP_ID}")
|
||||||
|
|
||||||
|
# App Title
|
||||||
|
mcpi_option(APP_BASE_TITLE "Base App Title" STRING "Minecraft: Pi Edition: Reborn")
|
||||||
|
set(DEFAULT_APP_TITLE "${MCPI_APP_BASE_TITLE}")
|
||||||
|
if(MCPI_SERVER_MODE)
|
||||||
|
string(APPEND DEFAULT_APP_TITLE " (Server)")
|
||||||
|
else()
|
||||||
|
string(APPEND DEFAULT_APP_TITLE " (Client)")
|
||||||
|
endif()
|
||||||
|
mcpi_option(APP_TITLE "App Title" STRING "${DEFAULT_APP_TITLE}")
|
||||||
|
|
||||||
|
# Skin Server
|
||||||
|
mcpi_option(SKIN_SERVER "Skin Server" STRING "https://raw.githubusercontent.com/MCPI-Revival/Skins/data")
|
||||||
|
|
||||||
|
# QEMU
|
||||||
|
if(BUILD_NATIVE_COMPONENTS)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
check_symbol_exists("__ARM_ARCH" "" MCPI_IS_ARM32_OR_ARM64_TARGETING)
|
||||||
|
set(MCPI_USE_QEMU TRUE)
|
||||||
|
if(MCPI_IS_ARM32_OR_ARM64_TARGETING)
|
||||||
|
set(MCPI_USE_QEMU FALSE)
|
||||||
|
endif()
|
||||||
|
endif()
|
|
@ -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()
|
|
@ -0,0 +1,70 @@
|
||||||
|
# Pick Archive
|
||||||
|
set(toolchain_version "13.2.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
|
||||||
|
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()
|
||||||
|
|
||||||
|
# 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()
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Compile For x86_64
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/base-toolchain.cmake")
|
||||||
|
# Use x86_64 Cross-Compiler
|
||||||
|
setup_toolchain("x86_64-linux-gnu")
|
||||||
|
# Details
|
||||||
|
set(CMAKE_SYSTEM_NAME "Linux")
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Compile For ARM64
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/base-toolchain.cmake")
|
||||||
|
# Use ARM64 Cross-Compiler
|
||||||
|
setup_toolchain("aarch64-linux-gnu")
|
||||||
|
# Details
|
||||||
|
set(CMAKE_SYSTEM_NAME "Linux")
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR "aarch64")
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Compile For ARM
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/base-toolchain.cmake")
|
||||||
|
# Use ARM Cross-Compiler
|
||||||
|
setup_toolchain("arm-linux-gnueabihf")
|
||||||
|
# Details
|
||||||
|
set(CMAKE_SYSTEM_NAME "Linux")
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR "arm")
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Setup Toolchain
|
||||||
|
macro(setup_toolchain target)
|
||||||
|
# Target Variants
|
||||||
|
set(target_variants "${target}")
|
||||||
|
macro(add_target_variant value)
|
||||||
|
string(REPLACE "-linux" "-${value}-linux" target_variant "${target}")
|
||||||
|
list(APPEND target_variants "${target_variant}")
|
||||||
|
endmacro()
|
||||||
|
add_target_variant(unknown)
|
||||||
|
add_target_variant(none)
|
||||||
|
add_target_variant(pc)
|
||||||
|
|
||||||
|
# Find Compiler
|
||||||
|
macro(find_compiler output name)
|
||||||
|
set(possible_names "")
|
||||||
|
foreach(possible_target IN LISTS target_variants)
|
||||||
|
list(APPEND possible_names "${possible_target}-${name}")
|
||||||
|
endforeach()
|
||||||
|
find_program(
|
||||||
|
"${output}"
|
||||||
|
NAMES ${possible_names}
|
||||||
|
NO_CACHE
|
||||||
|
)
|
||||||
|
if("${${output}}" STREQUAL "${output}-NOTFOUND")
|
||||||
|
message(FATAL_ERROR "Unable To Find ${name}")
|
||||||
|
endif()
|
||||||
|
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
|
||||||
|
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()
|
|
@ -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")
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Symlink Function
|
||||||
|
function(install_symlink target link)
|
||||||
|
get_filename_component(parent "${link}" DIRECTORY)
|
||||||
|
if(parent STREQUAL "")
|
||||||
|
set(parent ".")
|
||||||
|
endif()
|
||||||
|
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/symlink/${parent}")
|
||||||
|
file(CREATE_LINK "${target}" "${CMAKE_BINARY_DIR}/symlink/${link}" SYMBOLIC)
|
||||||
|
install(FILES "${CMAKE_BINARY_DIR}/symlink/${link}" DESTINATION "${parent}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Embed Resources
|
||||||
|
set(util_list_dir "${CMAKE_CURRENT_LIST_DIR}")
|
||||||
|
function(embed_resource target file)
|
||||||
|
# Get C Name
|
||||||
|
get_filename_component(name "${file}" NAME)
|
||||||
|
string(MAKE_C_IDENTIFIER "${name}" name)
|
||||||
|
# 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")
|
||||||
|
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()
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
docker load < /usr/share/minecraft-pi/client/image.tar.gz
|
|
||||||
rm /usr/share/minecraft-pi/client/image.tar.gz
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
docker image rm -f thebrokenrail/minecraft-pi-reborn:client
|
|
|
@ -1,56 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Esnure User Is In docker Group
|
|
||||||
if ! id -nGz | grep -qzxF 'docker'; then
|
|
||||||
pkexec /usr/sbin/usermod -aG docker "$(id -un)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# All Feature Flags
|
|
||||||
export AVAILABLE_FEATURES="$(tr '\n' ' ' < /usr/share/minecraft-pi/client/features)"
|
|
||||||
|
|
||||||
# Print Feature Flags Option
|
|
||||||
if [ "$1" = "--print-features" ]; then
|
|
||||||
echo "${AVAILABLE_FEATURES}"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Export Important Variables
|
|
||||||
export ZENITY_CLASS='Minecraft - Pi edition'
|
|
||||||
export DOCKER_COMPOSE_YML="/usr/share/minecraft-pi/client/docker-compose.yml"
|
|
||||||
|
|
||||||
# Ensure Features Are Selected
|
|
||||||
if [ -z "${MCPI_FEATURES+x}" ]; then
|
|
||||||
MCPI_FEATURES="$(eval "zenity --class \"${ZENITY_CLASS}\" --list --checklist --width 400 --height 400 --column 'Enabled' --column 'Feature' ${AVAILABLE_FEATURES}")"
|
|
||||||
fi
|
|
||||||
if [ -z "${MCPI_RENDER_DISTANCE+x}" ]; then
|
|
||||||
MCPI_RENDER_DISTANCE="$(zenity --class "${ZENITY_CLASS}" --list --radiolist --width 400 --height 400 --text 'Minecraft Render Distance:' --column 'Selected' --column 'Name' FALSE 'Far' FALSE 'Normal' TRUE 'Short' FALSE 'Tiny')"
|
|
||||||
fi
|
|
||||||
if [ -z "${MCPI_USERNAME+x}" ]; then
|
|
||||||
MCPI_USERNAME="$(zenity --class "${ZENITY_CLASS}" --entry --text 'Minecraft Username:' --entry-text 'StevePi')"
|
|
||||||
fi
|
|
||||||
export MCPI_FEATURES
|
|
||||||
export MCPI_RENDER_DISTANCE
|
|
||||||
export MCPI_USERNAME
|
|
||||||
|
|
||||||
# Prepare Environment
|
|
||||||
export USER_HOME="${HOME}"
|
|
||||||
export USER_UID="$(id -u)"
|
|
||||||
export USER_GID="$(id -g)"
|
|
||||||
get_gid() {
|
|
||||||
echo "$(getent group "$1" | cut -d : -f 3)"
|
|
||||||
}
|
|
||||||
export USER_OTHER_GIDS="$(get_gid video) $(get_gid render)"
|
|
||||||
|
|
||||||
# Run
|
|
||||||
set +e
|
|
||||||
sg docker /usr/lib/minecraft-pi/pre-launch.sh
|
|
||||||
RET=$?
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Handle Crash
|
|
||||||
if [ ${RET} -ne 0 ]; then
|
|
||||||
zenity --class "${ZENITY_CLASS}" --error --no-wrap --text 'Minecraft: Pi Edition has crashed!\n\nExit Code: '${RET}'\n\n<a href="file:///tmp/minecraft-pi">Open Log Folder</a>\n<a href="https://gitea.thebrokenrail.com/TheBrokenRail/minecraft-pi-reborn/src/branch/master/docs/TROUBLESHOOTING.md">Open Troubleshooting Guide</a>'
|
|
||||||
exit ${RET}
|
|
||||||
fi
|
|
|
@ -1,27 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Prepare Data Folder
|
|
||||||
mkdir -p "${USER_HOME}/.minecraft-pi"
|
|
||||||
|
|
||||||
# Create Log Folder
|
|
||||||
rm -rf /tmp/minecraft-pi
|
|
||||||
mkdir -p /tmp/minecraft-pi
|
|
||||||
|
|
||||||
# Start Logging
|
|
||||||
touch /tmp/minecraft-pi/main.log
|
|
||||||
tail -f /tmp/minecraft-pi/main.log &
|
|
||||||
TAIL_PID=$!
|
|
||||||
|
|
||||||
# Run
|
|
||||||
set +e
|
|
||||||
/usr/lib/minecraft-pi/run.sh > /tmp/minecraft-pi/main.log 2>&1
|
|
||||||
RET=$?
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Kill Logging
|
|
||||||
kill ${TAIL_PID} > /dev/null 2>&1 || :
|
|
||||||
|
|
||||||
# Exit
|
|
||||||
exit ${RET}
|
|
|
@ -1,10 +0,0 @@
|
||||||
[Desktop Entry]
|
|
||||||
Name=Minecraft: Pi Edition
|
|
||||||
Comment=Fun with Blocks
|
|
||||||
Icon=/usr/share/pixmaps/minecraft-pi.png
|
|
||||||
StartupNotify=false
|
|
||||||
StartupWMClass=Minecraft - Pi edition
|
|
||||||
Exec=/usr/bin/minecraft-pi
|
|
||||||
Terminal=false
|
|
||||||
Type=Application
|
|
||||||
Categories=Application;Game;
|
|
|
@ -1,16 +0,0 @@
|
||||||
TRUE 'Touch GUI'
|
|
||||||
TRUE 'Fix Bow & Arrow'
|
|
||||||
TRUE 'Fix Attacking'
|
|
||||||
TRUE 'Mob Spawning'
|
|
||||||
TRUE 'Fancy Graphics'
|
|
||||||
TRUE 'Disable Autojump By Default'
|
|
||||||
TRUE 'Display Nametags By Default'
|
|
||||||
TRUE 'Fix Sign Placement'
|
|
||||||
TRUE 'Show Block Outlines'
|
|
||||||
FALSE 'Expand Creative Inventory'
|
|
||||||
FALSE 'Peaceful Mode'
|
|
||||||
TRUE 'Animated Water'
|
|
||||||
TRUE 'Remove Invalid Item Background'
|
|
||||||
TRUE 'Disable gui_blocks Atlas'
|
|
||||||
TRUE 'Smooth Lighting'
|
|
||||||
FALSE '3D Anaglyph'
|
|
Binary file not shown.
Before Width: | Height: | Size: 100 KiB |
|
@ -1,9 +0,0 @@
|
||||||
Package: minecraft-pi-reborn-native
|
|
||||||
Version: ${VERSION}
|
|
||||||
Maintainer: TheBrokenRail <connor24nolan@live.com>
|
|
||||||
Description: Fun with Blocks
|
|
||||||
Homepage: https://www.minecraft.net/en-us/edition/pi
|
|
||||||
Architecture: all
|
|
||||||
Depends: ${DEPENDENCIES}
|
|
||||||
Recommends: ${RECOMMENDED_DEPENDENCIES}
|
|
||||||
Conflicts: minecraft-pi, minecraft-pi-reborn-virgl
|
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Launch Minecraft
|
|
||||||
exec docker-compose -f "${DOCKER_COMPOSE_YML}" run --rm minecraft-pi
|
|
|
@ -1,20 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
minecraft-pi:
|
|
||||||
image: 'thebrokenrail/minecraft-pi-reborn:client'
|
|
||||||
network_mode: 'host'
|
|
||||||
volumes:
|
|
||||||
- /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static
|
|
||||||
- '/tmp/.X11-unix:/tmp/.X11-unix'
|
|
||||||
- '${USER_HOME}/.minecraft-pi:/home/.minecraft-pi'
|
|
||||||
devices:
|
|
||||||
- '/dev/dri:/dev/dri'
|
|
||||||
environment:
|
|
||||||
- 'DISPLAY=unix${DISPLAY}'
|
|
||||||
- 'MCPI_FEATURES=${MCPI_FEATURES}'
|
|
||||||
- 'MCPI_RENDER_DISTANCE=${MCPI_RENDER_DISTANCE}'
|
|
||||||
- 'MCPI_USERNAME=${MCPI_USERNAME}'
|
|
||||||
- 'MCPI_MODE=native'
|
|
||||||
- 'USER_UID=${USER_UID}'
|
|
||||||
- 'USER_GID=${USER_GID}'
|
|
||||||
- 'USER_OTHER_GIDS=${USER_OTHER_GIDS}'
|
|
|
@ -1,9 +0,0 @@
|
||||||
Package: minecraft-pi-reborn-virgl
|
|
||||||
Version: ${VERSION}
|
|
||||||
Maintainer: TheBrokenRail <connor24nolan@live.com>
|
|
||||||
Description: Fun with Blocks
|
|
||||||
Homepage: https://www.minecraft.net/en-us/edition/pi
|
|
||||||
Architecture: all
|
|
||||||
Depends: ${DEPENDENCIES}, virgl-server
|
|
||||||
Recommends: ${RECOMMENDED_DEPENDENCIES}
|
|
||||||
Conflicts: minecraft-pi, minecraft-pi-reborn-native
|
|
|
@ -1,19 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Start VirGL
|
|
||||||
virgl_test_server > /tmp/minecraft-pi/virgl.log 2>&1 &
|
|
||||||
VIRGL_PID=$!
|
|
||||||
|
|
||||||
# Launch Minecraft
|
|
||||||
set +e
|
|
||||||
docker-compose -f "${DOCKER_COMPOSE_YML}" run --rm minecraft-pi
|
|
||||||
RET=$?
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Kill VirGL
|
|
||||||
kill ${VIRGL_PID} > /dev/null 2>&1 || :
|
|
||||||
|
|
||||||
# Exit
|
|
||||||
exit ${RET}
|
|
|
@ -1,19 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
minecraft-pi:
|
|
||||||
image: 'thebrokenrail/minecraft-pi-reborn:client'
|
|
||||||
network_mode: 'host'
|
|
||||||
volumes:
|
|
||||||
- /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static
|
|
||||||
- '/tmp/.X11-unix:/tmp/.X11-unix'
|
|
||||||
- '/tmp/.virgl_test:/tmp/.virgl_test'
|
|
||||||
- '${USER_HOME}/.minecraft-pi:/home/.minecraft-pi'
|
|
||||||
environment:
|
|
||||||
- 'DISPLAY=unix${DISPLAY}'
|
|
||||||
- 'MCPI_FEATURES=${MCPI_FEATURES}'
|
|
||||||
- 'MCPI_RENDER_DISTANCE=${MCPI_RENDER_DISTANCE}'
|
|
||||||
- 'MCPI_USERNAME=${MCPI_USERNAME}'
|
|
||||||
- 'MCPI_MODE=virgl'
|
|
||||||
- 'USER_UID=${USER_UID}'
|
|
||||||
- 'USER_GID=${USER_GID}'
|
|
||||||
- 'USER_OTHER_GIDS=${USER_OTHER_GIDS}'
|
|
|
@ -1,8 +0,0 @@
|
||||||
Package: minecraft-pi-reborn-server
|
|
||||||
Version: ${VERSION}
|
|
||||||
Maintainer: TheBrokenRail <connor24nolan@live.com>
|
|
||||||
Description: Fun with Blocks
|
|
||||||
Homepage: https://www.minecraft.net/en-us/edition/pi
|
|
||||||
Architecture: all
|
|
||||||
Depends: ${DEPENDENCIES}
|
|
||||||
Recommends: ${RECOMMENDED_DEPENDENCIES}
|
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
docker load < /usr/share/minecraft-pi/server/image.tar.gz
|
|
||||||
rm /usr/share/minecraft-pi/server/image.tar.gz
|
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Prepare Environment
|
|
||||||
export MCPI_ROOT="${PWD}"
|
|
||||||
export USER_UID="$(id -u)"
|
|
||||||
export USER_GID="$(id -g)"
|
|
||||||
|
|
||||||
# Launch Minecraft
|
|
||||||
DOCKER_COMPOSE_YML='/usr/share/minecraft-pi/server/docker-compose.yml'
|
|
||||||
docker-compose -f "${DOCKER_COMPOSE_YML}" run --rm minecraft-pi-server
|
|
|
@ -1,13 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
minecraft-pi-server:
|
|
||||||
image: 'thebrokenrail/minecraft-pi-reborn:server'
|
|
||||||
network_mode: 'host'
|
|
||||||
stdin_open: true
|
|
||||||
tty: true
|
|
||||||
volumes:
|
|
||||||
- /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static
|
|
||||||
- '${MCPI_ROOT}:/home/.minecraft-pi'
|
|
||||||
environment:
|
|
||||||
- 'USER_UID=${USER_UID}'
|
|
||||||
- 'USER_GID=${USER_GID}'
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
project(dependencies)
|
||||||
|
|
||||||
|
# stb_image
|
||||||
|
if(BUILD_ARM_COMPONENTS AND NOT MCPI_HEADLESS_MODE)
|
||||||
|
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)
|
||||||
|
add_subdirectory(zenity)
|
||||||
|
endif()
|
||||||
|
# LIEF
|
||||||
|
if(BUILD_NATIVE_COMPONENTS OR (BUILD_MEDIA_LAYER_CORE AND NOT MCPI_HEADLESS_MODE))
|
||||||
|
add_subdirectory(LIEF)
|
||||||
|
endif()
|
||||||
|
# QEMU
|
||||||
|
if(BUILD_NATIVE_COMPONENTS AND MCPI_USE_QEMU)
|
||||||
|
add_subdirectory(qemu)
|
||||||
|
endif()
|
||||||
|
# GLFW
|
||||||
|
if(BUILD_MEDIA_LAYER_CORE AND NOT MCPI_HEADLESS_MODE)
|
||||||
|
add_subdirectory(glfw)
|
||||||
|
endif()
|
||||||
|
# GLES Compatibility Layer
|
||||||
|
if(BUILD_MEDIA_LAYER_CORE AND NOT MCPI_HEADLESS_MODE AND MCPI_USE_GLES1_COMPATIBILITY_LAYER)
|
||||||
|
add_subdirectory(gles-compatibility-layer)
|
||||||
|
endif()
|
||||||
|
# UTF8-CPP
|
||||||
|
add_subdirectory(utf8cpp)
|
||||||
|
# Symbol Prcoessor
|
||||||
|
if(BUILD_ARM_COMPONENTS)
|
||||||
|
add_subdirectory(symbol-processor)
|
||||||
|
endif()
|
|
@ -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")
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 16962f2f36a51b2acefad9cec3622f6de5730aa3
|
|
@ -0,0 +1,7 @@
|
||||||
|
project(gles-compatibility-layer)
|
||||||
|
|
||||||
|
# GLES Compatibility Layer
|
||||||
|
set(GLES_COMPATIBILITY_LAYER_USE_ES3 FALSE CACHE BOOL "" FORCE)
|
||||||
|
set(GLES_COMPATIBILITY_LAYER_USE_SDL FALSE CACHE BOOL "" FORCE)
|
||||||
|
set(GLES_COMPATIBILITY_LAYER_DEPENDENCY glfw CACHE STRING "" FORCE)
|
||||||
|
add_subdirectory(src)
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 67a8d026aa5aef062dae654d418c3cd09417c0c1
|
|
@ -0,0 +1,27 @@
|
||||||
|
project(glfw)
|
||||||
|
|
||||||
|
# Silence Warnings
|
||||||
|
add_compile_options(-w)
|
||||||
|
|
||||||
|
## GLFW
|
||||||
|
|
||||||
|
# Download
|
||||||
|
set(BUILD_SHARED_LIBS TRUE CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_EXAMPLES FALSE CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_TESTS FALSE CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_DOCS FALSE CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_INSTALL FALSE CACHE BOOL "" FORCE)
|
||||||
|
set(GLFW_BUILD_WIN32 FALSE CACHE BOOL "" FORCE)
|
||||||
|
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)
|
||||||
|
unset(MESSAGE_QUIET)
|
||||||
|
|
||||||
|
# Install
|
||||||
|
install(TARGETS glfw DESTINATION "${MCPI_LIB_DIR}")
|
||||||
|
|
||||||
|
# License
|
||||||
|
install(FILES src/LICENSE.md DESTINATION "${MCPI_LEGAL_DIR}/glfw")
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 7b6aead9fb88b3623e3b3725ebb42670cbe4c579
|
|
@ -0,0 +1,29 @@
|
||||||
|
project(minecraft-pi)
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
## Minecraft: Pi Edition
|
||||||
|
|
||||||
|
# Download
|
||||||
|
FetchContent_Declare(
|
||||||
|
minecraft-pi
|
||||||
|
URL "${CMAKE_CURRENT_SOURCE_DIR}/minecraft-pi-0.1.1.tar.gz"
|
||||||
|
)
|
||||||
|
FetchContent_Populate(minecraft-pi)
|
||||||
|
|
||||||
|
# Install
|
||||||
|
install(
|
||||||
|
DIRECTORY "${minecraft-pi_SOURCE_DIR}/"
|
||||||
|
DESTINATION "${MCPI_INSTALL_DIR}/game"
|
||||||
|
USE_SOURCE_PERMISSIONS
|
||||||
|
REGEX "api" EXCLUDE
|
||||||
|
REGEX "data" EXCLUDE
|
||||||
|
)
|
||||||
|
if(NOT MCPI_HEADLESS_MODE)
|
||||||
|
install(
|
||||||
|
DIRECTORY "${minecraft-pi_SOURCE_DIR}/data/"
|
||||||
|
DESTINATION "${MCPI_INSTALL_DIR}/game/data"
|
||||||
|
USE_SOURCE_PERMISSIONS
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
install_symlink("game/minecraft-pi" "${MCPI_INSTALL_DIR}/minecraft-pi")
|
Binary file not shown.
|
@ -0,0 +1,50 @@
|
||||||
|
project(qemu)
|
||||||
|
|
||||||
|
## QEMU
|
||||||
|
|
||||||
|
# Version
|
||||||
|
set(QEMU_VERSION "8.2.1")
|
||||||
|
|
||||||
|
# Flatpak Support
|
||||||
|
set(QEMU_PATCH "")
|
||||||
|
if(MCPI_IS_FLATPAK_BUILD)
|
||||||
|
set(QEMU_PATCH "sed" "-i" "s/libdrm/libdrm-dis/g" "<SOURCE_DIR>/meson.build")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Build
|
||||||
|
include(ExternalProject)
|
||||||
|
set(PKGCONFIG_ENV "")
|
||||||
|
if(DEFINED ENV{PKG_CONFIG_LIBDIR})
|
||||||
|
set(PKGCONFIG_ENV "PKG_CONFIG_LIBDIR=$ENV{PKG_CONFIG_LIBDIR}")
|
||||||
|
endif()
|
||||||
|
ExternalProject_Add(qemu
|
||||||
|
URL "${CMAKE_CURRENT_SOURCE_DIR}/../../archives/qemu-${QEMU_VERSION}.tar.xz"
|
||||||
|
CONFIGURE_COMMAND
|
||||||
|
"${CMAKE_COMMAND}" "-E" "env"
|
||||||
|
${PKGCONFIG_ENV}
|
||||||
|
"CFLAGS=-s"
|
||||||
|
"CXXFLAGS=-s"
|
||||||
|
"<SOURCE_DIR>/configure"
|
||||||
|
"--prefix=${CMAKE_INSTALL_PREFIX}"
|
||||||
|
"--cross-prefix="
|
||||||
|
"--cc=${CMAKE_C_COMPILER}"
|
||||||
|
"--cxx=${CMAKE_CXX_COMPILER}"
|
||||||
|
"--disable-debug-info"
|
||||||
|
"--target-list=arm-linux-user"
|
||||||
|
"--without-default-features"
|
||||||
|
USES_TERMINAL_CONFIGURE TRUE
|
||||||
|
BUILD_COMMAND ninja "qemu-arm"
|
||||||
|
USES_TERMINAL_BUILD TRUE
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
PATCH_COMMAND ${QEMU_PATCH}
|
||||||
|
BUILD_BYPRODUCTS "<BINARY_DIR>/qemu-arm"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Install
|
||||||
|
ExternalProject_Get_property(qemu BINARY_DIR)
|
||||||
|
install(PROGRAMS "${BINARY_DIR}/qemu-arm" DESTINATION "${MCPI_BIN_DIR}")
|
||||||
|
|
||||||
|
# License
|
||||||
|
ExternalProject_Get_property(qemu SOURCE_DIR)
|
||||||
|
install(FILES "${SOURCE_DIR}/COPYING" DESTINATION "${MCPI_LEGAL_DIR}/qemu")
|
|
@ -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")
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit beebb24b945efdea3b9bba23affb8eb3ba8982e7
|
|
@ -0,0 +1,5 @@
|
||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
|
|
||||||
|
#include "stb_image.h"
|
||||||
|
#include "stb_image_write.h"
|
|
@ -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()
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 9697b35de4d783282afdd3a4c643951ce49a0158
|
|
@ -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")
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit f6780f77f6824aa0fbe69f9b97ef7d8aba26ed92
|
|
@ -0,0 +1,20 @@
|
||||||
|
project(zenity)
|
||||||
|
|
||||||
|
# Silence Warnings
|
||||||
|
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)
|
||||||
|
|
||||||
|
# Install
|
||||||
|
install(TARGETS zenity DESTINATION "${MCPI_BIN_DIR}")
|
||||||
|
|
||||||
|
# License
|
||||||
|
install(FILES src/COPYING DESTINATION "${MCPI_LEGAL_DIR}/zenity")
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit a7496461161c917878d58131711425e7c8e59436
|
|
@ -0,0 +1,106 @@
|
||||||
|
# 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.
|
||||||
|
1. If the corresponding environmental variable for a setting is specified, it will be used instead of the dialog.
|
||||||
|
2. If a setting is cached, then the dialog's default value will be the cached value instead of the normal default.
|
||||||
|
3. When configuration has been completed, the settings specified will be cached.
|
||||||
|
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, then 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_LIBRARY_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 (but is possible).
|
||||||
|
|
||||||
|
#### 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 patches MCPI to modify its behavior. It's loaded using `LD_PRELOAD`.
|
||||||
|
|
||||||
|
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)
|
||||||
|
* OpenGL ES 2.0
|
||||||
|
* 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)
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Building
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
### Debian/Ubuntu
|
||||||
|
```sh
|
||||||
|
./scripts/install-dependencies.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
```sh
|
||||||
|
./scripts/build.mjs <none|appimage|flatpak> <client|server> <armhf|arm64|amd64|host> [--clean] [--install] [-Dvar=value...]
|
||||||
|
```
|
|
@ -0,0 +1,341 @@
|
||||||
|
# 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
|
||||||
|
* Add `Animated Lava` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Animated Fire` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Use Java Beta 1.3 Light Ramp` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Send Full Level When Hosting Game` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Food Overlay` Feature Flag (Disabled By Default)
|
||||||
|
* Add `Display Date In Select World Screen` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Optimized Chunk Sorting` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Add Cake` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Add Reborn Info To Options` Feature Flag (Enabled By Default)
|
||||||
|
* Add `Track FPS` Feature Flag (Disabled By Default)
|
||||||
|
* 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)
|
||||||
|
* Add Milk Buckets
|
||||||
|
* Implement Crafting Remainders
|
||||||
|
* 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
|
||||||
|
* Add Splash Text To Start Screen
|
||||||
|
* `overwrite_calls` Now Scans VTables
|
||||||
|
|
||||||
|
**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
|
||||||
|
|
||||||
|
**2.4.2**
|
||||||
|
* Fix Picking Up Lava
|
||||||
|
* Fix Wayland App ID
|
||||||
|
|
||||||
|
**2.4.1**
|
||||||
|
* Allow More Characters In Usernames And Chat
|
||||||
|
* Fix Running On ARMHF Debian Buster
|
||||||
|
|
||||||
|
**2.4.0**
|
||||||
|
* [Modding SDK](../example-mods/README.md)
|
||||||
|
* Cache Blacklist/Whitelist
|
||||||
|
* 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)
|
||||||
|
* Fix Sound Pitch/Volume/Attenuation
|
||||||
|
* Fix Holding Left-Click When Attacking
|
||||||
|
* Don't Force EGL (Should Fix Some NVIDIA Systems)
|
||||||
|
* Performance Fixes
|
||||||
|
|
||||||
|
**2.3.13**
|
||||||
|
* Fix Texture Bug
|
||||||
|
|
||||||
|
**2.3.12**
|
||||||
|
* Media Layer Proxy Optimizations
|
||||||
|
* Bug Fixes
|
||||||
|
|
||||||
|
**2.3.11**
|
||||||
|
* `--version` Command Line Option
|
||||||
|
* TPS Measured In Benchmark & Server
|
||||||
|
* Front-Facing Third-Person
|
||||||
|
* GLESv1 Comparability Layer
|
||||||
|
* Miscellaneous Bug Fixes
|
||||||
|
|
||||||
|
**2.3.10**
|
||||||
|
* Add Crash Report Dialog
|
||||||
|
* Disable V-Sync By Default
|
||||||
|
* Refactor Child Process Management
|
||||||
|
* Improve Build System
|
||||||
|
* Support For Building On Ubuntu 22.04
|
||||||
|
|
||||||
|
**2.3.9**
|
||||||
|
* Bundle An ARM Sysroot
|
||||||
|
* Not Used On ARM32 Systems
|
||||||
|
* Based On Debian Bullseye
|
||||||
|
* Colored Log Output
|
||||||
|
|
||||||
|
**2.3.8**
|
||||||
|
* Switch Up Mod Loading Order
|
||||||
|
|
||||||
|
**2.3.7**
|
||||||
|
* Don't Append Hyphens To New World Name, Only Folder Names
|
||||||
|
|
||||||
|
**2.3.6**
|
||||||
|
* 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)
|
||||||
|
* Custom World Names
|
||||||
|
* Game-Mode Selection
|
||||||
|
* Custom Seeds
|
||||||
|
|
||||||
|
**2.3.5**
|
||||||
|
* Renamed Some Feature Flags
|
||||||
|
* 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)
|
||||||
|
|
||||||
|
**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)
|
||||||
|
* Enables Server Visibility Toggle Button
|
||||||
|
* Options Changes (Not Supported On Legacy)
|
||||||
|
* 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`
|
||||||
|
|
||||||
|
**2.3.3**
|
||||||
|
* Add More Blocks To Expanded Creative Inventory
|
||||||
|
* Add AppStream Metadata
|
||||||
|
|
||||||
|
**2.3.2**
|
||||||
|
* Simplify Launch Sequence
|
||||||
|
* 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)
|
||||||
|
|
||||||
|
**2.3.1**
|
||||||
|
* 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)
|
||||||
|
|
||||||
|
**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
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
**2.2.10**
|
||||||
|
* Fix Bug With Picking Up Items In "Remove Creative Mode Restrictions" Mode
|
||||||
|
|
||||||
|
**2.2.9**
|
||||||
|
* Fix String Sanitization
|
||||||
|
* Store Files In `/usr/lib`
|
||||||
|
|
||||||
|
**2.2.8**
|
||||||
|
* 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
|
||||||
|
* Simple Benchmark Mode
|
||||||
|
* Fix Typo When Audio Source File Doesn't Exist
|
||||||
|
* Improve Build System
|
||||||
|
|
||||||
|
**2.2.7**
|
||||||
|
* Fix Crash When OpenAL Is Unavailable
|
||||||
|
* Fix Command Input In Server
|
||||||
|
|
||||||
|
**2.2.5**
|
||||||
|
* Fix Bug In Texture Scaling Code
|
||||||
|
|
||||||
|
**2.2.5**
|
||||||
|
* Scale Animated Textures
|
||||||
|
* Add More Blocks To Expanded Creative Inventory
|
||||||
|
* Reduce Unnecessary Logging
|
||||||
|
* Log IPs In Server Mode
|
||||||
|
|
||||||
|
**2.2.4**
|
||||||
|
* Instead Of Crashing, Disable Polling Block Hits In Survival Mode Using The API
|
||||||
|
|
||||||
|
**2.2.3**
|
||||||
|
* Fix Crash When Taking Odd-Sized Screenshots
|
||||||
|
|
||||||
|
**2.2.2**
|
||||||
|
* Add More Missing Sound Events
|
||||||
|
* Make Missing Sound Event Cause Warning Rather Than Crash
|
||||||
|
|
||||||
|
**2.2.1**
|
||||||
|
* 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
|
||||||
|
* Separate Headless Code From Server Code
|
||||||
|
* Fix Bug Where `RakNetInstance` Starts Pinging Potential Servers Before The "Join Game" Screen Is Opened
|
||||||
|
* Clean-Up Code
|
||||||
|
* Remove Support For Debian Buster
|
||||||
|
|
||||||
|
**2.1.8**
|
||||||
|
* Fix Crash On ARM Systems
|
||||||
|
|
||||||
|
**2.1.7**
|
||||||
|
* Fix On 64-Bit ARM Systems
|
||||||
|
|
||||||
|
**2.1.6**
|
||||||
|
* Optimize Media Layer Proxy
|
||||||
|
|
||||||
|
**2.1.5**
|
||||||
|
* Print Error Message If RakNet Fails To Start
|
||||||
|
|
||||||
|
**2.1.4**
|
||||||
|
* Fix `RakNet::RakString` Security Bug
|
||||||
|
|
||||||
|
**2.1.3**
|
||||||
|
* Workaround Broken Library Search Path On Some ARM 32-Bit Systems
|
||||||
|
|
||||||
|
**2.1.2**
|
||||||
|
* Fix Library Loading On ARM 32-Bit Systems
|
||||||
|
|
||||||
|
**2.1.1**
|
||||||
|
* Fix Symlink Code
|
||||||
|
|
||||||
|
**2.1.0**
|
||||||
|
* 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
|
||||||
|
|
||||||
|
**2.0.9**
|
||||||
|
* 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
|
||||||
|
|
||||||
|
**2.0.7**
|
||||||
|
* Fix Sign Text Not Updating In Multiplayer When Exiting Editing UI Using Escape Button
|
||||||
|
* Fix Item Dropping Not Working
|
||||||
|
|
||||||
|
**2.0.6**
|
||||||
|
* Fix Toolbar Size In Normal GUI
|
||||||
|
|
||||||
|
**2.0.5**
|
||||||
|
* Show Reborn Version In Start Screen
|
||||||
|
* External Server Support
|
||||||
|
|
||||||
|
**2.0.4**
|
||||||
|
* Optimize Media Layer Proxy
|
||||||
|
|
||||||
|
**2.0.3**
|
||||||
|
* Make `kill` Admin Command Print Death Message
|
||||||
|
|
||||||
|
**2.0.2**
|
||||||
|
* Fix Mouse Cursor Bugs
|
||||||
|
|
||||||
|
**2.0.1**
|
||||||
|
* Fix Blank Screen On Twister OS
|
||||||
|
|
||||||
|
**2.0.0**
|
||||||
|
* Major Rewrite
|
|
@ -0,0 +1,64 @@
|
||||||
|
# Command Line Usage
|
||||||
|
|
||||||
|
## Command Line Arguments
|
||||||
|
|
||||||
|
### `--version` (Or `-v`)
|
||||||
|
If you run MCPI-Reborn with `--version` it will print its version to `stdout`.
|
||||||
|
|
||||||
|
### `--debug`
|
||||||
|
This sets `MCPI_DEBUG`.
|
||||||
|
|
||||||
|
### `--copy-sdk`
|
||||||
|
This extracts the modding SDK and immediately exits. (This allows the SDK to be extracted without starting the game.)
|
||||||
|
|
||||||
|
### Client Mode Only
|
||||||
|
|
||||||
|
#### `--print-available-feature-flags`
|
||||||
|
This print the available feature flags (and their default values) 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`
|
||||||
|
This will skip the startup configuration dialogs and just use the default values. This will use the cached configuration unless `--no-cache` is used.
|
||||||
|
|
||||||
|
#### `--benchmark`
|
||||||
|
This will make MCPI-Reborn 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.
|
||||||
|
|
||||||
|
#### `--no-cache`
|
||||||
|
This will skip loading and saving the cached launcher configuration.
|
||||||
|
|
||||||
|
#### `--wipe-cache`
|
||||||
|
This will wipe the cached launcher configuration.
|
||||||
|
|
||||||
|
### Server Mode Only
|
||||||
|
|
||||||
|
#### `--only-generate`
|
||||||
|
This will make MCPI-Reborn immediately exit once world generation has completed. This is mainly used for automatically testing MCPI-Reborn.
|
||||||
|
|
||||||
|
## Environmental Variables
|
||||||
|
|
||||||
|
### `MCPI_DEBUG`
|
||||||
|
This enables debug logging if it is set.
|
||||||
|
|
||||||
|
### `MCPI_API_PORT`
|
||||||
|
This configures the API to use a different port (the default is 4711).
|
||||||
|
|
||||||
|
### 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.
|
|
@ -0,0 +1,45 @@
|
||||||
|
# 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 |
|
||||||
|
|
||||||
|
## Game Controller
|
||||||
|
| Action | Function |
|
||||||
|
| --- | --- |
|
||||||
|
| A | Jump |
|
||||||
|
| Y | Open Inventory |
|
||||||
|
| B | Sneak[^1] |
|
||||||
|
| X | Open Crafting |
|
||||||
|
| D-Pad Up | Change Perspective |
|
||||||
|
| D-Pad Down | Drop Item |
|
||||||
|
| D-Pad Right | Open Chat |
|
||||||
|
| Left/Right Bumper | Cycle Selected Item In Toolbar |
|
||||||
|
| Left Trigger | Use Item/Place Block |
|
||||||
|
| Right Trigger | Attack/Destroy |
|
||||||
|
| Start/Back | Pause |
|
||||||
|
| Left Stick | Movement |
|
||||||
|
| Right Stick | Camera Control |
|
||||||
|
|
||||||
|
[^1]: Unlike Minecraft: Bedrock Edition, this *is not* a toggle.
|
|
@ -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.
|
|
@ -1,32 +1,14 @@
|
||||||
# Dedicated Server
|
# 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.
|
This server is also compatible with MCPE Alpha v0.6.1[^1].
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
To use, install and run the `minecraft-pi-reborn-server` AppImage. It will generate the world and `server.properties` in the current directory.
|
||||||
### Debian Package
|
|
||||||
To use, install the ``minecraft-pi-reborn-server`` package and run ``minecraft-pi-reborn-server`` or use. It will generate the world and ``server.properties`` in the current directory.
|
|
||||||
|
|
||||||
### Docker Compose
|
|
||||||
Make sure you have ``qemu-user-static`` installed and ``binfmt`` setup.
|
|
||||||
```yml
|
|
||||||
version: "3.7"
|
|
||||||
|
|
||||||
services:
|
|
||||||
minecraft-pi:
|
|
||||||
image: thebrokenrail/minecraft-pi-reborn:server
|
|
||||||
volumes:
|
|
||||||
- ./minecraft-pi/data:/home/.minecraft-pi
|
|
||||||
- /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static
|
|
||||||
restart: always
|
|
||||||
stdin_open: true
|
|
||||||
tty: true
|
|
||||||
ports:
|
|
||||||
- "19132:19132/udp"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Server Limitations
|
## Server Limitations
|
||||||
- Player data is not saved because of limitations with MCPE LAN worlds
|
* 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
|
* An easy workaround is to place your inventory in a chest before logging off
|
||||||
- Survival Mode servers are only compatible with ``minecraft-pi-reborn`` clients
|
* Survival Mode servers are incompatible with unmodded MCPI
|
||||||
|
|
||||||
|
[^1]: The exception to this is buckets, those will crash MCPE players.
|
||||||
|
|
|
@ -1,66 +1,30 @@
|
||||||
# Manual Installation
|
# Installation
|
||||||
|
|
||||||
## System Requirements
|
## AppImage
|
||||||
- At Least Debian/Raspbian Buster Or Ubuntu 20.04
|
Download packages [here](https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn/releases).
|
||||||
|
|
||||||
## Before You Install
|
### System Requirements
|
||||||
|
* Debian Bullseye/Ubuntu 20.04 Or Higher
|
||||||
|
* FUSE 2
|
||||||
|
* Debian/Ubuntu: `sudo apt install libfuse2`
|
||||||
|
* Arch: `sudo pacman -S fuse2`
|
||||||
|
* Client-Only Dependencies
|
||||||
|
* Graphics Drivers
|
||||||
|
* GTK+ 3
|
||||||
|
* Debian/Ubuntu: `sudo apt install libgtk-3-0`
|
||||||
|
* Arch: `sudo pacman -S gtk3`
|
||||||
|
* OpenAL
|
||||||
|
* Debian/Ubuntu: `sudo apt install libopenal1`
|
||||||
|
* Arch: `sudo pacman -S openal`
|
||||||
|
|
||||||
<details>
|
### Running
|
||||||
<summary>Debian/Raspbian Buster</summary>
|
Follow [these](https://docs.appimage.org/introduction/quickstart.html#how-to-run-an-appimage) instructions.
|
||||||
|
|
||||||
### ``libseccomp2``
|
## Flatpak
|
||||||
``minecraft-pi-reborn`` requires a newer version of the package ``libseccomp2`` to be installed when using Debian/Raspbian Buster.
|
<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>
|
||||||
|
|
||||||
```sh
|
### Note
|
||||||
# Install Backports Key
|
Game data is stored in `~/.var/app/com.thebrokenrail.MCPIReborn/.minecraft-pi` instead of `~/.minecraft-pi`.
|
||||||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 04EE7237B7D453EC
|
|
||||||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 648ACFD622F3D138
|
|
||||||
# Install Backports Repository
|
|
||||||
echo 'deb http://deb.debian.org/debian buster-backports main' | sudo tee -a /etc/apt/sources.list
|
|
||||||
# Update APT Index
|
|
||||||
sudo apt update
|
|
||||||
# Install Updated libseccomp2
|
|
||||||
sudo apt install -t buster-backports libseccomp2
|
|
||||||
```
|
|
||||||
|
|
||||||
### Official Docker Package
|
## Arch User Repository (Arch Linux Only)
|
||||||
``minecraft-pi-reborn`` requires the official Docker package when running Debian/Raspbian Buster instead of the Debian package (``docker.io``).
|
The [`minecraft-pi-reborn-git`](https://aur.archlinux.org/packages/minecraft-pi-reborn-git) is available in the AUR.
|
||||||
|
|
||||||
```sh
|
|
||||||
# Remove Debian Docker Package
|
|
||||||
sudo apt-get remove -y docker.io
|
|
||||||
# Install Official Docker Package
|
|
||||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
||||||
sudo sh get-docker.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### Existing Installation
|
|
||||||
If you have un-modded ``minecraft-pi`` installed, you must remove it and transfer your existing worlds to ``minecraft-pi-reborn``'s folder.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# Transfer Worlds
|
|
||||||
mv ~/.minecraft ~/.minecraft-pi
|
|
||||||
# Remove Vanilla Minecraft Pi
|
|
||||||
sudo apt-get remove -y minecraft-pi
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>NVIDIA Users</summary>
|
|
||||||
|
|
||||||
The proprietary NVIDIA drivers are not supported, use either the open-source ``noveau`` drivers or use a different GPU (ie. Intel Integrated GPU).
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Installing
|
|
||||||
1. Download Appropriate Package From [Here](https://jenkins.thebrokenrail.com/job/minecraft-pi-reborn/job/master/lastSuccessfulBuild/artifact/out/deb/) (See Table Below To Pick Correct Package)
|
|
||||||
2. Install With ``sudo apt install ./<Path To File>`` Or Your Preferred Package Installer
|
|
||||||
3. Have Fun!
|
|
||||||
|
|
||||||
### Package Table
|
|
||||||
| Package | Description |
|
|
||||||
| --- | --- |
|
|
||||||
| ``minecraft-pi-reborn-virgl`` | Minecraft Pi Edition Using VirGL For Hardware Acceleration (Recommended For Desktop/Laptop) |
|
|
||||||
| ``minecraft-pi-reborn-native`` | Minecraft: Pi Edition Using Docker Device Mounting For GPU Acceleration (Recommended For ARM Devices (ie. Raspberry Pi, PinePhone, etc)) |
|
|
||||||
| ``minecraft-pi-reborn-server`` | Minecraft Pi Edition Modded Into A Dedicated Server |
|
|
||||||
|
|
116
docs/MODDING.md
116
docs/MODDING.md
|
@ -1,116 +0,0 @@
|
||||||
# Modding
|
|
||||||
Modding Minecraft: Pi Edition is possible by patching the binary at runtime. To make this easier ``minecraft-pi-reborn`` includes a library called ``libreborn.so`` which provides several functions to help you patch the game.
|
|
||||||
|
|
||||||
## Hex Addresses
|
|
||||||
Minecraft: Pi Edition has no symbols so you must patch the hex address of an instruction instead of using a function name. Hex addresses can be found using tools like [Ghidra](https://ghidra-sre.org) or [RetDec](https://retdec.com). To find out what a function does, you can find its equivalent in Minecraft: Pocket Edition 0.6.1 and use its name for reference because Minecraft: Pocket Edition 0.6.1 includes symbols.
|
|
||||||
|
|
||||||
## Loading Directories
|
|
||||||
``minecraft-pi-reborn`` loads mods from two locations, ``/app/minecraft-pi/mods``, and ``~/.minecraft-pi/mods``. The first location only exists in the Docker container and is immutable, so you should place your mods in ``~/.minecraft-pi/mods`` which is mounted on the host.
|
|
||||||
|
|
||||||
## C++ Strings
|
|
||||||
Minecraft: Pi Edition was compiled with an old version of GCC, so when interacting with C++ strings, make sure you set ``-D_GLIBCXX_USE_CXX11_ABI=0``.
|
|
||||||
|
|
||||||
## ``libreborn.so`` API
|
|
||||||
Header files and the shared library can be download from [Jenkins](https://jenkins.thebrokenrail.com/job/minecraft-pi-reborn/job/master/lastSuccessfulBuild/artifact/out/lib).
|
|
||||||
|
|
||||||
### ``void overwrite(void *start, void *target)``
|
|
||||||
This method replaces a function with another function.
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
- **start:** The function you are replacing.
|
|
||||||
- **target:** The function you are replacing it with.
|
|
||||||
|
|
||||||
#### Return Value
|
|
||||||
None
|
|
||||||
|
|
||||||
#### Warning
|
|
||||||
This should never be used on functions that are only 1 byte long because it overwrites 2 bytes.
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
```c
|
|
||||||
static int func_injection(int a, int b) {
|
|
||||||
return a + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((constructor)) static void init() {
|
|
||||||
overwrite((void *) 0xabcde, func_injection);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### ``void overwrite_call(void *start, void *original)``
|
|
||||||
This allows you to overwrite a specific call of a function rather than the function itself. This allows you to call the original function. However, this does not effect VTables.
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
- **start:** The address of the function call to overwrite.
|
|
||||||
- **target:** The function call you are replacing it with.
|
|
||||||
|
|
||||||
#### Return Value
|
|
||||||
None
|
|
||||||
|
|
||||||
#### Warning
|
|
||||||
This method can only be safely used 512 times in total.
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
```c
|
|
||||||
typedef int (*func_t)(int a, int b);
|
|
||||||
static func_t func = (func_t) 0xabcde;
|
|
||||||
static void *func_original = NULL;
|
|
||||||
|
|
||||||
static int func_injection(int a, int b) {
|
|
||||||
(*func)(a, b);
|
|
||||||
|
|
||||||
return a + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((constructor)) static void init() {
|
|
||||||
overwrite_call((void *) 0xabcd, func_injection);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### ``void overwrite_calls(void *start, void *original)``
|
|
||||||
This allows you to overwrite all calls of a function rather than the function itself. This allows you to call the original function. However, this does not effect VTables.
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
- **start:** The function call to overwrite;
|
|
||||||
- **target:** The function call you are replacing it with.
|
|
||||||
|
|
||||||
#### Return Value
|
|
||||||
None
|
|
||||||
|
|
||||||
#### Warning
|
|
||||||
This method can only be safely used 512 times in total.
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
```c
|
|
||||||
typedef int (*func_t)(int a, int b);
|
|
||||||
static func_t func = (func_t) 0xabcde;
|
|
||||||
static void *func_original = NULL;
|
|
||||||
|
|
||||||
static int func_injection(int a, int b) {
|
|
||||||
(*func)(a, b);
|
|
||||||
|
|
||||||
return a + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((constructor)) static void init() {
|
|
||||||
overwrite_calls((void *) func, func_injection);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### ``void patch(void *start, unsigned char patch[])``
|
|
||||||
This allows you to replace a specific instruction.
|
|
||||||
|
|
||||||
#### Parameters
|
|
||||||
- **start:** The target instruction.
|
|
||||||
- **patch:** The new instruction (array length must be 4).
|
|
||||||
|
|
||||||
#### Return Value
|
|
||||||
None
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
```c
|
|
||||||
__attribute__((constructor)) static void init() {
|
|
||||||
unsigned char patch_data[4] = {0x00, 0x00, 0x00, 0x00};
|
|
||||||
patch((void *) 0xabcde, patch_data);
|
|
||||||
}
|
|
||||||
```
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
# Multiplayer
|
||||||
|
MCPI-Reborn supports two ways to play multiplayer.
|
||||||
|
|
||||||
|
## Local Network (LAN)
|
||||||
|
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.
|
||||||
|
|
||||||
|
### Example `~/.minecraft-pi/servers.txt`
|
||||||
|
```
|
||||||
|
# Default Port Is 19132
|
||||||
|
example.com
|
||||||
|
# Custom Port
|
||||||
|
example.com:19133
|
||||||
|
```
|
|
@ -1,6 +1,8 @@
|
||||||
# Overriding Assets
|
# Overriding Assets
|
||||||
Normally, Minecraft: Pi Edition assets can be easily overridden by physically replacing the file, however ``minecraft-pi-=reborn`` uses a Docker image making this much harder to do. To make overriding assets easier, ``minecraft-pi-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``.
|
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`[^1].
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
- ``data/images/terrain.png`` -> ``~/.minecraft-pi/overrides/images/terrain.png``
|
- `data/images/terrain.png` -> `~/.minecraft-pi/overrides/images/terrain.png`
|
||||||
- ``data/lang/en_US.lang`` -> ``~/.minecraft-pi/overrides/lang/en_US.lang``
|
- `data/lang/en_US.lang` -> `~/.minecraft-pi/overrides/lang/en_US.lang`
|
||||||
|
|
||||||
|
[^1]: On Flatpak, the path is `~/.var/app/com.thebrokenrail.MCPIReborn/.minecraft-pi/overrides`.
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
# Documentation
|
||||||
|
* [View Installation](INSTALL.md)
|
||||||
|
* [View Overriding Assets](OVERRIDING_ASSETS.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)
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Sound
|
||||||
|
One of MCPI-Reborn's main modifications is a sound-engine since MCPI does not include one by default[^1]. However, it can't be used out-of-box because MCPI does not 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`[^3] and you should have sound!
|
||||||
|
|
||||||
|
[^1]: The mute button is just leftover code from MCPE, it does not actually do anything in un-modded MCPI, however it is connected to MCPI-Reborn's sound-engine.
|
||||||
|
[^2]: This is not a hard limit, an MCPE v0.8.1 APK would probably work, but don't rely on it.
|
||||||
|
[^3]: On Flatpak, the path is `~/.var/app/com.thebrokenrail.MCPIReborn/.minecraft-pi/overrides`.
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Terminology
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| MCPI | Shorthand for Minecraft: Pi Edition |
|
||||||
|
| MCPE | Shorthand for Minecraft: Pocket Edition |
|
||||||
|
| Host Architecture | The native architecture of the CPU that MCPi-Reborn will be running on |
|
||||||
|
| Native Component | A component that *can* be compiled for the host architecture |
|
||||||
|
| ARM Component | A component that *must* be compiled for ARM |
|
||||||
|
| Server Mode | A mode where MCPI is patched into behaving like a dedicated server |
|
||||||
|
| Client Mode | The normal behavior of MCPI |
|
||||||
|
| Stub | An implementation of a library where all functions either do nothing or error |
|
|
@ -1,26 +0,0 @@
|
||||||
# Troubleshooting
|
|
||||||
Game logs are located in ``/tmp/minecraft-pi``.
|
|
||||||
|
|
||||||
## ``Couldn't connect to Docker daemon at http+docker://localhost - is it running?``
|
|
||||||
Start Docker if it isn't running:
|
|
||||||
```sh
|
|
||||||
sudo service docker start
|
|
||||||
```
|
|
||||||
|
|
||||||
## ``Error response from daemon: error gathering device information while adding custom device "/dev/dri": no such file or directory``
|
|
||||||
Make sure you are using the correct GPU drivers for your system.
|
|
||||||
|
|
||||||
If you are using a Raspberry Pi, make sure your GPU driver is set to ``Full KMS`` or ``Fake KMS`` in ``raspi-config``.
|
|
||||||
|
|
||||||
## ``Segmentation Fault`` (Exit Code: ``139``)
|
|
||||||
Report an issue with reproduction instructions and system details.
|
|
||||||
|
|
||||||
## ``[ERR]: Invalid ~/.minecraft-pi Permissions``
|
|
||||||
Update ``~/.minecraft-pi`` permissions:
|
|
||||||
```sh
|
|
||||||
sudo chown -R "$(id -u):$(id -g)" ~/.minecraft-pi
|
|
||||||
chmod -R u+rw ~/.minecraft-pi
|
|
||||||
```
|
|
||||||
|
|
||||||
## Other
|
|
||||||
If you experience a crash/error not listed above, report it on the issue tracker **with your game log attached**.
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Example Mods
|
||||||
|
This is an example of a mod 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.
|
||||||
|
* **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
|
||||||
|
```
|
|
@ -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
|
|
@ -0,0 +1,15 @@
|
||||||
|
/out
|
||||||
|
/debian/tmp
|
||||||
|
/.vscode
|
||||||
|
/build*
|
||||||
|
/CMakeLists.txt.user
|
||||||
|
*.autosave
|
||||||
|
/AppImageBuilder.yml
|
||||||
|
/appimage-builder-cache
|
||||||
|
/appimage-build
|
||||||
|
/AppDir
|
||||||
|
/*.zsync
|
||||||
|
/*.AppImage
|
||||||
|
/core*
|
||||||
|
/qemu_*
|
||||||
|
/cmake/.prebuilt-armhf-toolchain
|
|
@ -0,0 +1,17 @@
|
||||||
|
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")
|
||||||
|
|
||||||
|
# Build
|
||||||
|
add_library(chat-commands SHARED chat-commands.cpp)
|
||||||
|
target_link_libraries(chat-commands mods reborn-patch symbols)
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Headers
|
||||||
|
#include <libreborn/libreborn.h>
|
||||||
|
#include <symbols/minecraft.h>
|
||||||
|
#include <mods/chat/chat.h>
|
||||||
|
#include <mods/misc/misc.h>
|
||||||
|
|
||||||
|
// The Actual Mod
|
||||||
|
HOOK(chat_handle_packet_send, void, (Minecraft *minecraft, ChatPacket *packet)) {
|
||||||
|
// Get Message
|
||||||
|
const char *message = packet->message.c_str();
|
||||||
|
if (message[0] == '/') {
|
||||||
|
// API Command
|
||||||
|
Gui *gui = &minecraft->gui;
|
||||||
|
std::string out = chat_send_api_command(minecraft, (char *) &message[1]);
|
||||||
|
if (out.length() > 0 && out[out.length() - 1] == '\n') {
|
||||||
|
out[out.length() - 1] = '\0';
|
||||||
|
}
|
||||||
|
gui->addMessage(&out);
|
||||||
|
} else {
|
||||||
|
// Call Original Method
|
||||||
|
ensure_chat_handle_packet_send();
|
||||||
|
real_chat_handle_packet_send(minecraft, packet);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
/out
|
||||||
|
/debian/tmp
|
||||||
|
/.vscode
|
||||||
|
/build*
|
||||||
|
/CMakeLists.txt.user
|
||||||
|
*.autosave
|
||||||
|
/AppImageBuilder.yml
|
||||||
|
/appimage-builder-cache
|
||||||
|
/appimage-build
|
||||||
|
/AppDir
|
||||||
|
/*.zsync
|
||||||
|
/*.AppImage
|
||||||
|
/core*
|
||||||
|
/qemu_*
|
||||||
|
/cmake/.prebuilt-armhf-toolchain
|
|
@ -0,0 +1,17 @@
|
||||||
|
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")
|
||||||
|
|
||||||
|
# Build
|
||||||
|
add_library(expanded-creative SHARED expanded-creative.cpp)
|
||||||
|
target_link_libraries(expanded-creative mods reborn-patch symbols)
|
|
@ -0,0 +1,636 @@
|
||||||
|
// 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(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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init
|
||||||
|
__attribute__((constructor)) static void init_expanded_creative() {
|
||||||
|
INFO("Loading Expanded Creative Mod");
|
||||||
|
misc_run_on_creative_inventory_setup(Inventory_setupDefault_FillingContainer_addItem_call_injection);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
/out
|
||||||
|
/debian/tmp
|
||||||
|
/.vscode
|
||||||
|
/build*
|
||||||
|
/CMakeLists.txt.user
|
||||||
|
*.autosave
|
||||||
|
/AppImageBuilder.yml
|
||||||
|
/appimage-builder-cache
|
||||||
|
/appimage-build
|
||||||
|
/AppDir
|
||||||
|
/*.zsync
|
||||||
|
/*.AppImage
|
||||||
|
/core*
|
||||||
|
/qemu_*
|
||||||
|
/cmake/.prebuilt-armhf-toolchain
|
|
@ -0,0 +1,17 @@
|
||||||
|
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")
|
||||||
|
|
||||||
|
# Build
|
||||||
|
add_library(recipes SHARED recipes.cpp)
|
||||||
|
target_link_libraries(recipes mods reborn-util symbols)
|
|
@ -0,0 +1,57 @@
|
||||||
|
// Headers
|
||||||
|
#include <libreborn/libreborn.h>
|
||||||
|
#include <symbols/minecraft.h>
|
||||||
|
#include <mods/misc/misc.h>
|
||||||
|
|
||||||
|
// Custom Crafting Recipes
|
||||||
|
static void Recipes_injection(Recipes *recipes) {
|
||||||
|
// Add
|
||||||
|
Recipes_Type type1 = {
|
||||||
|
.item = 0,
|
||||||
|
.tile = 0,
|
||||||
|
.instance = {
|
||||||
|
.count = 1,
|
||||||
|
.id = 12,
|
||||||
|
.auxiliary = 0
|
||||||
|
},
|
||||||
|
.letter = 'a'
|
||||||
|
};
|
||||||
|
Recipes_Type type2 = {
|
||||||
|
.item = 0,
|
||||||
|
.tile = 0,
|
||||||
|
.instance = {
|
||||||
|
.count = 1,
|
||||||
|
.id = 13,
|
||||||
|
.auxiliary = 0
|
||||||
|
},
|
||||||
|
.letter = 'b'
|
||||||
|
};
|
||||||
|
ItemInstance result = {
|
||||||
|
.count = 1,
|
||||||
|
.id = 344,
|
||||||
|
.auxiliary = 0
|
||||||
|
};
|
||||||
|
std::vector<Recipes_Type> types = {type1, type2};
|
||||||
|
Recipes_addShapelessRecipe(recipes, &result, &types);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom Furnace Recipes
|
||||||
|
static void FurnaceRecipes_injection(FurnaceRecipes *recipes) {
|
||||||
|
// Add
|
||||||
|
ItemInstance result = {
|
||||||
|
.count = 1,
|
||||||
|
.id = 246,
|
||||||
|
.auxiliary = 0
|
||||||
|
};
|
||||||
|
FurnaceRecipes_addFurnaceRecipe(recipes, 49, &result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init
|
||||||
|
__attribute__((constructor)) static void init_recipes() {
|
||||||
|
// Log
|
||||||
|
INFO("Loading Custom Recipes");
|
||||||
|
|
||||||
|
// Setup
|
||||||
|
misc_run_on_recipes_setup(Recipes_injection);
|
||||||
|
misc_run_on_furnace_recipes_setup(FurnaceRecipes_injection);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
project(images)
|
||||||
|
|
||||||
|
# Title Background
|
||||||
|
if(NOT MCPI_HEADLESS_MODE)
|
||||||
|
install(
|
||||||
|
FILES "background.png"
|
||||||
|
DESTINATION "${MCPI_INSTALL_DIR}/data/images/gui"
|
||||||
|
RENAME "titleBG.png"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Chest Model
|
||||||
|
if(NOT MCPI_HEADLESS_MODE)
|
||||||
|
install(
|
||||||
|
FILES "chest.png"
|
||||||
|
DESTINATION "${MCPI_INSTALL_DIR}/data/images/item"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Icon
|
||||||
|
install(
|
||||||
|
FILES "icon.png"
|
||||||
|
DESTINATION "${MCPI_SHARE_DIR}/icons/hicolor/scalable/apps"
|
||||||
|
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("${MCPI_APP_ID}.png" ".DirIcon")
|
||||||
|
endif()
|
Binary file not shown.
After Width: | Height: | Size: 283 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
Binary file not shown.
After Width: | Height: | Size: 117 KiB |
BIN
images/start.png
BIN
images/start.png
Binary file not shown.
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 164 KiB |
|
@ -1,34 +1,125 @@
|
||||||
cmake_minimum_required(VERSION 3.1.0)
|
|
||||||
|
|
||||||
project(launcher)
|
project(launcher)
|
||||||
|
|
||||||
add_compile_options(-Wall -Wextra -Werror)
|
# Launcher
|
||||||
|
add_executable(launcher
|
||||||
## Launcher
|
src/bootstrap.c
|
||||||
|
src/patchelf.cpp
|
||||||
add_executable(launcher src/launcher.c)
|
src/util.c
|
||||||
|
src/crash-report.c
|
||||||
|
src/sdk.c
|
||||||
|
src/mods.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
|
||||||
|
src/client/cache.cpp
|
||||||
|
src/client/available-feature-flags # Show In IDE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(launcher reborn-util LIB_LIEF)
|
||||||
|
# RPath
|
||||||
|
set_target_properties(launcher PROPERTIES INSTALL_RPATH "$ORIGIN/lib/native")
|
||||||
|
|
||||||
# Install
|
# Install
|
||||||
install(TARGETS launcher DESTINATION /)
|
install(TARGETS launcher DESTINATION "${MCPI_INSTALL_DIR}")
|
||||||
install(PROGRAMS src/run.sh DESTINATION /)
|
install_symlink("../${MCPI_INSTALL_DIR}/launcher" "bin/${MCPI_VARIANT_NAME}")
|
||||||
|
|
||||||
## Stubs
|
# Install Desktop Entry
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
|
||||||
|
"[Desktop Entry]\n"
|
||||||
|
"Name=${MCPI_APP_TITLE}\n"
|
||||||
|
"Comment=Fun with Blocks\n"
|
||||||
|
"Icon=${MCPI_APP_ID}\n"
|
||||||
|
"Exec=${MCPI_VARIANT_NAME}\n"
|
||||||
|
"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()
|
||||||
|
install(
|
||||||
|
FILES "${CMAKE_CURRENT_BINARY_DIR}/launcher.desktop"
|
||||||
|
DESTINATION "${MCPI_SHARE_DIR}/applications"
|
||||||
|
RENAME "${MCPI_APP_ID}.desktop"
|
||||||
|
)
|
||||||
|
|
||||||
# Stub RPI-Specific Graphics
|
# Install AppStream Metadata
|
||||||
add_library(bcm_host SHARED src/stubs/bcm_host.c)
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/appstream.xml"
|
||||||
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||||
|
"<component type=\"desktop\">\n"
|
||||||
|
" <id>${MCPI_APP_ID}</id>\n"
|
||||||
|
" <name>${MCPI_APP_TITLE}</name>\n"
|
||||||
|
" <metadata_license>CC0-1.0</metadata_license>\n"
|
||||||
|
" <summary>Fun with Blocks</summary>\n"
|
||||||
|
" <description>\n"
|
||||||
|
" <p>Minecraft: Pi Edition Modding Project.</p>\n"
|
||||||
|
" <p>NOTE: This is not verified by, affiliated with, or supported by Mojang or Microsoft.</p>\n"
|
||||||
|
" </description>\n"
|
||||||
|
" <url type=\"homepage\">https://gitea.thebrokenrail.com/TheBrokenRail/minecraft-pi-reborn</url>\n"
|
||||||
|
" <launchable type=\"desktop-id\">${MCPI_APP_ID}.desktop</launchable>\n"
|
||||||
|
" <provides>\n"
|
||||||
|
" <id>com.thebrokenrail.MCPIRebornClient.desktop</id>\n"
|
||||||
|
" </provides>\n"
|
||||||
|
" <project_license>LicenseRef-proprietary</project_license>\n"
|
||||||
|
" <developer_name>TheBrokenRail & Mojang AB</developer_name>\n"
|
||||||
|
" <content_rating type=\"oars-1.0\">\n"
|
||||||
|
" <content_attribute id=\"violence-cartoon\">moderate</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"violence-fantasy\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"violence-realistic\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"violence-bloodshed\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"violence-sexual\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"drugs-alcohol\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"drugs-narcotics\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"drugs-tobacco\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"sex-nudity\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"sex-themes\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"language-profanity\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"language-humor\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"language-discrimination\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"social-chat\">intense</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"social-info\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"social-audio\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"social-location\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"social-contacts\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"money-purchasing\">none</content_attribute>\n"
|
||||||
|
" <content_attribute id=\"money-gambling\">none</content_attribute>\n"
|
||||||
|
" </content_rating>\n"
|
||||||
|
" <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"
|
||||||
|
"</component>\n"
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
FILES "${CMAKE_CURRENT_BINARY_DIR}/appstream.xml"
|
||||||
|
DESTINATION "${MCPI_SHARE_DIR}/metainfo"
|
||||||
|
RENAME "${MCPI_APP_ID}.appdata.xml"
|
||||||
|
)
|
||||||
|
|
||||||
# Stub EGL
|
# AppImage
|
||||||
add_library(EGL SHARED src/stubs/EGL.c)
|
if(MCPI_IS_APPIMAGE_BUILD)
|
||||||
|
install_symlink("bin/${MCPI_VARIANT_NAME}" "AppRun")
|
||||||
# Stub SDL
|
install_symlink("${MCPI_SHARE_DIR}/applications/${MCPI_APP_ID}.desktop" "${MCPI_APP_ID}.desktop")
|
||||||
add_library(SDL-1.2 SHARED src/stubs/SDL.cpp)
|
endif()
|
||||||
target_link_libraries(SDL-1.2 pthread)
|
|
||||||
set_target_properties(SDL-1.2 PROPERTIES SOVERSION "0")
|
|
||||||
|
|
||||||
# MCPI Links Against GLESv2 But Uses GLESv1_CM
|
|
||||||
add_library(GLESv2 SHARED src/stubs/GLESv2.c)
|
|
||||||
target_link_libraries(GLESv2 GLESv1_CM)
|
|
||||||
target_link_options(GLESv2 PRIVATE "-Wl,--no-as-needed")
|
|
||||||
|
|
||||||
# Install Stubs
|
|
||||||
install(TARGETS bcm_host EGL SDL-1.2 GLESv2 DESTINATION /lib)
|
|
||||||
|
|
|
@ -0,0 +1,361 @@
|
||||||
|
#define _FILE_OFFSET_BITS 64
|
||||||
|
|
||||||
|
#include <libreborn/libreborn.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
#include "bootstrap.h"
|
||||||
|
#include "patchelf.h"
|
||||||
|
#include "crash-report.h"
|
||||||
|
|
||||||
|
#define MCPI_BINARY "minecraft-pi"
|
||||||
|
#define QEMU_BINARY "qemu-arm"
|
||||||
|
|
||||||
|
#define REQUIRED_PAGE_SIZE 4096
|
||||||
|
#define _STR(x) #x
|
||||||
|
#define STR(x) _STR(x)
|
||||||
|
|
||||||
|
// Exit Handler
|
||||||
|
static void exit_handler(__attribute__((unused)) int signal_id) {
|
||||||
|
// Pass Signal To Child
|
||||||
|
murder_children();
|
||||||
|
while (wait(NULL) > 0) {}
|
||||||
|
_exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Debug Information
|
||||||
|
static void run_debug_command(const char *const command[], const char *prefix) {
|
||||||
|
int status = 0;
|
||||||
|
char *output = run_command(command, &status, NULL);
|
||||||
|
if (output != NULL) {
|
||||||
|
// 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", NULL};
|
||||||
|
run_debug_command(command, "System Information");
|
||||||
|
|
||||||
|
// Version
|
||||||
|
DEBUG("Reborn Version: v%s", MCPI_VERSION);
|
||||||
|
|
||||||
|
// Architecture
|
||||||
|
const char *arch = "Unknown";
|
||||||
|
#ifdef __x86_64__
|
||||||
|
arch = "AMD64";
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
arch = "ARM64";
|
||||||
|
#elif defined(__arm__)
|
||||||
|
arch = "ARM32";
|
||||||
|
#endif
|
||||||
|
DEBUG("Reborn Target Architecture: %s", arch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pre-Bootstrap
|
||||||
|
void pre_bootstrap(int argc, char *argv[]) {
|
||||||
|
// Set Debug Tag
|
||||||
|
reborn_debug_tag = "(Launcher) ";
|
||||||
|
|
||||||
|
// Disable stdout Buffering
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup Logging
|
||||||
|
setup_log_file();
|
||||||
|
|
||||||
|
// --debug
|
||||||
|
for (int i = 1; i < argc; i++) {
|
||||||
|
if (strcmp(argv[i], "--debug") == 0) {
|
||||||
|
set_and_print_env("MCPI_DEBUG", "1");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// GTK Dark Mode
|
||||||
|
#ifndef MCPI_SERVER_MODE
|
||||||
|
set_and_print_env("GTK_THEME", "Adwaita:dark");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Configure PATH
|
||||||
|
{
|
||||||
|
// Get Binary Directory
|
||||||
|
char *binary_directory = get_binary_directory();
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --copy-sdk
|
||||||
|
for (int i = 1; i < argc; i++) {
|
||||||
|
if (strcmp(argv[i], "--copy-sdk") == 0) {
|
||||||
|
char *binary_directory = get_binary_directory();
|
||||||
|
copy_sdk(binary_directory, 0);
|
||||||
|
free(binary_directory);
|
||||||
|
fflush(stdout);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup Crash Reports
|
||||||
|
setup_crash_report();
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// Check Page Size (Not Needed When Using QEMU)
|
||||||
|
#ifndef MCPI_USE_QEMU
|
||||||
|
long page_size = sysconf(_SC_PAGESIZE);
|
||||||
|
if (page_size != REQUIRED_PAGE_SIZE) {
|
||||||
|
ERR("Invalid page size! A page size of %ld bytes is required, but the system size is %ld bytes.", (long) REQUIRED_PAGE_SIZE, page_size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Debug Information
|
||||||
|
print_debug_information();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bootstrap
|
||||||
|
void bootstrap(int argc, char *argv[]) {
|
||||||
|
INFO("Configuring Game...");
|
||||||
|
|
||||||
|
// Get Binary Directory
|
||||||
|
char *binary_directory = get_binary_directory();
|
||||||
|
DEBUG("Binary Directory: %s", binary_directory);
|
||||||
|
|
||||||
|
// Copy SDK
|
||||||
|
copy_sdk(binary_directory, 1);
|
||||||
|
|
||||||
|
// 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
|
||||||
|
linker = patch_get_interpreter();
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
bootstrap_mods(binary_directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
#ifdef MCPI_USE_QEMU
|
||||||
|
argv_start--;
|
||||||
|
new_args[argv_start] = QEMU_BINARY;
|
||||||
|
// Use 4k Page Size
|
||||||
|
set_and_print_env("QEMU_PAGESIZE", STR(REQUIRED_PAGE_SIZE));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Setup Environment
|
||||||
|
setup_exec_environment(1);
|
||||||
|
|
||||||
|
// Pass LD_* Variables Through QEMU
|
||||||
|
#ifdef MCPI_USE_QEMU
|
||||||
|
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);
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void pre_bootstrap(int argc, char *argv[]);
|
||||||
|
void bootstrap(int argc, char *argv[]);
|
||||||
|
void copy_sdk(char *binary_directory, int log_with_debug);
|
||||||
|
void bootstrap_mods(char *binary_directory);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,69 @@
|
||||||
|
FALSE Full Touch GUI
|
||||||
|
TRUE Fix Bow & Arrow
|
||||||
|
TRUE Fix Attacking
|
||||||
|
FALSE Force Mob Spawning
|
||||||
|
TRUE Disable Autojump By Default
|
||||||
|
TRUE Display Nametags By Default
|
||||||
|
TRUE Fix Sign Placement
|
||||||
|
TRUE Show Block Outlines
|
||||||
|
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 Animated Lava
|
||||||
|
TRUE Animated Fire
|
||||||
|
TRUE Remove Invalid Item Background
|
||||||
|
TRUE Disable "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 Mode Servers
|
||||||
|
TRUE Miscellaneous Input Fixes
|
||||||
|
TRUE Bind "Q" Key To Item Dropping
|
||||||
|
TRUE Bind Common Toggleable Options To Function Keys
|
||||||
|
TRUE Render Selected Item Text
|
||||||
|
TRUE External Server Support
|
||||||
|
TRUE Load Language Files
|
||||||
|
TRUE Implement Sound Engine
|
||||||
|
TRUE Close Current Screen On Death
|
||||||
|
FALSE Disable Raw Mouse Motion (Not Recommended)
|
||||||
|
TRUE Fix Furnace Not Checking Item Auxiliary
|
||||||
|
TRUE Improved Cursor Rendering
|
||||||
|
TRUE Disable V-Sync
|
||||||
|
TRUE Fix Options Screen
|
||||||
|
TRUE Force Touch GUI Inventory
|
||||||
|
TRUE Fix Pause Menu
|
||||||
|
TRUE Add Title Screen Background
|
||||||
|
TRUE Force Touch GUI Button Behavior
|
||||||
|
TRUE Improved Button Hover Behavior
|
||||||
|
TRUE Implement Create World Dialog
|
||||||
|
FALSE Remove Forced GUI Lag (Can Break Joining Servers)
|
||||||
|
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 Disable Buggy Held Item Caching
|
||||||
|
TRUE Add Reborn Info To Options
|
||||||
|
FALSE Track FPS
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue