Compare commits

...

1051 Commits

Author SHA1 Message Date
Jonas Herzig
a4c8dafa07 Release 2.6.26 2026-04-14 12:41:25 +02:00
Jonas Herzig
6e64f2acd0 Fix no texture animations when rendering on 1.21.11+ 2026-04-14 12:39:59 +02:00
Jonas Herzig
27d5432fff Update to 26.1 2026-04-14 12:39:59 +02:00
Jonas Herzig
b72fad4055 Update to Gradle 9, Loom 1.15, EGT 0.7 2026-04-06 07:48:51 +02:00
Jonas Herzig
f08607a599 Release 2.6.25 2025-12-16 16:38:50 +01:00
Jonas Herzig
a5dec5db25 Fix hiding of player nametags on 1.21.9+ 2025-12-16 16:35:20 +01:00
Jonas Herzig
dad0ac18a3 Fix missing fabric-resource-loader-v1 dependency 2025-12-16 16:35:20 +01:00
TKD_Kedis
caffd41358 Update to 1.21.11 (#1106)
Co-authored-by: Jonas Herzig <me@johni0702.de>
2025-12-16 16:34:53 +01:00
Jonas Herzig
713db19928 Release 2.6.24 2025-10-20 19:43:35 +02:00
Jonas Herzig
d3929cb6dc Update to 1.21.9/10 2025-10-12 21:26:28 +02:00
Jonas Herzig
e6db9daf80 Update key and mouse handling in preparation for 1.21.9 2025-10-12 20:21:03 +02:00
Jonas Herzig
f299644254 Reimplement runLater without relying on MC's renderTaskQueue
Cause it's gone in 1.21.9, and really not necessary to begin with since
we have our own executor already.
2025-10-12 16:10:29 +02:00
Jonas Herzig
4d644a44c3 Release 2.6.23 2025-07-05 09:40:33 +02:00
Jonas Herzig
85fb0847ee Update to 1.21.7 2025-06-30 18:13:20 +02:00
Jonas Herzig
926f6b6624 Fix depth export on 1.21.5+ 2025-06-14 08:49:46 +02:00
Jonas Herzig
928094bd27 Fix recording in minimal mode on 1.20.6+ 2025-06-13 14:15:03 +02:00
Jonas Herzig
d7b563768f Move replay camera entity creation into dedicated mixin 2025-06-13 14:02:40 +02:00
Jonas Herzig
8246085b84 Fix first person hand missing when shaders are enabled with Iris 1.7+ 2025-06-13 10:49:02 +02:00
Jonas Herzig
55e6044bdd Release 2.6.22 2025-05-13 16:09:25 +02:00
Jonas Herzig
a8c1d19240 Update to 1.21.5 2025-04-28 11:14:37 +02:00
Jonas Herzig
7aad4dcfd9 Update Iris url 2025-04-05 13:10:31 +02:00
Jonas Herzig
b2dde7da97 Release 2.6.21 2024-12-15 10:24:51 +01:00
Jonas Herzig
f21fed031c Update to 1.21.4 2024-12-15 10:24:12 +01:00
Jonas Herzig
7f7b4e1891 Fix camera looking straight down on 1.21.2+ 2024-12-07 17:05:59 +01:00
Jonas Herzig
50cfcbabfb Release 2.6.20 2024-11-03 18:17:58 +01:00
Jonas Herzig
8cf598d781 Fix transfer packet log spam 2024-11-03 17:44:39 +01:00
Jonas Herzig
14229ef1fe Fix LoginHelloS2CPacket being recorded on some servers 2024-11-03 17:44:39 +01:00
Jonas Herzig
17d87faa34 Update to 1.21.2 2024-11-03 17:44:28 +01:00
Jonas Herzig
193e51b3c2 Release 2.6.19 2024-09-09 13:27:52 +02:00
Jonas Herzig
a0c5f25e61 Update ReplayStudio 2024-09-09 13:22:04 +02:00
Jonas Herzig
8503ff0e67 Remove unnecessary manual mappings 2024-09-09 13:22:04 +02:00
Jonas Herzig
73fe633819 Update preprocessor 2024-09-09 13:22:04 +02:00
Jonas Herzig
9f5a8c3d0f Release 2.6.18 2024-07-12 12:42:10 +02:00
Jonas Herzig
5959da8744 Fix LoginSuccess packet being recorded with incorrect id on 1.20.2-4 2024-07-12 12:38:17 +02:00
Jonas Herzig
6de0e37d96 Release 2.6.17 2024-07-10 22:06:28 +02:00
Jonas Herzig
5b766b4fe7 Fix included mod jars being exploded into outer jar
Caused by this stupid behavior of the shadow plugin:
https://github.com/johnrengelman/shadow/issues/111

Fixes #976
2024-07-10 22:04:38 +02:00
Jonas Herzig
203aad687d Release 2.6.16 2024-07-10 19:37:17 +02:00
Jonas Herzig
1836b7fb18 Fix Iris shader animation time on 1.21 2024-07-10 19:07:19 +02:00
Jonas Herzig
ca6ae4b983 Fix ODS export with Iris 1.7 2024-07-10 19:07:00 +02:00
Jonas Herzig
d2cdcb02fc Remove unnecessary isTransitive exclusion
Now that it's using Modrinth maven, there won't be any transitive
dependencies anyway.
2024-07-10 18:20:19 +02:00
Jonas Herzig
b537822d3c Enable Gradle daemon
Now that we no longer have to deal with ForgeGradle, we can actually use
this pretty fundamental Gradle feature again.
2024-07-10 17:36:01 +02:00
Jonas Herzig
6b5993ad64 Fix post-screenshot popup being invisible while HUD is hidden 2024-07-07 11:02:41 +02:00
Jonas Herzig
b4ead9e064 Update ReplayStudio
1e96fda Fix SquashFilter dropping config-phase custom packets
2024-07-07 10:32:55 +02:00
Jonas Herzig
8adb65d724 Move old mapping files to standard location 2024-07-01 12:48:23 +02:00
Jonas Herzig
329530de0e Update ReplayStudio so it works via includeBuild 2024-07-01 12:24:53 +02:00
Jonas Herzig
a04fd5b00b Move ReplayStudio submodule into libs folder 2024-06-30 20:27:59 +02:00
Jonas Herzig
486056de24 Fix recording whith login-phase custom packets 2024-06-25 10:31:12 +02:00
Jonas Herzig
2b2ab2ba8b Fix time keyframe lines rendering below timeline 2024-06-25 10:30:43 +02:00
Jonas Herzig
d70e41006d Add ReplayStudio as submodule instead of JitPack
Because JitPack breaks Gradle variants so we get the Java 17 jar even
when we use the Java 8 variant.

This works for building via Gradle. However it does not work for usage
from IntelliJ, where you must currently publishToMavenLocal ReplayStudio
and then depend on that version. Still looking for a better solution
there.
2024-06-23 21:41:18 +02:00
Jonas Herzig
a4e0abec7f Update to 1.21 2024-06-23 20:33:41 +02:00
Jonas Herzig
1433fccaf1 Update EGT to 0.6.1 2024-06-23 20:24:57 +02:00
Jonas Herzig
310dc90e11 Remove WrappedTimer 2024-06-23 20:24:57 +02:00
Jonas Herzig
454e990849 Replace InputReplayTimer with Mixin 2024-06-23 20:24:57 +02:00
Jonas Herzig
76a68b7867 Prevent pausing in the middle of a bundle packet
Because certain actions (e.g. switching to Quick Mode) will fail in this
state.
2024-06-23 20:24:57 +02:00
Jonas Herzig
5218feb6b6 Update to 1.20.6 2024-06-23 20:24:57 +02:00
Jonas Herzig
3f12413c6b De-duplicate recording channel configuration 2024-06-23 20:07:57 +02:00
Jonas Herzig
675134e6d6 Split outbound handler from FullReplaySender
This because with 1.20.6, MC will require outbound messages to reach its
handlers to switch between protocol versions. So we need our drop
handler two be at the very end of the write processing chain.
2024-06-23 20:07:57 +02:00
Jonas Herzig
4df627029c Fix race condition in PacketListener
The ChannelHandlerContext was only set on the next received packet,
however `save` could be called before that happened.
2024-06-23 20:07:57 +02:00
Jonas Herzig
046a50f326 Target WorldRenderer in Mixin_PostRenderWorldCalback 2024-06-23 20:07:57 +02:00
Jonas Herzig
f388e4af54 Update MixinExtras and include it on all Fabric versions 2024-06-23 20:07:57 +02:00
Jonas Herzig
8900d5a4fb Split MixinGameRenderer into multiple mixins 2024-06-18 14:50:34 +02:00
Jonas Herzig
acd56a7ba3 Remove player list packet entry workaround
No longer using ForgeGradle \o/
2024-05-13 17:33:06 +02:00
Jonas Herzig
c74ef8c0e4 Let Minecraft handle packet decoding during recording
We've done this ourselves only because it was easier at the beginning.
However with 1.20.5, Minecraft's packet decoding became substantially
more sophisticated, to the point that it's probably a bad idea to try
to do it ourselves.

Additionally, getting the packet ids, which we require for identifying
the packets which we want to decode, has becomes significantly more
difficult too, and this way it's a simple instanceof check.
2024-05-13 17:01:03 +02:00
Jonas Herzig
fe0677923c Let Minecraft handle packet decoding during playback
We've done this ourselves only because it was easier at the beginning.
However by now (and especially with 1.20.5), Minecraft's packet decoding
has become substantially more sophisticated, to the point that it's
probably a bad idea to try to do it ourselves.

This commit gives back that responsibility to Minecraft by adding the
standard decoder (and encoder because it's required for proper
connection state management on modern versions) to our channel pipeline,
changes the full and the quick replay sender to send raw `ByteBuf`s into
the front of the channel, and moves the posititon of the full replay
sender in the channel pipeline such that it can see and modify packets
after Minecraft has decoded them.
2024-05-13 15:25:50 +02:00
Jonas Herzig
ad49a69f37 Switch from FG to archloom + essential-gradle-toolkit
- Upgrade Gradle to 8.7
- Increase build daemon max memory to 8GB because archloom can compile a lot
  more projects at the same time.
- Disable Minecraft 1.8 (not 1.8.9) because archloom fails to set up for that
2024-05-12 14:24:43 +02:00
Jonas Herzig
706d46f6a9 Release 2.6.15 2024-03-10 18:05:59 +01:00
Jonas Herzig
c11fffedc1 Update ReplayStudio
95a7c07 Process PlayerPositionRotation packet in SquashFilter
603bdce Create dedicated class for PacketPlayerPositionRotation
88343aa Fix incorrect order of ViaVersion-emitted packets
9ebaa97 Fix 1.20 to 1.20.2 ViaVersion conversion
c490e9f Update ViaVersion
bcccb2c Fix Reconfigure packets not being filtered out
a0df6c9 Fix ConfigFinish being emitted before other config packets
a672023 Separate pre-join-game packets from login-phase packets
a70161c Emit Reconfigure packet when required
074d78d Separate "emit first" list from "login phase" list
20a3bf9 Reorder loginPhase and configurationPhase code
2024-03-10 18:02:19 +01:00
Jonas Herzig
ba6078e080 Update jGui, fixes JPG loading on 1.20.4+ 2024-03-10 16:30:25 +01:00
Jonas Herzig
f8379fa317 Fix thread-unsafe server resource pack playback 2024-03-10 16:29:31 +01:00
Jonas Herzig
61ef87eebe Release 2.6.14 2023-12-12 15:11:49 +01:00
Jonas Herzig
6e5536305b Bump 1.20.2 fabric-api to version 0.92.2 2023-12-09 10:43:26 +01:00
Jonas Herzig
1bf1e0d7be Port to 1.20.4 2023-12-09 10:43:26 +01:00
Jonas Herzig
faebeb525a Port to 1.20.3-rc1 2023-12-03 18:51:37 +01:00
Jonas Herzig
43576efeb3 Convert JPG images to PNG
Minecraft 1.20.3 no longer supports loading JPG images.
2023-12-03 16:28:28 +01:00
Jonas Herzig
b8ab7aa5a7 Port to 1.20.2 2023-11-27 19:40:42 +01:00
Jonas Herzig
e8f9234bf0 Fix EXR rendering failing on Windows on MC 1.20+ 2023-11-27 17:55:13 +01:00
Jonas Herzig
329ac51309 Fix rubber-banding on rotation of entity in vehicle (fixes #846) 2023-11-13 13:51:47 +01:00
Jonas Herzig
f506d5ac65 Fix missing networking-api-v1 on 1.16.4/5
We recently bumped the fabric-api version there, and newer versions of the v0
api just delegate to the v1 one now, so we need to include that there as well.
2023-10-18 12:09:59 +02:00
Jonas Herzig
96dbc54a53 Fix Iris dependency
Seems like it no longer builds on JitPack and their cache has expired.
2023-10-18 12:09:13 +02:00
Jonas Herzig
094ca1ce01 Release 2.6.13 2023-06-20 09:44:55 +02:00
Jonas Herzig
24237557f1 Port to 1.20.1 2023-06-20 09:31:07 +02:00
Jonas Herzig
d8c6ce9b5e Clean up 1.17 .gitkeep file 2023-06-12 11:04:25 +02:00
Jonas Herzig
7726550131 Port to MC 1.20 2023-06-12 10:28:08 +02:00
Jonas Herzig
96a05e256f Add MixinExtras on 1.16.4+
We'll use it in 1.20 mixins.
Unclear what minimal fabric-loader version it requires, so in the interest of
keeping older versions compatible with OptiFabric (old versions of which aren't
compatible with the latest fabric-loader), we'll add it to 1.16.4+ only.
2023-06-12 10:28:08 +02:00
Jonas Herzig
587eff59fe Rewrite main menu button injection code (closes #577, fixes #621)
For 1.16.4+ only because we use parts of fabric-screen-api.
2023-06-12 10:23:21 +02:00
Jonas Herzig
f92d6f5281 Fix overlay gui elements not moving on resize (fixes #841) 2023-06-12 09:07:45 +02:00
Jonas Herzig
fb4ae1b60a Delegate bindTexture to jGui's MCVer 2023-06-12 09:05:42 +02:00
Jonas Herzig
0c5009db8d Drop 1.17 in favor of 1.17.1
Primarily because fabric-api for 1.17 never received any updates, so
fabric-screen-api isn't available for it.
2023-06-12 08:49:15 +02:00
Jonas Herzig
81509a9acf Release 2.6.12 2023-03-28 12:24:16 +02:00
Jonas Herzig
fd740a4af6 Update ReplayStudio 2023-03-28 12:23:18 +02:00
Jonas Herzig
36741b97fa Release 2.6.11 2023-03-26 19:43:21 +02:00
Jonas Herzig
bf32672536 Fix active timeline changes affecting render queue (fixes #814)
The `Timeline` type is mutable, so we need to create a copy before we pass it to
GuiKeyframeRepository because we don't want anything stored in there (or more
specifically in render queue which can also be added to from that gui) to be
affected by subsequent changes.
2023-03-26 19:21:30 +02:00
Jonas Herzig
8037a9ad30 Fix ridden boat missing when joining 1.18+ Spigot server 2023-03-26 18:59:14 +02:00
Jonas Herzig
78bd060249 Port to MC 1.19.4 2023-03-26 18:58:49 +02:00
Jonas Herzig
ae5f893014 Release 2.6.10 2022-12-09 13:16:17 +01:00
Jonas Herzig
043664ab0c Fix multiplayer recording on 1.19.3 (fixes #803) 2022-12-09 13:14:56 +01:00
Jonas Herzig
9a5b88fd48 Release 2.6.9 2022-12-07 16:35:51 +01:00
Jonas Herzig
77ce90b2b0 Disable MixinShaderRenderChunk on 1.18+
It's only required for legacy Optifine doesn't even apply any more as of 1.18,
so we can just disable it on modern versions so it doesn't spam the log.
2022-12-07 16:34:55 +01:00
Jonas Herzig
3816671207 Fix depth export on 1.14.4 2022-12-07 16:34:55 +01:00
Jonas Herzig
000ff19749 Fix depth export while spectating on 1.12.2 and below (fixes #785) 2022-12-07 16:34:55 +01:00
Jonas Herzig
ffcca61b5b Fix running in 1.14.4 dev environment
First version of modmenu in its repo appears to be for 1.15, so we need to
disable it in 1.14.
2022-12-07 16:34:55 +01:00
Jonas Herzig
d571e8fed5 Port to MC 1.19.3
Building against 1.19.3-rc3 for now because 1.19.3 has yet to release.
ReplayStudio/ViaVersion is already targeting the release version though.
2022-12-07 16:34:55 +01:00
Jonas Herzig
e8ea70aabc Port to MC 1.19.2 (fixes #801) 2022-12-07 16:34:50 +01:00
Jonas Herzig
e0a682a5df Fix armor missing after dimension change (fixes #791)
The respawn packet re-creates the player entity, so we need to re-send its
armor (and technically also the riding and sleeping state, though that probably
wouldn't ever have caused issues in practice because a respawn will implicitly
reset those, unlike your inventory which is preserved).
2022-12-06 18:01:07 +01:00
Jonas Herzig
19404032fe Fix jGui resource pack when using per-version run folder 2022-12-06 17:51:55 +01:00
Jonas Herzig
bee13fc9a1 Replace projection matrix Redirect with ModifyArg
Should be better for compatibility because multiple mods can ModifyArg but only
one can Redirect, and will be easier to port to 1.19.3.
2022-12-06 17:37:15 +01:00
Jonas Herzig
3cec8fde9f Release 2.6.8 2022-08-10 14:29:15 +02:00
Jonas Herzig
cce65ec76d Ignore expired player public keys during replay
These would otherwise fail to be initialized and cause the game to disconnect
itself on the first chat message from the corresponding player.
2022-08-10 14:22:21 +02:00
Jonas Herzig
06f1e0c36c Fix chat message validation failure when Show Chat is off on 1.19.1+ 2022-08-10 14:22:21 +02:00
Jonas Herzig
35d1b7f24b Fix game crashing if client disconnects from replay during jump 2022-08-10 13:47:47 +02:00
Jonas Herzig
82d4408567 Add missing MC 1.19.1 .gitkeep file 2022-07-31 14:38:54 +02:00
Jonas Herzig
e8ff8a2066 Release 2.6.7 2022-07-31 13:46:49 +02:00
Jonas Herzig
ff98260216 Fix build on MC 1.8 2022-07-31 13:46:01 +02:00
Jonas Herzig
c34f75d95a Fix item staying visually equipped after being dropped (fixes #658) 2022-07-31 13:03:43 +02:00
Jonas Herzig
62b9cd0538 Use DefaultedList for equipment tracking
Because on 1.11+ a `null` item stack is not something that should exist.
This then also allows us to compare item stacks by value rather than only by
reference, potentially saving a few redundant entity equipment update
packets (but more importantly, also allows us to store a copy instead of the
original, which will be important for the next commit).
2022-07-31 13:03:43 +02:00
Jonas Herzig
42d04d123c Deduplicate code 2022-07-31 12:55:54 +02:00
Jonas Herzig
7550e3dcb7 Fix race conditions in movement packet filtering (fixes #760)
We cannot filter this packet purely on the netty thread because our filter
depends on the current camera position (if it's too far, we do want to teleport
it closer) and accessing the camera is only safe from the main thread.

Previously the second part had not been considered which could lead to race
conditions where the camera may not yet exist on the netty thread at time of
handling. These appear to have gotten the wholly inappropriate "just put a null
check around it" treatment, but that means that the filter sometimes doesn't
work (hence the bug report).

This commit changes handling such that all access to `allowMovement` is always
done on the main thread and then moves the filtering there as well. And
therefore filtering should now work properly.
2022-07-31 12:55:54 +02:00
Jonas Herzig
af3f6ddbe2 Always handle PlayerPositionLookS2CPacket manually 2022-07-31 12:48:39 +02:00
Jonas Herzig
962f08718f Fix "Show Chat" setting on 1.19+ (fixes #757) 2022-07-31 10:38:14 +02:00
Jonas Herzig
a9401a9779 Update ModMenu 2022-07-31 10:38:07 +02:00
Jonas Herzig
400ec6bda5 Port to MC 1.19.1 2022-07-31 10:37:22 +02:00
Jonas Herzig
bdea84b9a2 Remove unused GuiMainMenuAccessor 2022-07-31 10:22:20 +02:00
Jonas Herzig
6db47ee070 Updated broken forge docs link 2022-07-31 10:22:11 +02:00
Jonas Herzig
a95edaa31d Update translations 2022-07-31 09:30:19 +02:00
Kepler-17c
89d771fdbf Updated the compatibility section on shaders 2022-07-17 23:10:24 +02:00
bela333
f0299fed66 Update documentation to include compatible Sodium 2022-07-17 23:06:17 +02:00
bela333
05387b0ac7 Modified FREX notice 2022-07-17 23:05:27 +02:00
Jonas Herzig
738320e896 Update translations 2022-07-17 23:03:44 +02:00
Jonas Herzig
6e3d30e41b Fix thread unsafety in OpenGlToBitmapProcessor
Sharing the temporary `row` and `rowSwap` buffers between different calls to the
processor is not safe because it will be used by multiple threads.
As a result some of the rows in the image could randomly get corrupted.

This commit gets rid of the cached buffers (the value of which questionable
anyway) and simply re-uses the same code which other processors use.
2022-07-17 17:08:03 +02:00
Jonas Herzig
633ac10d89 Fix main hand in first person spectator view (fixes #731) 2022-07-17 17:08:03 +02:00
Jonas Herzig
42aef017c1 Fix skin in Player Overview and first person on 1.8.9 (fixes #749)
No clue why `getResourceLocationForPlayerUUID` was implemented the way it was,
that commit dates back to 2015 (332c36a), but if the skin isn't loaded yet, it
won't load it, so sometimes it just won't show properly in first person and in
the Player Overview.
This commit just calls `AbstractClientPlayer.getSkinTexture` instead.

Unclear which MC versions are affected. At some point before 1.16.4 something
else was introduced which loads the skin for us, hence why modern versions were
not affected.
2022-07-17 16:02:41 +02:00
Jonas Herzig
3526ec526c Release 2.6.6 2022-06-26 14:49:13 +02:00
Jonas Herzig
7457f9c13b Increase maximum camera speed by about an order of magnitude 2022-06-26 13:54:52 +02:00
Jonas Herzig
08c86ce574 Enable compression for OpenEXR if we have the cpu power for it 2022-06-26 13:33:13 +02:00
Jonas Herzig
517591d72a Encode OpenEXR and PNG frames in parallel 2022-06-26 13:32:58 +02:00
Jonas Herzig
a3f4049322 Reduces minimum speed of classic camera controller
Two blocks per second is still quite fast, so this commit reduces the minimum to
a tenth of that, allowing for much finer control.
2022-06-26 12:30:23 +02:00
Jonas Herzig
4f9a730b6d Fix classic camera speed changing way too quickly (fixes #719)
On my system, a single scroll tick results in 120 calls, which is fine for the
vanilla camera controller because it has a range of 2000, but the classic
controller only has a range of 36, making it impossible to select anything but
the extremes.
This commit changes the size of the range to match that of the vanilla controller.
2022-06-26 12:28:07 +02:00
Jonas Herzig
40f07279cf Load tinyexr in its own class loader
That way we can simply use whatever version we want and aren't tied to the
version of lwjgl which MC provides.

This fixes the OpenEXR export on 1.19 crashing either due to the windows
workaround or due to differing lwjgl versions (depending on OS).
And also enables OpenEXR export on MC versions using lwjgl2 (1.12.2 and below).
2022-06-26 11:57:24 +02:00
Jonas Herzig
814d0b7c17 Update ReplayStudio
Fixes fatal QuickMode error introduced with the 1.19 update.
2022-06-15 14:18:23 +02:00
Jonas Herzig
13ac8dcf0a Record raw packets instead of re-encoding decoded packets
Until now, recording worked by injecting right before the vanilla packet
handler. At that point it was receiving packet classes and had to re-encode them
to store them in the replay file. However, not all decoded packets can
necessarily be re-encoded without errors, requiring us to have a bunch of
workarounds.

This commit changes the way recording works by injecting right before the
decoder. It therefore receives the raw bytebufs and no longer has to deal with
the re-encode issue.
2022-06-15 14:18:23 +02:00
Jonas Herzig
df11ba2e36 Port to MC 1.19 2022-06-12 13:47:41 +02:00
Jonas Herzig
9ce25f711f Port to MC 1.19-pre3 2022-05-27 10:05:50 +02:00
Jonas Herzig
9f8957f468 Migrate away from deprecated fabric-api modules 2022-05-26 08:19:34 +02:00
Jonas Herzig
f595d9ca23 Release 2.6.5 2022-05-01 21:25:21 +02:00
Jonas Herzig
716df74893 Fix first person (cross)bow model animation on 1.9+ (fixes #708) 2022-05-01 21:06:24 +02:00
Jonas Herzig
4364347a19 Update ReplayStudio
6fc8e20 Fix incorrect relative packet order in squash filter (fixes #718)
2022-05-01 20:34:26 +02:00
Jonas Herzig
8b2d42f801 Fix broken fog when using Chroma Key with Sodium (fixes #726) 2022-05-01 20:05:00 +02:00
Jonas Herzig
f2c96174bc Fix terrain culling not being updated for omnidirectional rendering
Terrain culling is only updated when the camera position or rotation changes.
For omnidirectional rendering, we don't change the camera directly though, we
rotate way earlier so we can consistently get before any other effects. As a
result, the terrain frustum culling wasn't updated between render passes
resulting in missing terrain.
This was largely masked by the fact that we used to call GameRenderer.onResize
every pass (even when the size hadn't changed) but fixing that made this issue
become apparent.
2022-04-17 12:01:40 +02:00
Jonas Herzig
497b8440ca Call Window.onFramebufferSizeChanged to resize (fixes #705)
Instead of setting the the values via accessor and calling the handler directly.
This allows mods like ResolutionControl+ to properly resize its internal
framebuffers as well.
2022-04-17 12:01:40 +02:00
Jonas Herzig
5be57681af Completely bypass Minecraft when window is resized during rendering
Should fix issues where resizing affects the render result.
2022-04-17 12:01:40 +02:00
Jonas Herzig
fd9be55f79 Remove caching of ScaledResolution from Window shim
It'll become stale if the code holds on to the Window shim object for a longer
duration, and there's no reliable mechanism to invalidate it.
2022-04-17 12:01:40 +02:00
Jonas Herzig
4558793030 Remove unless window size tracking
The only thing we care about is the framebuffer size, cause that will differ
between game and progress gui rendering. The window size will be the same (real)
size for both.
2022-04-17 12:01:40 +02:00
Jonas Herzig
fb36fc2ba8 Fix render progress framebuffer never being deleted 2022-04-10 18:20:26 +02:00
Jonas Herzig
01d37ab2cb Split gui window/framebuffer management code from VideoRenderer 2022-04-10 18:20:16 +02:00
Jonas Herzig
a6c09bcb8a Fix crash when window is minimized on Windows 2022-04-10 15:33:42 +02:00
Jonas Herzig
fb38a20465 Fix path separator in replay name
Would probably have been caught by the write check as well, except in the
specific case where the folder exists, e.g. `../`
2022-04-10 13:52:14 +02:00
Jonas Herzig
d6c6220bdd Fix invalid characters in replay name on Windows (fixes #715) 2022-04-10 13:48:47 +02:00
Jonas Herzig
463b947c2b Suppress fabric-screen-handler-api during playback (fixes #713) 2022-04-10 13:36:50 +02:00
Jonas Herzig
8e140e8d01 Release 2.6.4 2022-03-09 07:09:00 +01:00
Jonas Herzig
c010a437fc Orient camera for ODS in game instead of in vertex shader
This makes it work more like regular 360 mode and is generally more compatible
because it doesn't require the frustum culling workarounds which the GPU
solution needs.
In particular, this fixes frustum culling with newer sodium versions (which no
longer use the vanilla intersection checking method) and fixes the clouds on
modern Iris (which seems to be using a different shader program for clouds).
2022-03-09 07:08:02 +01:00
Jonas Herzig
f2425a693a DRY (Iris)ODSFrameCapturer 2022-03-09 07:08:02 +01:00
Jonas Herzig
9df2035ca9 Update translations 2022-03-09 07:08:02 +01:00
Jonas Herzig
4aa667fe04 Port to MC 1.18.2 (closes #697) 2022-03-09 07:08:02 +01:00
Jonas Herzig
1fa027f362 Enable Quick Mode for 1.8.x 2022-03-06 13:39:49 +01:00
Jonas Herzig
74049dad77 Update ReplayStudio
9c5dec8 Fix writing of empty chunk load packet on 1.8.x (fixes #636)
3d8573f Fix writing of respawn packet on 1.8.x
39a85f7 Fix exception when cache file has invalid gzip header (fixes #535)
2022-03-06 13:39:49 +01:00
Jonas Herzig
c146aa145c Fix stereoscopic eye offset on 1.16+
The mapping between intermediary name on 1.15.2 and yarn on 1.16.1 has already
been added in the previous commit.
2022-03-06 13:39:49 +01:00
Jonas Herzig
ee6b53b247 Fix incorrect FOV and aspect during 360 render on 1.16+ 2022-03-06 13:39:49 +01:00
Jonas Herzig
1efb17e144 Fix ODS rendering on Iris 1.1.3+ (fixes #693) 2022-03-06 13:39:49 +01:00
Jonas Herzig
8573a9b208 Prevent jumping while path is playing (closes #694) 2022-03-06 13:39:49 +01:00
Jonas Herzig
0356fef61d Fix crash when receiving resource pack on 1.8-1.12.2 (fixes #86) 2022-03-06 13:39:49 +01:00
Jonas Herzig
f9c58a1165 Try raw file name before percent encoding it (closes #536) 2022-03-06 13:39:49 +01:00
Jonas Herzig
d178c0980e Log when replays are opened (closes #565) 2022-03-06 13:39:49 +01:00
Jonas Herzig
b8cf7e6df4 Fix scrolling while replay paused on 1.12.2 and below (fixes #590) 2022-03-06 13:39:49 +01:00
Jonas Herzig
2e34a2abd9 Fix render timer breaking when system time changes (fixes #633)
Unlike `currentTimeMillis`, `nanoTime` is guaranteed to be relative to a
fixed point in time, regardless of system or wall-clock time.
2022-03-06 13:39:49 +01:00
Jonas Herzig
e26480f041 Fix "Please wait" when jumping not being centered (fixes #646) 2022-03-06 13:39:49 +01:00
Jonas Herzig
a8d05a2bca Skip mod compat warning screen when in render queue (fixes #653) 2022-03-06 13:39:49 +01:00
Jonas Herzig
7615499cef Add option to preserve alpha channel in export (closes #661)
Default off cause it being on by default had confused quite a few people.
2022-03-06 13:39:49 +01:00
Jochem
d9da2e135c Sync world border animation & movement to Replay speed
Fixes an issue where the world border would move at normal speed when speeding up or slowing down the replay, and also at an incorrect speed when rendering the replay, causing it to get out of sync with the rest of the world.

Co-authored-by: Jonas Herzig <me@johni0702.de>
2022-03-06 13:39:49 +01:00
Jonas Herzig
fe67d7fa14 Link to our docs in the "Missing ffmpeg" screen (closes #663) 2022-03-06 13:39:49 +01:00
Jonas Herzig
fb7900d805 Fix missing hand with Iris 1.1.3 and above (fixes #638) 2022-03-06 13:39:49 +01:00
Jonas Herzig
4a5df2ad6d Use GameRenderer.renderHand boolean field instead of mixin
Should be more compatible with mods which replace the entire renderHand
method (thereby making our mixin non-applicable), at least as long as these mods
check `renderHand` as well (Iris explicitly does).

This will become important once #638 is fixed.
2022-03-06 13:39:10 +01:00
Jonas Herzig
6cc370a117 Workaround Java breaking with symlinks (fixes #660) 2022-03-05 17:21:38 +01:00
Jonas Herzig
abfb3d46f3 Use per-version folder for pack.mcmeta
Comments are not supported here, and depending on the exact environment, that
may break stuff (seems to only happen on fabric in dev).
2022-03-05 17:21:38 +01:00
Jonas Herzig
0b8a2a107c Use separate thread to send packets, even in sync mode (fixes #674) 2022-03-05 17:21:38 +01:00
Andrew S
7e9a1e7c13 Fix Render GUI on Retina Screens (fixes #338)
window.getFramebufferWidth/Height() should be used instead of window.getWidth/Height()

Co-authored-by: Jonas Herzig <me@johni0702.de>
2022-02-27 11:14:57 +01:00
Jonas Herzig
e378ae8f93 Fix entities disappearing on 1.16.1 and 1.15.2 client (fixes #657) 2022-02-27 10:57:49 +01:00
Jonas Herzig
9528a5761c Update old ModMenu versions
To use the new maven group and for compatibility with newer fabric-loader.
2022-02-27 10:54:19 +01:00
Jonas Herzig
39ccea931d Release 2.6.3 2021-12-11 11:19:41 +01:00
Jonas Herzig
841c99148e Fix initial entity rotation getting lost (fixes #619)
This fixes the rotation of already existing entities that just got sent to the
client. Those get spawned with their rotation, which we didn't capture. This
commit fixes that by initializing our tracked rotation to NaN and returning the
original rotation until the tracked one is initialized (we do it this way rather
than initializing during the spawn packet handling because there are many spawn
packets, especially with modded, and we cannot possibly inject into all of
them).
This does not fix the rotation of newly placed entities (cause they seem to get
spawned with 0/0 and then get teleported to their correct rotation). The
previous commit fixed that case by capturing the rotation from the teleport
packet.
2021-12-11 11:00:57 +01:00
Jonas Herzig
e472713d1c Fix rotation from entity teleport getting lost (related to #619)
This fixes the rotation of newly placed entities (cause they seem to get spawned
with 0/0 and then get teleported to their correct rotation, which we didn't
capture).
This does not fix the rotation of already existing entities that just got sent
to the client, those already get spawned with their rotation, which we don't yet
capture. The following commit fixes that.
2021-12-11 10:52:30 +01:00
Jonas Herzig
1d76427a4d Release 2.6.2 2021-12-10 11:52:58 +01:00
Jonas Herzig
f943d11661 Bump to MC 1.18.1 2021-12-10 11:51:25 +01:00
Jonas Herzig
2df9049e6b Fix error when loading old replay on Java 9+ (fixes #578)
By updating the shadow plugin used in ReplayStudio.

java.lang.IncompatibleClassChangeError: Inconsistent constant pool data in classfile for class com/replaymod/replaystudio/lib/viaversion/libs/kyori/adventure/text/Component. Method 'boolean lambda$static$0(com.replaymod.replaystudio.lib.viaversion.libs.kyori.adventure.text.Component, com.replaymod.replaystudio.lib.viaversion.libs.kyori.adventure.text.Component)' at index 1064 is CONSTANT_MethodRef and should be CONSTANT_InterfaceMethodRef
2021-12-08 17:30:36 +01:00
Jonas Herzig
ad62e51ab3 Fix lighting when block is placed in same frame as chunk load 2021-12-08 16:22:06 +01:00
Jonas Herzig
59ac665c81 Disable auto-sync if there is no stable position (closes #488)
Cause not doing anything is better than flickering between different parts of
the timeline every frame.
2021-12-08 16:04:47 +01:00
Jonas Herzig
f4196748f5 Fix recording controls on menu-less pause screen (fixes #575) 2021-12-08 16:04:47 +01:00
Jonas Herzig
3d9d40656e Fix recording of riptide animation (fixes #581)
This code supposedly meant for recording when a player was eating/blocking was
never needed to begin with cause the server echos all data in DataTracker
anyway, and now it broke the riptide animation because that's part of the
living flags as well but wasn't considered here, i.e. unconditionally
overwritten.
2021-12-08 16:04:47 +01:00
Jonas Herzig
bd68a80152 Fix chroma key rendering for 1.12.2 and below (fixes #589)
Forge naming strikes again, there's two different `updateCameraAndRender` in
1.14.4 forge, which lead us to use `updateCameraAndRender` for the older version
as well even though our desired method had a different name back then.
2021-12-08 16:04:47 +01:00
Jonas Herzig
96f7b78a38 Fix spectator hand jittering in 1.12.2 and below 2021-12-08 16:04:47 +01:00
Jonas Herzig
1b18b5c952 Fix spectator hand jumping when rotating across 0 yaw boundary, take 2
The `yaw` value of non-client-players is constraint to [0; 360), so when that
boundary is crossed, the `renderYaw` starts interpolating to its goal the
incorrect way round (instead of crossing the 360 boundary as well).

To fix that, we now add the difference between the current `renderYaw` and the
desired one, modulo 360 (but with range (-180; 180]), to the current
`renderYaw`. That way we always take the short way round.
Additionally, because for rendering MC looks at the difference without modulo,
afterwards (and when a new `yaw` is set) we wrap the result around such that the
actual difference is always less than 180 and therefore rendered as intended.
2021-12-08 16:04:47 +01:00
Jonas Herzig
51aa07e01e Revert "Fix spectator hand jumping when rotating across 0 yaw boundary" (fixes #601)
This reverts commit 411eaa4ca8.

The given solution does not work in old versions because those did not use
`getYaw` for hand rendering. Even worse, their headYaw does wrap around and it
does it in a different way than their yaw value, giving a worse result than
without this commit.
2021-12-08 16:04:47 +01:00
Jonas Herzig
29ef38213f Fix vanilla entity update packet handling (fixes #607) 2021-12-08 16:04:47 +01:00
Jonas Herzig
b10b4fd25a Fix crash when render queue is not saved properly (fixes #617) 2021-12-07 13:35:36 +01:00
Jonas Herzig
9fa5adf395 Bump to MC 1.18 2021-12-07 13:35:36 +01:00
Jonas Herzig
d6cd917d9d Fix passengers getting stuck in unloaded chunks (fixes #606)
We need to update the vehicle before its passengers.
2021-12-07 13:35:36 +01:00
Jonas Herzig
88a23222b6 Fix vanilla 1.18 bug causing entities to get stuck outside sim range
MC uses the client-side position of an entity to determine whether it is inside
the simulation range and therefore whether it will get ticked. For some (most)
entities it interpolates the client-side position to match the server-side one
inside of the tick method... no prices for guessing where this goes wrong.

Somewhat similar to the issue we have with chunk unloads which we work around in
FullReplaySender but worse cause they'll get stuck if they ever leave the sim
range even for a single tick, rather then just when their chunk is unloaded.
2021-12-07 13:35:36 +01:00
Jonas Herzig
ff5c0f594e Fix chunks missing on first frame when rendering without Sodium 2021-12-07 13:35:36 +01:00
Jonas Herzig
58ba590c84 Fix replay being restarted when resuming path playback 2021-12-07 13:35:36 +01:00
Jonas Herzig
549996b270 Fix underwater visibility (fixes #572)
Used to always be super short because that method returns 0 when `isSubmergedIn`
returns false.
2021-12-07 13:35:31 +01:00
Jonas Herzig
bd0dd10942 Ensure we cannot accidentally open a replay file twice
E.g. from the Replay Viewer while it is still being recovered.
Because that would potentially corrupt it.
2021-11-29 17:42:44 +01:00
Jonas Herzig
31817bcf11 Split replay folder and file management into their own classes 2021-11-29 17:42:44 +01:00
Jonas Herzig
ce5886a427 Port to MC 1.18-rc4 2021-11-29 17:42:44 +01:00
Jonas Herzig
b6f623efb8 Update Gradle to 7.3 2021-11-29 16:22:37 +01:00
Jonas Herzig
2ee8fe49c5 Update FG 2.1 to download MCP from Forge maven
Cause the MCP site is now offline.
2021-11-29 16:22:37 +01:00
Jonas Herzig
090778ca63 Fix build for 1.15.x and below 2021-11-29 16:22:37 +01:00
Jonas Herzig
dd055e5c5b Fix build for 1.8 2021-11-29 16:22:37 +01:00
Jonas Herzig
6e1febdab8 Port to MC 1.18-pre1 2021-11-14 17:27:35 +01:00
Jonas Herzig
d2f27e3918 Update Loom to 0.10 2021-11-14 16:09:37 +01:00
Jonas Herzig
55f3a15db6 Release 2.6.1 2021-08-21 15:32:42 +02:00
Jonas Herzig
33328adc9f Fix recording of 4-8 block teleports on 1.8.9 and below (fixes #525) 2021-08-21 15:11:55 +02:00
Jonas Herzig
5f9297b78e Improve lang resource pack injection point (closes #532)
Previously we injected it as a regular builtin resource pack (like the
Programmer Art pack) and hid it on the resource pack screen but this is bad for
several reasons. The most significant one being that it can be re-ordered and
makes the resource pack list ordering weird if you don't know that there is an
invisible pack there.
It also unnecessarily messes with other mods which make certain assumptions
about configurable resource packs (e.g. EBE, though in that case, it merely
triggers an existing bug in EBE).

We now instead inject it into the final resource pack list which gets
constructed from the configured packs, but never as a configurable pack itself.
2021-08-21 15:11:55 +02:00
Jonas Herzig
411eaa4ca8 Fix spectator hand jumping when rotating across 0 yaw boundary
The `yaw` value of non-client-players is constraint to [0; 360), so when that
boundary is crossed, the `renderYaw` starts interpolating to its goal the
incorrect way round (instead of crossing the 360 boundary as well).

Instead we now use the `headYaw` value, which does not wrap around and as such
does not have this issue.
2021-08-21 15:11:55 +02:00
Jonas Herzig
6428416bc4 Fix between-ticks position of hand when spectating (fixes #563) 2021-08-21 15:11:55 +02:00
Jonas Herzig
0e5de6c816 Update ReplayStudio
c9de2f5 Fix incorrect initial version for Combat* packets (fixes #568)
a22df13 Fix off-by-3 in quick mode chunk unloading code
2e2cac4 Guard against bad chunk light masks (fixes #557)
2021-08-21 15:11:41 +02:00
Jonas Herzig
0ceb95a5e2 Abort path preview when opening render screen (fixes #524) 2021-08-21 15:11:41 +02:00
Jonas Herzig
de3f4dab7e Pause path playback while resource pack is loading (closes #540) 2021-08-21 15:11:41 +02:00
Jonas Herzig
612a90681e Reset camera inventory when no longer spectating (fixes #546) 2021-08-21 15:11:29 +02:00
Jonas Herzig
88dece679d Fix scissor state not including scissor bounds (fixes #556)
This caused the bounds to not be relaxed after e.g. lists and as such the scroll
bar and shadows would not render properly.
2021-08-15 17:25:23 +02:00
Jonas Herzig
82c7da8739 Fix advanced screenshot GUI not opening on 1.17.1 (fixes #559) 2021-08-15 16:53:12 +02:00
Jonas Herzig
b243dfc625 Workaround soft-lock when REI screen is closed (fixes #560) 2021-08-15 16:41:50 +02:00
Jonas Herzig
27f365a60a Change skin-caching feature to be fail-safe (fixes #561) 2021-08-15 13:53:31 +02:00
Jonas Herzig
463c51be85 Convert getDefaultRenderSettings into default constructor
Allows us to completely get rid of the custom Gson instance and is more
idiomatic anyway.
2021-08-15 11:45:23 +02:00
Jonas Herzig
9626a4c442 Fix parsing of render queue with chroma key (fixes #564)
By simply replacing the private field with a concrete type, so we do not need to
manually register one when constructing the gson instance (which is evidently
too easy to forget about).
2021-08-15 11:39:10 +02:00
Jonas Herzig
3db8c28505 Fix .no_recover files never being cleaned up (fixes #497) 2021-08-15 11:28:11 +02:00
Jonas Herzig
110199044f Fix nametags not rendering in screenhots (fixes #498)
No clue why this extra hud hiding was even there in the first place, the
renderer already takes care of properly hiding the hud (without hiding the
nametags) as it does for videos as well.
2021-08-15 11:19:52 +02:00
Jonas Herzig
4a587eed74 Workaround crash with REI and MainMenuScale (fixes #501, fixes #473) 2021-08-15 11:07:19 +02:00
Jonas Herzig
e2b0422965 Fix timeline not saving when completely overwritten (fixes #505)
Either when it is cleared or when it is loaded from the keyframe repository, if
you exit the replay without any further changes, this used to not be saved.
2021-08-15 10:47:34 +02:00
Jonas Herzig
a793cbee0d Remove RM 2.6+ for MC 1.7.10 from versions.json 2021-08-01 16:59:51 +02:00
Jonas Herzig
f95a943589 Release 2.6.0 2021-07-31 16:01:48 +02:00
Jonas Herzig
c88b4c1e76 Add missing .gitkeep files 2021-07-31 16:01:11 +02:00
Jonas Herzig
a457bccf12 Fix Java 9+ ABI being used for Java 8 versions 2021-07-31 15:31:43 +02:00
Jonas Herzig
3cba99068e Increase default bitrate to from 10 to 20mbps 2021-07-31 14:37:10 +02:00
Jonas Herzig
e9bf75b4d6 Remove ModCore
That was never actually finished and we do not need to keep it around anymore.
Whether we add its successor once that is ready for production use remains to be
seen.
2021-07-24 19:15:08 +02:00
Jonas Herzig
5bede327f3 Update jGui (fixes textures with Sodium) 2021-07-24 17:09:16 +02:00
Jonas Herzig
0cb14a9106 Re-introduce entity-in-wrong-chunk-at-unload workaround (fixes #548)
Nope, this was not fixed, they just changed where the chunkCoords are stored but
the interpolation issue remains.
2021-07-24 17:06:46 +02:00
Jonas Herzig
35fef5176d Fix skins of server-only NPCs being unreliable (fixes #486) 2021-07-24 14:43:38 +02:00
Jonas Herzig
3ef355a267 Failure to hide cache folder should never be fatal (closes #512) 2021-07-24 13:17:14 +02:00
Jonas Herzig
4090e7b540 Search for homebrew in /opt as well (fixes #496) 2021-07-24 13:14:23 +02:00
Jonas Herzig
2891c4e8fa Remove MP4 Default Quality preset (closes #475)
Similar to High Quality, it is too unpredictable, sometimes giving bad quality
and sometimes being unbearably slow. We should just encourage everyone to set
their bitrate manually.
2021-07-24 12:59:06 +02:00
Jonas Herzig
83cb459957 Fix keyframes being required to open render queue window
Half the reason we swapped the render queue / settings parent relationship was
so we don't need to go through the settings screen to access the queue. But for
some reason I stopped half way through and didn't also move the "You need at
last two keyframes." popup. This commit rectifies that.
2021-07-24 12:46:13 +02:00
Jonas Herzig
3f4dae05db Fix missing preprocessor comments 2021-07-24 11:30:34 +02:00
Jonas Herzig
2f4360a2a1 Fix Mixin_PreserveDepthDuringGuiRendering for 1.14-16 2021-07-24 11:29:27 +02:00
Jonas Herzig
2415a886e2 Update to 1.17.1 2021-07-24 11:05:39 +02:00
Jonas Herzig
927db36baa Use same fabric-loader version across all MC versions 2021-07-24 11:05:00 +02:00
Jonas Herzig
d0620091d2 Add support for FREX Flawless Frames API (fixes #150) 2021-07-24 09:11:34 +02:00
Jonas Herzig
96bb1abc1d Update ReplayStudio
0e72e36 Add workaround for lack of way to determine global palette size
872bc75 Update vanilla global palette size
19d3dab Fix OOB when converting local palette storage to global palette (fixes #509)
c93a370 Fix incorrect packet release during SquashFilter.flush (fixes #490, fixes #492)
2021-07-01 14:05:52 +02:00
Jonas Herzig
7a52a29ef3 Fix race condition in resource pack recording (fixes #521)
If the server sends the resource pack right on connect (rather than when
switching to a sub-server), then `mc.getNetworkHandler()` will be null.
2021-07-01 14:05:52 +02:00
Jonas Herzig
7ab2edd738 Implement ODS rendering via Iris Shader for MC 1.17 2021-07-01 14:05:52 +02:00
Jonas Herzig
f462a5b391 Fix 1.12 shim Window.getScaledHeight 2021-07-01 14:05:52 +02:00
Jonas Herzig
e85618a27c Change frame time (used by Iris) to be based on replay or video time
Iris derives that one from the frameStartNanos argument passed to the render
method and shaders usually use it to do animations. Prior to this commit we
always pass 0 which effectively froze any shader animations.

With this commit, we now compute the frameStartNanos based on the
FPS of the video we are rendering (so animations will happen in real time when
watching the video) or based on the time in the replay (so animations will
be influenced by playback speed / be frozen if the replay is frozen).
We default to the video time based approach because the replay time one may
produce undesirable results when it comes to things like motion blur and TAA.
2021-07-01 14:05:52 +02:00
Jonas Herzig
3f2456ba65 Use GameRenderer.render instead of renderWorld, improves compat
In particular, Iris updates its frame counter and timer in the outer method, so
if we only call the inner one, then its shadows and sky will not update
properly.
Since the render method also renders the GUI, we set the current screen to null
and cancel the HUD during rendering. MC also clears the depth before rendering
the HUD, which we don't want because it breaks the depth map export, so we
cancel that as well.

This also allows Vanilla post-processing (aka Super Secret Settings, aka Vanilla
Shaders) as well as entity outlines to function properly cause those are applied
in that method as well.
Should have done this a long time ago but better late than never.

Closes #321
2021-07-01 14:05:52 +02:00
Jonas Herzig
ed99e240ec Bundle missing transitive fabric-api dependency 2021-06-28 19:06:26 +02:00
Jonas Herzig
0fcb27c6b2 Fix keyPressed/keyReleased injection targets 2021-06-28 19:06:26 +02:00
Jonas Herzig
5289026313 Bump MC to 1.17 proper 2021-06-28 19:06:26 +02:00
Jonas Herzig
2be47e9810 Change ReplayButton icon to be white with shadow for better contrast
The previous one, blue with no shadow, had horrible contrast with the button
background and did not fit well with any of the other buttons.
Now it does (except that it's not yet in the 20-pixel width/height style).
2021-06-28 19:06:26 +02:00
Jonas Herzig
1af4add932 Update ReplayStudio
- MC 1.17
- Updated ViaVersion
- Quick Mode supports multiple worlds now (and no longer needs a manual Respawn)
2021-06-28 19:06:26 +02:00
Jonas Herzig
8d3d705fed Switch to commons-lang Pair instead of the ViaVersion one
Cause that one will be removed in a future version, and the lang one is just
fine.
2021-06-28 14:35:57 +02:00
Jonas Herzig
766d3346ee Pin FG5 version because its maintainers cannot be trusted
Versions after 5.0.5 emit tsrg2 instead of tsrg, breaking anything which reads
those files (e.g. Mixin and the preprocessor), later versions even bump the
required Gradle version.
2021-06-27 14:44:16 +02:00
Jonas Herzig
08165252d5 Switch to new Quick Mode backend 2021-06-06 10:42:16 +02:00
Jonas Herzig
1802b1a7d0 Port to 1.17-pre1 2021-06-06 10:42:16 +02:00
Jonas Herzig
5f2dca08d1 Fix "Cannot register receiver while client is not logging in!"
Since MC provides no reliable way to get the connection while still in the login
phase, Fabric API tries to determine it either from MinecraftClient's connection
field (for the integrated server) or from the ConnectScreen (for multiplayer).
However, neither is present during a replay, leading to the aforementioned
error.

To fix this, we store our ClientConnection in MinecraftClient's connection
field. This should have no significant effect on vanilla behavior.

Also remove the dead Forge 1.14 code which was in the same place.
2021-06-05 23:01:16 +02:00
Jonas Herzig
25a6cdc502 Fix RenderSettings (de)serialization with Java 16 (fixes #520)
Turns out we were relying on the implementation detail of the File class, and
Java 16 ensures we cannot do that.
2021-06-05 23:01:16 +02:00
Jonas Herzig
9d3583293b Bundle Gson on 1.11.2 and below (fixes #421)
Decided to go with 1.11.2 because the Gson from that version is the first to not
have the JsonAdapter annotiation, which we want for fixing #520.
2021-06-05 23:01:16 +02:00
Jonas Herzig
e380907334 Switch preprocessor config to flat style 2021-06-05 23:01:16 +02:00
Jonas Herzig
4cdbfb7c46 Update Gradle to 7.0.2 2021-06-05 23:01:16 +02:00
Jonas Herzig
59fb58c6fc Disable 1.7.10 for now
Continued support would require porting FG1.2 to Gradle 7 / Java 16.
2021-06-05 22:57:46 +02:00
Jonas Herzig
f5af283492 Update for new forge maven repo 2021-04-22 14:09:58 +02:00
Jonas Herzig
3440b8d8a8 Update loom to 0.6 2021-03-14 12:13:06 +01:00
Jonas Herzig
537795f9ca Backport contextual key bindings to 1.12.2 and below (closes #478) 2021-03-14 12:12:53 +01:00
Jonas Herzig
dda6bd41b6 Implement ffmpeg-independent PNGWriter (closes #476)
Creates a dedicated folder for each video and does not depend on ffmpeg, just
like the EXRWriter (but supporting all MC versions).

Also does 32 bit depth export by chunking the 32-bit float into the 8-bit BGRA
component channels.
2021-03-14 12:12:53 +01:00
Jonas Herzig
8ff27437af Add configurable, small Replay Viewer button (closes #471) 2021-03-14 12:12:53 +01:00
Jonas Herzig
c6b41d76fa Document valid values for MultipleChoiceSettings in config file 2021-03-14 12:12:53 +01:00
Jonas Herzig
4ca4f2def6 Auto-reload config file on changes (Fabric only) 2021-03-14 12:12:53 +01:00
Jonas Herzig
61d67a5e80 Remove OpenEye (closes #465)
It is not available for Fabric and we stopped using it.
2021-03-14 12:12:53 +01:00
Jonas Herzig
b7309283e9 Rename MixinRendererLivingEntity -> Mixin_HideNameTags_LivingEntity 2021-03-14 12:12:53 +01:00
Jonas Herzig
a97190de1e Move MixinRendererLivingEntity into 1.8.9 project 2021-03-14 12:12:53 +01:00
Jonas Herzig
c17fc79ab2 Rename MixinRender -> Mixin_HideNameTags 2021-03-14 12:12:53 +01:00
Jonas Herzig
1924963d75 Move MixinOpenGlHelper into 1.7.10 project 2021-03-14 12:12:53 +01:00
Jonas Herzig
aba34d6c6f Rename Mixin_CubicRotation -> Mixin_Omnidirectional_Rotation 2021-03-14 12:12:53 +01:00
Jonas Herzig
db5708f338 Rename MixinFrustum -> Mixin_Omnidirectional_DisableFrustumCulling 2021-03-14 12:12:53 +01:00
Jonas Herzig
6974f8e60c Rename MixinCamera -> Mixin_StabilizeCamera 2021-03-14 12:12:53 +01:00
Jonas Herzig
3ec81d5c35 Split MixinEntityRenderer into multiple, more focused files 2021-03-14 12:12:53 +01:00
Jonas Herzig
fad89626e5 Move 1.7.10 code from MixinEntityRenderer to Mixin_ForceChunkLoading 2021-03-14 12:12:53 +01:00
Jonas Herzig
e7a1fafdf9 Extract Mixin_ChromaKeyDisableFog from other mixins 2021-03-14 12:12:53 +01:00
Jonas Herzig
cf1d7537e8 Move MixinEffectRenderer into 1.8.9 project 2021-03-14 12:12:53 +01:00
Jonas Herzig
10426f9d39 Move MixinChunkRenderWorker into 1.14.4 project 2021-03-14 12:12:53 +01:00
Jonas Herzig
2fb4f73ae4 Move ChunkRenderDispatcherAccessor into 1.14.4 project 2021-03-14 12:12:53 +01:00
Jonas Herzig
6289545d84 Remove forge/fml event bus from MCVer 2021-03-14 12:12:53 +01:00
Jonas Herzig
cfb9e15b8a Make use of new @Pattern feature to centralize version-aware code
That is, most of the business code should not be aware that it is being compiled
to multiple versions even when it heavily interacts with MC, preprocessor
statements should be an escape hatch, not the norm.
Similarly, code should not be forced to do `MCVer.getWindow(mc)` instead of the
much more intuitive `mc.getWindow()`, and a new preprocessor (technically remap)
feature makes this possible by defining "search and replace"-like patterns (but
smarter in that they are type-aware) in one or more central places (the
"Patterns.java" files) which then are applied all over the code base.

In a way, this is another step in the automatic back-porting process where
preprocessor statements are used when we cannot yet do something automatically.
Previously we "merely" automatically converted between different mapping, this
new feature now also allows us to automatically perform simple refactoring
tasks like changing field access to a getter+setter (e.g. `mc.getWindow()`), or
changing how a method is called (e.g. `BufferBuilder.begin`), or changing a
method call chain (e.g. `dispatcher.camera.getYaw()`), or most other
search-and-replace-like changes and any combination of those.
The only major limitation is that the replacement itself is not smart, so
arguments must be kept in same order (or be temporarily assigned to local
variables which then can be used in any order).
2021-03-14 12:12:51 +01:00
Jonas Herzig
06a46e6f38 Use callback-style events for crosshair and hotbar render events 2021-02-28 09:52:19 +01:00
Jonas Herzig
da16b0fb78 Add 1.14.4 <> 1.12.2 mapping for Option <> GameSettings.Options 2021-02-28 09:52:19 +01:00
Jonas Herzig
f34b88cf7e Move MixinShader into 1.7.10 project 2021-02-28 09:52:19 +01:00
Jonas Herzig
d7dde42add Move HideInvisibleEntities into 1.12.2 project 2021-02-28 09:52:19 +01:00
Jonas Herzig
5f652ec7f2 Move DisableBetterSprinting into 1.12.2 project 2021-02-28 09:52:19 +01:00
Jonas Herzig
05d7971332 Move mapwriter.MixinMinecraft into 1.12.2 project 2021-02-28 09:52:19 +01:00
Jonas Herzig
4eeaca5af1 Use MainWindowAccessor across all versions 2021-02-28 09:52:19 +01:00
Jonas Herzig
e4da7f331b DRY main MC window resizing 2021-02-28 09:52:19 +01:00
Jonas Herzig
3fbb4b50ea Rename ChunkLoadingRenderGlobal → ForceChunkLoadingHook
More descriptive, less MCP.
2021-02-28 09:52:19 +01:00
Jonas Herzig
ab5b101f96 Add stub ChunkLoadingRenderGlobal for 1.7.10
Allows us to get rid of all preprocessor guards around its usages.
2021-02-28 09:52:19 +01:00
Jonas Herzig
c729654f04 Split off 1.14.4 overwrite from ChunkLoadingRenderGlobal 2021-02-28 09:52:19 +01:00
Jonas Herzig
f19ee8ba63 Split off 1.14.4 overwrite from Mixin_ForceChunkLoading 2021-02-28 09:52:19 +01:00
Jonas Herzig
90bbc68443 Replace reflection in ChunkLoadingRenderGlobal with mixin 2021-02-28 09:52:19 +01:00
Jonas Herzig
4b4d18026b Move GLStateTracker into 1.7.10 project 2021-02-28 09:52:19 +01:00
Jonas Herzig
74580e6649 Remove redundant preprocessor statements 2021-02-28 09:52:19 +01:00
Jonas Herzig
87b55e187c Replace a few //#if statements with mapping file entries 2021-02-28 09:52:19 +01:00
Jonas Herzig
026bc1fdcb Move MixinWorldClient into 1.12.2 project 2021-02-28 09:52:19 +01:00
Jonas Herzig
470669b1f7 Move MixinRenderManager into 1.12.2 project 2021-02-23 01:21:44 +01:00
Jonas Herzig
b8bcb4967f Move MixinFMLClientHandler into 1.7.10 project 2021-02-23 01:05:48 +01:00
Jonas Herzig
6fa746a2e3 Move MixinEntityRenderer into 1.7.10 project 2021-02-23 01:01:55 +01:00
Jonas Herzig
01d47279fd Split off 1.12.2 overwrite from MixinCamera 2021-02-23 00:59:56 +01:00
Jonas Herzig
06db2ebb92 Move MixinS26PacketMapChunkBulk into 1.7.10 project 2021-02-23 00:47:01 +01:00
Jonas Herzig
6068aabea7 Move MixinPlayerControllerMP into 1.12.2 project 2021-02-23 00:45:12 +01:00
Jonas Herzig
6bc130312a Move MixinNetworkDispatcher into 1.12.2 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
ba7c478da1 Split off 1.12.2 overwrite from MixinNetHandlerLoginClient 2021-02-23 00:41:22 +01:00
Jonas Herzig
25247a2371 Move MixinGuiScreen into 1.7.10 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
22d1048999 Move FMLHandshakeFilter into 1.12.2 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
6094422792 Split off highly version-dependent code from ModCompat 2021-02-23 00:41:22 +01:00
Jonas Herzig
029b228b26 Move ReplayModTweaker into 1.12.2 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
9bde5fae49 Move ResourcePackRepositoryAccessor into 1.7.10 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
f15eaf95c1 Split off 1.12.2 overwrite from MixinKeyboardListener 2021-02-23 00:41:22 +01:00
Jonas Herzig
9e152f2655 Move GLStateTrackerTransformer into 1.7.10 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
1329f2d703 Move GLErrorTransformer into 1.7.10 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
66c1f63219 Move GuiFactory into 1.12.2 project 2021-02-23 00:41:22 +01:00
Jonas Herzig
633bc19650 Use callback-style events throughout all versions
Removes the need for //#if statements on each and every event handler.
Instead we now always use the equivalent Callback and have one central 1.12.2
class which forwards Forge events to the callbacks.
2021-02-23 00:41:22 +01:00
Jonas Herzig
0be2082fe7 Split off highly version dependent code from ReplayMod 2021-02-20 00:43:49 +01:00
Jonas Herzig
bc9d8cb3d1 Split off highly version dependent code from SettingsRegistry 2021-02-20 00:43:46 +01:00
Jonas Herzig
9a67a64555 Drop server-side restrictions implementation
I don't think this sees sufficient use to justify updating.
Especially because it's non-trivial with forge's network changes.
Ping me if you actually used this.
2021-02-20 00:43:46 +01:00
Jonas Herzig
1a35234b0a Move LoadingPlugin into 1.12.2 project 2021-02-19 23:02:39 +01:00
Jonas Herzig
9d81265213 Update preprocessor plugin 2021-02-19 23:01:43 +01:00
Jonas Herzig
bcde675775 Update jGui 2021-02-19 17:32:41 +01:00
Jonas Herzig
8c2d7d096c Merge branch 'stable' into develop 2021-02-19 11:58:28 +01:00
Jonas Herzig
ff47174fd6 Release 2.5.2 2021-02-17 21:56:30 +01:00
Jonas Herzig
c0a95d278e Add toString implementation to RenderSettings
We print them to the log in a few places, that's fairly useless without a
toString implementation.
2021-02-17 21:53:07 +01:00
Jonas Herzig
fed90b5597 Update ReplayStudio
a1f82a7 Properly handle same-dimension respawns in squash and quick mode (fixes #139, fixes #455)
7b84461 Fix NPE if there is a block change at time 0 (fixes #446)
ee9d7d5 Switch to LGPLv3+ as primary license
2021-02-17 18:20:48 +01:00
Jonas Herzig
51a4ade37e Fix slow drifting in FullReplaySender replay time (fixes #451) 2021-02-17 15:16:33 +01:00
Jonas Herzig
2f0160c4f6 Update loom to 0.5 (closes #453) 2021-02-17 11:39:57 +01:00
Jonas Herzig
56e5df65d5 Use vanilla sound engine to play render success sound (fixes #286) 2021-02-17 11:27:09 +01:00
Jonas Herzig
5f0218929b Process sub-selection of render jobs in displayed order (fixes #488) 2021-02-17 03:33:14 +01:00
Jonas Herzig
6d0d50f5b3 Fix "Render All" button in render queue (fixes #447) 2021-02-17 03:06:52 +01:00
Jonas Herzig
c54638db30 Update ReplayStudio (fixes #368)
e7d5bf5 Fix wrap around for LinearInterpolator
2021-02-17 02:57:10 +01:00
Jonas Herzig
cdb93a1716 Fix spectating via clicking on forge (fixes #432) 2021-02-17 02:55:49 +01:00
Jonas Herzig
02a731e018 Update jGui (fixes #429)
3596f15 Improve timeline time indicators for really long (1h+) timelines
2021-02-17 01:39:38 +01:00
Jonas Herzig
ae0b0e3f13 Allow any entity to be spectated on 1.8+ (fixes #382)
Idk why this was restricted in the first place, ask Marius: 163faddd
2021-02-17 01:19:29 +01:00
Jonas Herzig
a9a0c2ddc3 Update jGui (fixes #428)
e3cd741 Re-open GuiOverlay if externally closed while `!closeable`
5a90b8b Fix GuiOverlay.closeable not being respected on 1.14+
2021-02-17 01:19:29 +01:00
Jonas Herzig
72d5d43ad2 Suppress CancellationException when stopping camera path 2021-02-17 01:19:29 +01:00
Jonas Herzig
a5f874e571 Fix crash with certain render output file values (fixes #396) 2021-02-17 01:19:29 +01:00
Jonas Herzig
9dfdfd6fe3 Update bundled mixin version (fixes #438) 2021-02-17 01:19:29 +01:00
Jonas Herzig
d8cae487c2 Rename build scripts: build -> root and common -> build
This way it's easier for people not familiar with the preprocessor setup to find
what they are looking for.
2021-02-17 00:13:42 +01:00
Jonas Herzig
7e5734067f Remove jcenter repo, it will be shutting down
We have only been using it for the shadow plugin which is also available in the
plugins.gradle.org repo.
2021-02-17 00:13:42 +01:00
Daniel N. Werner
159f0e259f Update common.gradle
Stable and develop are returning 520 from CloudFlare, looks like they've switched the maven repository to use https.
2021-02-16 22:43:55 +01:00
Jonas Herzig
19ff1ef38b Do not bother recovering useless replays (fixes #444)
Useless replays being those for which auto-recording was disabled and Start
never pressed.
2021-02-16 22:38:39 +01:00
Jonas Herzig
57c7362e34 Merge branch 'stable' into develop 2020-11-22 17:10:27 +01:00
Jonas Herzig
dabb64340e Release 2.5.1 2020-11-22 16:19:28 +01:00
Jonas Herzig
99b1528dcc Update doRelease task for current branching model 2020-11-22 16:18:22 +01:00
Jonas Herzig
673964ea6a Hide Saving Replay popup when no output is produced (fixes #420)
I.e. if the had Auto-Recording disabled and never pressed start, there won't be
any replays and it would just be the Done button, which is pointless.
2020-11-22 16:04:14 +01:00
Jonas Herzig
c3c59ec1c0 Trim video file extension from glb file name (fixes #422) 2020-11-22 15:18:41 +01:00
Jonas Herzig
d06ef47f1c Update ReplayStudio (fixes #426) 2020-11-22 15:15:41 +01:00
Jonas Herzig
68ca92e8a2 Update changelog URL 2020-11-22 15:06:28 +01:00
Jonas Herzig
f7f20ee6cb Add setting to disable Saving Replay rename dialog (closes #423) 2020-11-22 15:03:24 +01:00
Jonas Herzig
f895a13b61 Apply Saving Replay dialog when pressing Enter (closes #424) 2020-11-22 14:55:07 +01:00
Jonas Herzig
4739d2278b Fix render settings not saving when rendering (fixes #425)
Clicking Cancel or Add to Queue does save them but clicking Render does not.

This is caused by the fact that the GuiRenderSettings are now a popup and no
longer their own screen, so to close them, we need to call its close method, not
close the entire screen.
2020-11-22 14:53:40 +01:00
Jonas Herzig
d4b7fdf949 Update remap (fixes #414)
Support remapping of mixin targets declared in static fields (specifically
`core.MixinKeyboardListener:ON_KEY_PRESSED`).

String literals in annotations can be specified in a static final field instead
of inline (so you can e.g. use the same literal in multiple places).
This commit adds support for remapping those external literals.
2020-11-22 14:31:03 +01:00
Jonas Herzig
ee02944391 Fix crash when rendering ODS without depth export (fixes #418) 2020-11-22 13:00:37 +01:00
Jonas Herzig
36276d32b6 Fix camera path export roll being inverted (fixes #427) 2020-11-22 09:14:51 +01:00
Jonas Herzig
6879729633 Fix OpenEXR export option throwing UnsatisfiedLinkError on Windows 2020-11-15 13:17:00 +01:00
Jonas Herzig
4a5d971be5 Release 2.5.0 2020-11-14 10:01:46 +01:00
Jonas Herzig
bcaf946f13 Move .gitkeep from 1.16.3 to 1.16.4 folder (fixup c620e2c) 2020-11-14 09:55:36 +01:00
Jonas Herzig
514c4fb30d Merge pull request #412 from LindaJuffermans/docs-201110-labymod370
LabyMod update 3.7.x has been tested with ReplayMod and works.
2020-11-10 13:35:55 +01:00
LindaJuffermans
6552fc68c0 LabyMod update 3.7.x has been tested with ReplayMod and works. 2020-11-10 09:32:32 +01:00
Jonas Herzig
0f67ba157e Merge pull request #408 from LindaJuffermans/docs-201107-direct-ffmpeg-link
Update ffmpeg link to the essential release ZIP file directly.
2020-11-08 10:15:42 +01:00
Jonas Herzig
1b4e68e4b2 Merge pull request #410 from LindaJuffermans/docs-201107-quickmode-194
Quick Mode is only available for MC 1.9.4 and up.
2020-11-08 10:13:24 +01:00
LindaJuffermans
f1e197b830 Quick Mode is only available for MC 1.9.4 and up. 2020-11-07 20:34:37 +01:00
Jonas Herzig
d3f1ce92b9 Merge pull request #407 from LindaJuffermans/docs-201107-resourceloader
Resource Loader is not compatible
2020-11-07 16:02:27 +01:00
LindaJuffermans
3cc2a90b64 Update ffmpeg link to the essential release ZIP file directly. 2020-11-07 15:55:09 +01:00
LindaJuffermans
28b2f87324 Resource Loader is not compatible 2020-11-07 15:49:59 +01:00
Jonas Herzig
ec862f0596 Update jGui 2020-11-07 13:18:10 +01:00
Jonas Herzig
6308b8a859 Add line between time keyframes and replay timeline (closes #351) 2020-11-06 18:54:55 +01:00
Jonas Herzig
3911ff4058 Fix crash when jumping to 00:00 (closes #227) 2020-11-06 18:54:55 +01:00
Jonas Herzig
c620e2cf9e Update to MC 1.16.4 (closes #406) 2020-11-06 18:54:55 +01:00
Jonas Herzig
4bff201307 Show warning if first keyframe is not placed at 00:00 (closes #352) 2020-11-06 18:54:55 +01:00
Jonas Herzig
577e59fd41 Add undo/redo to keyframe timeline (closes #305) 2020-11-06 18:54:55 +01:00
Jonas Herzig
28facc430e Allow raw key handlers to cancel keybindings (required for #305)
So that when you press e.g. Ctrl+Z, it doesn't trigger the keybinding bound to
Z (currently full brightness).
2020-11-06 18:54:54 +01:00
Jonas Herzig
ccb08d37a7 Store server name (in addition to address) in replays (closes #324) 2020-11-06 18:54:54 +01:00
Jonas Herzig
6e6af1dcbb Allow keyframe timeline cursor sync to be toggled (closes #290) 2020-11-06 18:54:54 +01:00
Jonas Herzig
214100840e Auto-scroll keyframe timeline to cursor where possible (closes #291) 2020-11-06 18:54:54 +01:00
Jonas Herzig
e7eef08512 When tabbing into text field, select all its text (closes #211) 2020-11-06 18:54:54 +01:00
Jonas Herzig
fa8266f71c Fix sync not working when triggered via hotkey buttons (fixes #399) 2020-11-06 18:54:54 +01:00
Jonas Herzig
dd5935649d Do not rely on error handling popup for sodium info (fixes #392)
Instead we now disable all the Render buttons and give them a tooltip. Much more
user-friendly.
2020-11-06 18:54:54 +01:00
Jonas Herzig
76bec31cd8 Move cache folders into central (hidden) location (closes #343) 2020-11-06 18:54:54 +01:00
Jonas Herzig
3ce10d4855 Get rid of thumb magic (closes #237) 2020-11-06 18:54:54 +01:00
Jonas Herzig
4402650971 Split hotkey button text over two lines if necessary (fixes #353) 2020-11-06 18:54:53 +01:00
Jonas Herzig
6016ebece7 Fix label of non-letter keys in hotkey buttons 2020-11-06 18:54:53 +01:00
Jonas Herzig
f51f6032ca Use empty hotkey button when key is unbound across all versions
This happened to already be the case in 1.16.3 (because of another bug), this
commit makes it intentional and consistent across all versions.
Using the empty label over NONE or another label because it doesn't change the
width of the button and therefore fits nicer with all the other buttons.
2020-11-06 18:54:53 +01:00
Jonas Herzig
e86a583558 Fix crash when clicking hotkey button; introduced in 83690f4 2020-11-06 18:54:53 +01:00
Jonas Herzig
6fc7b8fb0f Fix incorrect layering of vanilla gui additions (fixes #385) 2020-11-06 18:54:53 +01:00
Jonas Herzig
8f094000fe Fix camera FOV not matching configured FOV
This is because the camera is considered flying which causes MC to increase its
FOV slightly.
2020-11-06 18:54:52 +01:00
Jonas Herzig
d3230e1e38 Add camera path export (closes #391) 2020-11-06 18:54:52 +01:00
Jonas Herzig
d8135d9038 Add depth map export (closes #371) 2020-11-06 11:41:38 +01:00
Jonas Herzig
a7d424679b Remove duplicate code between Simple and MultiFrame PBO capturer 2020-11-06 11:41:38 +01:00
Jonas Herzig
2b6d1b2359 Add OpenEXR export option
In preparation for depth map export.
2020-11-06 11:41:38 +01:00
Jonas Herzig
f57286043d Merge pull request #401 from LindaJuffermans/docs-201028-modlinks
Removed links to other mods which may trigger Chrome's safe browsing block.
2020-10-28 21:54:26 +01:00
LindaJuffermans
57900edf31 Fixed linebreak after Lunar Client 2020-10-28 19:49:33 +01:00
LindaJuffermans
3b428c7574 Removed links to other mods which may trigger Chrome's safe browsing block. 2020-10-28 19:47:22 +01:00
Jonas Herzig
5bd85e4c09 Merge pull request #400 from LindaJuffermans/docs-201026-futureclient
Future Client crashes on the Mixin
2020-10-28 19:15:04 +01:00
LindaJuffermans
d9ba1d24f5 Future Client crashes on the Mixin 2020-10-26 16:40:27 +01:00
Jonas Herzig
ad6c2aa3d9 Merge pull request #394 from LindaJuffermans/docs-1021-17animations
1.7 Animations w/shaders can cause floating glass and water
2020-10-21 18:30:42 +02:00
Jonas Herzig
45922acbc1 Merge pull request #393 from LindaJuffermans/docs-1021-ffmpeg43
Removed old issue from zeranoe's ffmpeg 4.3 missing libx264
2020-10-21 18:30:32 +02:00
LindaJuffermans
d7e309bca4 Removed old issue from zeranoe's ffmpeg 4.3 missing libx264 2020-10-21 15:55:04 +02:00
LindaJuffermans
716ec321ca 1.7 Animations w/shaders can cause floating glass and water 2020-10-21 15:52:25 +02:00
Jonas Herzig
17e554b67c Rename VideoWriter -> FFmpegWriter 2020-10-03 14:52:58 +02:00
Jonas Herzig
aee486c4f3 Stop assuming that our render pipeline will only process RGB frames
For one, we have already switched to RGBA some time ago, so the name was
technically incorrect already.
But the main reason is that we'll want to use them for depth maps as well (and
potentially maybe even for HDR images if that's possible with canvas?).
2020-10-03 14:50:44 +02:00
Jonas Herzig
4c4c052d8a Record into separate folder so replays only show once fully saved 2020-10-03 12:30:44 +02:00
Jonas Herzig
1486fe7fd0 Refresh ReplayViewer list after replay is saved (closes #379) 2020-10-03 10:58:17 +02:00
Jonas Herzig
b488e0b059 Fix render queue not being persisting after edit (fixes #362) 2020-10-03 10:38:08 +02:00
Jonas Herzig
094b20d69a Merge pull request #381 from LindaJuffermans/Branch_docs-0930-liteloader (closes #263)
Added LiteLoader compatibility information and workaround steps.
2020-09-30 11:41:48 +02:00
LindaJuffermans
41390b02e7 Added LiteLoader compatibility information and workaround steps. 2020-09-30 11:20:02 +02:00
Jonas Herzig
9af562957f Merge branch 'stable' into develop 2020-09-27 18:48:54 +02:00
Jonas Herzig
9cf8ec4e06 Release 2.4.5 2020-09-27 18:26:06 +02:00
Jonas Herzig
d7788b675a Fix missing blocks pre-1.14 in Quick Mode and Edit (fixes #374) 2020-09-27 17:28:29 +02:00
Jonas Herzig
5721b6f8c9 Fix realms notification icon offsets (fixes #373) 2020-09-27 15:58:43 +02:00
Jonas Herzig
a55320030f Fix thread-unsafe mc method call in FullReplaySender (fixes #370) 2020-09-27 15:28:08 +02:00
Jonas Herzig
1382e9fb31 Fix VanillaGuiScreen not resetting when resized (fixes #369) 2020-09-27 15:17:24 +02:00
Jonas Herzig
a62100071f Fix camera getting stuck spectating itself (fixes #300)
This bug was introduced when we started to record the login phase because it
contains the UUID of the local player. In the replay case this will be the UUID
of the camera entity but also the one of the recording player, so if the
recording player despawns while it is being spectated (e.g. because of a
backwards jump), then the camera snaps onto itself and gets stuck in place until
one presses Shift.
2020-09-27 14:41:10 +02:00
Jonas Herzig
afd0c27af9 Fix incorrect rotation when jumping to marker (fixes #310) 2020-09-27 14:16:58 +02:00
Jonas Herzig
49b0cbe4f8 Fix jumping to marker position when time already matches 2020-09-27 14:14:49 +02:00
Jonas Herzig
85ea757253 Fix incorrect jump behavior when jumping small distances beyond 5s 2020-09-27 14:08:39 +02:00
Jonas Herzig
fb447dc252 Fix incorrect extension for custom screenshot file name (fixes #337) 2020-09-27 13:45:03 +02:00
Jonas Herzig
d9e3622254 Fix crash when screenshots folder does not yet exist (fixes #377)
Happens when you open the output file dialog for the first time and haven't
taken any screenshots before.
2020-09-27 13:27:06 +02:00
Jonas Herzig
12a49a4a5e Fix crash due to double-close after ODS rendering (fixes #376) 2020-09-27 13:13:39 +02:00
Jonas Herzig
2c2af8a6a6 Fix outer skin layer when spectating in first person (fixes #363) 2020-09-27 13:11:57 +02:00
Jonas Herzig
f42f4d468d Fix editing a replay twice with the same name (fixes #342) 2020-09-27 12:36:16 +02:00
Jonas Herzig
e24c4cd860 Fix incorrect latest version in minimal mode popup (fixes #375)
Also clean up the `1.7.6-1.7.10` to just `1.7.10`.
2020-09-27 12:31:05 +02:00
Jonas Herzig
9abbea7fb9 Merge branch 'mc-1.16.3' into release-2.4.5 2020-09-27 12:01:25 +02:00
Jonas Herzig
39a2fba921 Merge pull request #372 from LindaJuffermans/docs-0804-ffmpeg-431
Updated location of windows binaries for ffmpeg now that zeranoe is discontinued.
2020-09-25 15:41:07 +02:00
LindaJuffermans
ba4bffda2a Updated location of windows binaries for ffmpeg now that zeranoe is discontinued. 2020-09-25 14:53:45 +02:00
Jonas Herzig
cff6034079 Merge pull request #366 from altrisi/patch-1
Don't create an empty directory with no modcore available
2020-09-20 08:00:56 +02:00
altrisi
0561a9f53c Don't create an empty directory with no modcore...
...version available for the current MCVersion.
2020-09-19 15:10:23 +02:00
Jonas Herzig
3db25abe48 Merge branch 'mc-1.16.3' into develop 2020-09-10 17:34:48 +02:00
Jonas Herzig
efd1cebff3 Update to MC 1.16.3 2020-09-10 17:32:21 +02:00
Jonas Herzig
83690f4024 Refactor key binding registrations to be more easily expandable 2020-09-06 11:45:37 +02:00
Jonas Herzig
f623bb3ee7 Add reset button to export command settings (closes #356) 2020-09-06 11:45:37 +02:00
Jonas Herzig
00cb2b43a8 Rewrite main menu button offset to be more compatible (closes #341)
In particular, we now position it relative to the realms (fallback to
multiplayer) button.
This removes the need for special-casing ModMenu and fixes compatibility with
Better Mod Button.
2020-09-06 11:45:37 +02:00
Jonas Herzig
e5c0ca501b Add option to process multiple render queues in on go (closes #349) 2020-09-06 11:45:37 +02:00
Jonas Herzig
fcd1224fa0 Allow replay to be started in sync mode (required for #349) 2020-09-06 11:45:37 +02:00
Jonas Herzig
76a8623531 Show content of replay's render queue in Replay Viewer
As part of #349.
2020-09-06 11:45:37 +02:00
Jonas Herzig
9eb69375bd Add multi-select to Replay Viewer list (closes #354) 2020-09-06 11:45:37 +02:00
Jonas Herzig
6878cefadc Add type-to-filter functionality to Replay Viewer list 2020-09-06 11:45:37 +02:00
Jonas Herzig
29653c7ccc Render border of focused text field in white to match vanilla 2020-09-06 11:45:37 +02:00
Jonas Herzig
b54645e5b7 Replace "Settings" button with textured button in top left corner
The texture of this button is based on the settings button of the ModMenu mod
and was originally under the MIT license "Copyright (c) 2018-2020 Prospector".
The derived version is licensed as any other file in this repository.
2020-09-06 11:45:37 +02:00
Jonas Herzig
000048cc8f Support 1.15 button hover style for textured buttons 2020-09-04 20:56:05 +02:00
Jonas Herzig
8fac84bfe9 Merge branch 'release-2.4.4' into develop 2020-09-04 12:01:56 +02:00
Jonas Herzig
ebcf2bfa7b Release 2.4.4 2020-09-04 11:47:02 +02:00
Jonas Herzig
8ef3ab8647 Stop relying on fabric-api internals to inject resource packs
Fixes compatibility with fabric-api 0.20+
2020-09-04 11:37:25 +02:00
Jonas Herzig
d039009a9f Workaround Optifine breaking charTyped events 2020-09-01 12:54:30 +02:00
Jonas Herzig
9211fb524c Persist render queue in replay file (closes #317) 2020-08-29 21:21:34 +02:00
Jonas Herzig
4a6c0acc8b Add "Add to Queue" button to keyframe repository (closes #168) 2020-08-29 19:13:59 +02:00
Jonas Herzig
a92aa9cbbd Add Edit button to render queue 2020-08-29 19:13:04 +02:00
Jonas Herzig
f13e8834d6 Have render job name be determined directly by output file name 2020-08-29 19:13:04 +02:00
Jonas Herzig
1188ce4360 Swap parent relation between render settings and queue
Previously you'd access the render queue from the render settings screen which
was arguably the wrong way around (e.g. you weren't able to access the queue
when your current keyframes were incorrect even if you only wanted to render
those in the queue).

Now the render button opens the queue which can open a new settings popup. To
save people who don't need the queue from always having to go through it, the
queue will immediately open a new settings popup if does not yet have any jobs.
2020-08-29 19:13:04 +02:00
Jonas Herzig
ae63b32268 Allow rendering of selected entries in render queue gui 2020-08-29 19:13:04 +02:00
Jonas Herzig
fbed279e34 Add multi-select to render queue gui 2020-08-29 14:46:04 +02:00
Jonas Herzig
d95af541c7 Default render queue job name to output file name (closes #267) 2020-08-29 14:27:07 +02:00
Jonas Herzig
db9db0280b Find ffmpeg.exe anywhere in .minecraft folder (closes #347)
Thanks to Lucky56 for testing!
2020-08-29 14:27:07 +02:00
Jonas Herzig
098300f0db Stop blocking all UI during path playback (closes #269)
Instead, just copy the timeline before playback.
2020-08-29 14:27:07 +02:00
Jonas Herzig
9314eab7ff Make video timeline length configurable (closes #261) 2020-08-29 14:27:07 +02:00
Jonas Herzig
c9b57dbcd7 Handle Ctrl+A, Ctrl+C and Ctrl+V in the keyframe repository 2020-08-29 14:27:07 +02:00
Jonas Herzig
9f590e93ce Add copy/paste buttons to keyframe repository (closes #318) 2020-08-29 14:27:07 +02:00
Jonas Herzig
e294ebe8c9 Add multi-select to keyframe repository (see #318) 2020-08-29 14:27:07 +02:00
Jonas Herzig
fbf53d3842 Add option to use night vision for full brightness (closes #315) 2020-08-29 10:34:12 +02:00
Jonas Herzig
9a27138e78 Fix crash when config is missing a value 2020-08-29 10:19:01 +02:00
Jonas Herzig
9c6f040364 Change F1 while replay gui is focused to only hide it (closes #259)
Previously pressing F1 while the replay gui is focused (i.e. while the mouse is
visible) would toggle the global hudHidden state.
Now it only toggles the hidden state for the replay itself, allowing the
remainder to still be recorded with e.g. OBS where a full render isn't needed.
2020-08-29 09:32:18 +02:00
Jonas Herzig
39f958a7bb Fix F1 not functioning on 1.14+ while replay gui is focused 2020-08-29 09:30:57 +02:00
Jonas Herzig
103d2204d6 Load replays in order of last modified (closes #346) 2020-08-29 09:09:10 +02:00
Jonas Herzig
c2d4ac20dc Add rename/discard options to "Replay Saving" gui (closes #319) 2020-08-28 21:21:25 +02:00
Jonas Herzig
ab2b89f838 Add per-server overwrite for auto-recording setting (closes #313) 2020-08-28 18:31:25 +02:00
Jonas Herzig
ebe6da28fb Run recovery in background with progress indicator (closes #326) 2020-08-28 16:34:09 +02:00
Jonas Herzig
26f3c3639c Add progress bar to "Saving Replay" indicator (closes #325) 2020-08-28 16:15:39 +02:00
Jonas Herzig
739d5b2807 Add key hints to buttons which have corresponding keybindings 2020-08-28 15:58:02 +02:00
Jonas Herzig
fd48e56238 Add keybindings for the two keyframe buttons (closes #312)
And one to add a position keyframe even when spectating.
And one to press both buttons with a single key.
2020-08-28 15:45:34 +02:00
Jonas Herzig
c2f51d41fa ./gradlew :1.16.2:setCoreVersion 2020-08-28 14:55:40 +02:00
Jonas Herzig
9001fdc9de Cleanup 1.15.2 <-> 1.16.2 conversion 2020-08-28 14:50:28 +02:00
Jonas Herzig
16c759f1dd Drop lombok, it has been causing too much confusion
Basically the result of the Delombok function, except we use IntelliJ's equals,
hashCode and toString and don't re-organize imports (cause that breaks the
preprocessor) and a bunch of manual cleanup was necessary (and half the classes
weren't even converted).
2020-08-28 14:06:31 +02:00
Jonas Herzig
23e51d7099 Release 2.4.3 2020-08-22 17:17:40 +02:00
Jonas Herzig
1208fb92a1 Add .gitkeep file to 1.16.2 folder 2020-08-22 17:12:32 +02:00
Jonas Herzig
27edfcb4f3 Fix incompatibility with mods which mixin into Main (fixes #327) 2020-08-22 14:04:05 +02:00
Jonas Herzig
34b0369775 Merge branch 'mc-1.16.2' into release-2.4.3 2020-08-22 13:40:43 +02:00
Jonas Herzig
0edebdc8d3 Merge pull request #279 from LindaJuffermans:docs-0721-quickmode-icon 2020-08-22 13:40:02 +02:00
Jonas Herzig
7c229c0216 Enable git's autocrlf 2020-08-22 13:36:16 +02:00
Jonas Herzig
2a8c802d43 Merge pull request #257 from LindaJuffermans:develop 2020-08-22 13:33:18 +02:00
Jonas Herzig
8ffb98efd1 Fix recording of client-triggered world events in 1.16+ (fixes #333) 2020-08-16 10:03:55 +02:00
Jonas Herzig
da275a6080 Update to 1.16.2 2020-08-11 18:16:08 +02:00
Jonas Herzig
0e77235ef9 Update to MC 1.16.2-rc1 2020-08-09 13:55:00 +02:00
Jonas Herzig
3ba37ab05c Merge pull request #308 from LindaJuffermans/docs-0804-ffmpeg-431
ffmpeg 4.3.1 supports h264/h265
2020-08-04 16:08:09 +02:00
LindaJuffermans
6537c30d6b Removed mentioning of an ffmpeg version 2020-08-04 16:03:18 +02:00
LindaJuffermans
17f5771906 ffmpeg 4.3.1 supports h264/h265 2020-08-04 15:17:01 +02:00
Jonas Herzig
d065868abb Release 2.4.2 2020-08-03 10:31:36 +02:00
LindaJuffermans
9c3c76e70d Added NULL check for missing encodingPreset (fixes #288) 2020-08-03 10:23:50 +02:00
Jonas Herzig
eb2c2f2e6b Merge pull request #306 from LindaJuffermans/docs-0801-sodium
Sodium cannot be enable during rendering.
2020-08-01 21:33:36 +02:00
LindaJuffermans
d26c9e508b Sodium cannot be enable during rendering. 2020-08-01 20:51:13 +02:00
Jonas Herzig
9dc5e62b64 Merge pull request #297 from LindaJuffermans/docs-0730-screens
Updated screenshots to latest version of ReplayMod
2020-07-30 16:27:17 +02:00
Jonas Herzig
21dbafb860 Merge pull request #298 from LindaJuffermans/docs-0730-camera-symbol
Path preview icon is not shown when the path is shown.
2020-07-30 16:24:58 +02:00
LindaJuffermans
d54c1c2be2 Path preview icon is not shown when the path is shown. 2020-07-30 13:51:59 +02:00
LindaJuffermans
8ccffb9bd3 Updated screenshots to latest version of RM 2020-07-30 13:32:44 +02:00
Jonas Herzig
bd5af16e1e Merge pull request #293 from LindaJuffermans/docs-0728-randompatches
Crash using ReplayMod with RandomPatches
2020-07-29 11:06:37 +02:00
LindaJuffermans
0295257fc0 Crash using ReplayMod with RandomPatches 2020-07-28 15:44:36 +02:00
Jonas Herzig
335eb93858 Merge pull request #285 from LindaJuffermans/docs-0726-baritone
Crash using ReplayMod with Baritone
2020-07-26 11:01:10 +02:00
LindaJuffermans
cc3e950d6a Crash using ReplayMod with Baritone 2020-07-26 10:55:59 +02:00
Jonas Herzig
621587c65e Release 2.4.1 2020-07-25 22:40:32 +02:00
Jonas Herzig
fd7b6030f9 Fix keybinding conflicts on 1.14+ (fixes #268)
This fixes both, replay-exclusive keybindings blocking vanilla ones as well as
vanilla keybindings blocking replay-exclusive ones.

The magic happens in Mixin_ContextualKeyBindings.
2020-07-25 21:40:02 +02:00
Jonas Herzig
063657af4c Fix DELETE keybinding on 1.14+ (fixes #270) 2020-07-25 19:52:18 +02:00
Jonas Herzig
8d82953c0b Fix hands always rendering with 1.16 OF shaders (fixes #280) 2020-07-25 19:33:19 +02:00
Jonas Herzig
a4b6e92627 Position recording control buttons relative to Exit (fixes #281) 2020-07-25 18:43:33 +02:00
Jonas Herzig
35cc78c70c Fix crash due to invalid characters in video file name (fixes #265)
037d54f Prevent FileChooserPopup from selecting invalid file names
2020-07-25 17:19:38 +02:00
Jonas Herzig
5983d99354 Fix jittering once a tick during rendering pre-1.16 (fixes #264)
The fetching of the ticks variable was accidentally moved to before the timer
update while updating to 1.16, this caused the interpolation to be off by one
tick each frame in which the timer advances to the next tick.
2020-07-25 17:02:56 +02:00
Jonas Herzig
fc1ae0e109 Hide unsupported render methods in settings gui (fixes #284) 2020-07-25 17:02:24 +02:00
Jonas Herzig
34a7465b8e Merge pull request #283 from LindaJuffermans/docs-0722-oldanimations
Crash using ReplayMod with OldAnimationsMod
2020-07-22 21:38:48 +02:00
Jonas Herzig
2957f46ade Merge branch 'stable' into docs-0722-oldanimations 2020-07-22 21:38:29 +02:00
Jonas Herzig
83cc4a035a Merge pull request #282 from LindaJuffermans/docs-0722-patchermod
Crash using ReplayMod with Patcher
2020-07-22 21:37:37 +02:00
LindaJuffermans
3981fa3ada Removed extra empty lines 2020-07-22 21:24:19 +02:00
LindaJuffermans
bc5182f98b Removed extra empty lines 2020-07-22 21:23:45 +02:00
LindaJuffermans
fda09358da Crash using ReplayMod with OldAnimationsMod 2020-07-22 21:22:31 +02:00
LindaJuffermans
e177333af4 Crash using ReplayMod with Patcher 2020-07-22 21:18:50 +02:00
Jonas Herzig
f578f0df20 Merge pull request #277 from LindaJuffermans/docs-0721-accounts
Added Accounts section to explain discontinuing and new Discord support structure.
2020-07-21 21:53:34 +02:00
LindaJuffermans
a2342071b3 Updated to fixed Discord link from the main site 2020-07-21 21:52:24 +02:00
Jonas Herzig
7510f717a4 Merge pull request #278 from LindaJuffermans/docs-0721-quickmode
Added Quick Mode section and reference from timeline jumping
2020-07-21 21:50:10 +02:00
LindaJuffermans
3d7d51e2e0 Added Quick Mode section and reference from timeline jumping; including clock icon 2020-07-21 21:49:56 +02:00
LindaJuffermans
a0e9f0b61b Added Quick Mode section and reference from timeline jumping 2020-07-21 21:47:48 +02:00
LindaJuffermans
d49b06856f Added Accounts section to explain discontinuing and new Discord support structure. 2020-07-21 21:44:27 +02:00
Jonas Herzig
72bc8c87ee Merge pull request #276 from LindaJuffermans/docs-0721-thumbnails
Removed Replay Center reference in Thumbnails
2020-07-21 21:44:05 +02:00
LindaJuffermans
70494f3c6a Removed Replay Center reference in Thumbnails 2020-07-21 21:42:21 +02:00
Jonas Herzig
3273b3c239 Merge pull request #275 from LindaJuffermans/docs-0721-ffmpeg-notes3
Added ffmpeg details
2020-07-21 21:38:40 +02:00
LindaJuffermans
f61bfc4648 Added ffmpeg details 2020-07-21 21:35:53 +02:00
LindaJuffermans
169c4857b3 Fixed order of methods in quickmode change; no longer relying on local variable, instead pulling current state from ReplayHandler before updating. 2020-07-17 17:23:02 +02:00
LindaJuffermans
b79848936b Implemented review changes 2020-07-17 16:32:12 +02:00
LindaJuffermans
3aea7cdca4 Tweaked the indicator positions 2020-07-15 21:44:48 +02:00
LindaJuffermans
a94f417822 Fixed for 1.15.2 2020-07-15 21:07:30 +02:00
LindaJuffermans
2dcfbd6435 Changed Replay Viewer panel button (from play button to hamburger)
Added quickmode indicator (bottom-right with night vision indicator)
2020-07-15 15:49:44 +02:00
Jonas Herzig
2ab92f554f Release 2.4.0 2020-07-14 13:59:13 +02:00
Jonas Herzig
d3ad55eb79 Add run directory to gitignore 2020-07-14 13:57:49 +02:00
Jonas Herzig
9ea52eadc7 Move .gitkeep from 1.16 to 1.16.1 2020-07-14 13:57:10 +02:00
Jonas Herzig
a04ef22945 Fix broken frame after teleport during rendering (fixes #225) 2020-07-13 20:23:21 +02:00
Jonas Herzig
294f24c71e Fix jGui resources in 1.16 dev env 2020-07-13 20:23:21 +02:00
Jonas Herzig
b8618b6165 Fix dead-lock when rendering outside of loaded chunks (fixes #197) 2020-07-13 19:22:28 +02:00
Jonas Herzig
d8e4b89413 Fix forge handshake being reordered by MarkerProcessor (fixes #253)
For one, the forge handshake takes place *after* login phase (but before the
JoinGame packet), so we must ensure that the SquashFilter does not reorder
those.
Secondly, we were ignoring the initial packet (timestamp = 0) in marker
processor when it should have been passed to the SquashFilter. This was not an
issue before cause the SquashFilter did not rely on it. Now however the
SquashFilter needs to be able to see a login phase packet, so it knows that the
following packets till the JoinGame packet are part of the forge handshake.

In ReplayStudio:
20b5183 Fix forge handshake being reordered to after the JoinGame packet
2020-07-13 19:04:32 +02:00
Jonas Herzig
88fab6a91d Fix fastutil being relocated in 1.14+ (fixes #248) 2020-07-13 19:04:32 +02:00
Jonas Herzig
da59c75f8b Update jGui (fixes #249)
20e11e0 Remove length limit from GuiFileChooserPopup text field
2020-07-13 19:04:32 +02:00
Jonas Herzig
e090e8f4f3 Fix crash when video file name contains whitespace (fixes #250) 2020-07-13 19:04:32 +02:00
Jonas Herzig
f1885ece41 Fix non-player entity freezing on chunk unload in 1.14+ (fixes #203) 2020-07-13 19:03:41 +02:00
Jonas Herzig
dc31605b29 Change forge run dir from "eclipse" to "run"
I don't even know why it was at "eclipse" in the first place.
2020-07-13 16:07:48 +02:00
Jonas Herzig
f83216ab91 Include only the mod meta data file for the respective loader
Also clean up the entire processResources block in the process cause it was a
mere coincidence that it has worked properly.
2020-07-13 16:07:48 +02:00
Jonas Herzig
ecee63491c Remove mods.toml (modlauncher was never supported anyway) 2020-07-13 16:07:48 +02:00
Jonas Herzig
9c49fdf4d1 Remove explicit FAPI dep and instead bundle the required modules
Also need to update ModMenu because the version we depended on still bundled the
snapshot FAPI and that was only fine because we overwrote it with our version.
2020-07-13 16:07:48 +02:00
Jonas Herzig
62bbf0efd6 Update IDEA setup instructions
Configuring the annotation processor is done automatically as of IDEA 2020.1.

Run configs for 1.14+ versions should now be generated automatically once the
referenced PR is merged (or when using a local build of it).
2020-07-13 16:07:48 +02:00
Jonas Herzig
e83805bee6 Remove MP4_HIGH preset (fixes #254)
It results in unreasonably high bit rates which regularly confuses users.
The Custom preset should generally be preferred.
2020-07-13 16:04:39 +02:00
Jonas Herzig
f1f1f5dde2 Fix tests failing because they cannot access jGui classes 2020-07-13 16:01:28 +02:00
Jonas Herzig
9b98575c0b Get rid of preshadow plugin, it doesn't play nice with recent IDEA 2020-07-13 16:01:28 +02:00
Jonas Herzig
ffa66dd905 Remove long broken reprod gradle setup 2020-07-13 16:01:28 +02:00
Jonas Herzig
54b515fd2b Merge remote-tracking branch 'origin/develop' into snapshot 2020-07-13 16:01:01 +02:00
Jonas Herzig
23849bc8c4 Merge pull request #247 from LindaJuffermans/develop
Minor doc changes
2020-07-04 19:36:54 +02:00
Linda Juffermans
e27c19f781 Rephrased tickrate mod incompatibility 2020-07-03 09:42:25 +02:00
Linda Juffermans
faf9b454d2 Fixed FFmpeg path in Windows 2020-07-03 09:20:39 +02:00
Linda Juffermans
241b086ec4 Added some known issues, unsupported launchers and incompatible mods. 2020-07-03 09:16:43 +02:00
Jonas Herzig
5bf6773655 Merge remote-tracking branch 'origin/develop' into snapshot 2020-06-28 22:07:49 +02:00
Jonas Herzig
7118d55d62 Update to 1.16.1 2020-06-28 21:57:45 +02:00
Jonas Herzig
a4af8c2610 Release 2.3.2 2020-06-28 21:31:47 +02:00
Jonas Herzig
bc05566d2e Update ReplayStudio
fc8a66d Fix handling of view pos/dist packets in MC 1.14+ quick mode
2828174 Fix reading and writing of unload chunk packets pre-1.9 (fixes #210)
42bd0fe Fix map data being swallowed by squash filter (fixes #232)
2020-06-28 21:12:12 +02:00
Jonas Herzig
0ab1db9517 Improve handling of CrashException in runLater (fixes #205) 2020-06-28 21:12:12 +02:00
Jonas Herzig
a6f5931e7e Fix output file render setting not being saved (fixes #229) 2020-06-28 21:12:12 +02:00
Jonas Herzig
513f53f1ee Open output file popup in folder and with name of current file 2020-06-28 21:12:12 +02:00
Jonas Herzig
6038d3c4df [1.14+] Fix resource pack loading during rendering (fixes #182) 2020-06-28 21:12:12 +02:00
Jonas Herzig
72b44c368b [1.8] Fix incorrect event bus for deferred runLater (fixes #206) 2020-06-28 21:12:12 +02:00
Jonas Herzig
058346d247 Workaround a bug in MC where light is not updated (fixes #209)
MC stores server light data and only applies it during the next frame.
Therefore, if there is no frame between receiving the chunk and block changes in
it (like when jumping in replays), then the light update from the block change
gets lost.
2020-06-28 21:12:12 +02:00
Jonas Herzig
0ba651d19c Fix recording of client player's metadata after respawn (fixes #212)
1.15 removed the data tracker syncing from the spawn packet, so we now need to
send that explicitly.
2020-06-28 21:12:12 +02:00
Jonas Herzig
8e1f9f5a9c Fix quick mode sending async-mode packets when paused
This wasn't much of on issue because no tick events are fired normally while
paused. When seeking we do however manually run a tick for better result, and
this manual tick would cause this async sending code to run and seek wildly into
the future.
2020-06-28 21:12:12 +02:00
Jonas Herzig
c04f3ab185 Fix shift+play camera path requiring time keyframes (fixes #218) 2020-06-28 21:12:12 +02:00
Jonas Herzig
bad79ab286 Throw IOException when ImageIO.read return null (fixes #201) 2020-06-28 21:12:12 +02:00
Jonas Herzig
9f3808f0ff Render gui overlay even when event was cancelled (fixes #170)
Cause Lunatrius' InGame-Info-XML mod cancels it and we don't actually care about the event, just about when it's called.
2020-06-28 21:12:12 +02:00
Jonas Herzig
5f284fcd3d Fix spectating when clicking with unlocked cursor (fixes #224)
> If you misclick the add keyframe button or something, you end up specating
instead and you have to find the camera angle again
2020-06-28 21:12:12 +02:00
Jonas Herzig
04c902a792 [1.8.9] Fix launching in development environment 2020-06-28 21:12:12 +02:00
Jonas Herzig
33ec18ad1e Merge pull request #240 from ThomasBerends/feature/docs-upgrade
Overall upgrade of documentation
2020-06-25 20:47:01 +02:00
Thomas Berends
5c446bbb8d Processed feedback 2020-06-25 20:41:09 +02:00
Thomas Berends
d79c66cdd1 Update docs/content.md
Co-authored-by: Jonas Herzig <me@johni0702.de>
2020-06-25 20:27:20 +02:00
Thomas Berends
175efa55fe Update docs/content.md
Co-authored-by: Jonas Herzig <me@johni0702.de>
2020-06-25 20:27:07 +02:00
Thomas Berends
b79c835d53 Overall upgrade of documentation 2020-06-25 19:07:57 +02:00
Jonas Herzig
dc9fcb11cd Update to 1.16-rc1 2020-06-21 15:29:07 +02:00
Jonas Herzig
82200a7c34 Update to 1.16-pre6 2020-06-15 21:12:06 +02:00
Jonas Herzig
30aa992ddb Update to 1.16-pre5 2020-06-15 11:14:30 +02:00
Jonas Herzig
2ffde14c60 Update to 1.16-pre1 2020-06-15 09:44:37 +02:00
Jonas Herzig
14b84c5e1b Fix remapping of jGui using incorrect mappings
We used to include the raw jGui source in our jar and then had the main remapJar
task remap both of them to intermediary. This however does not work properly
when jGui needs additional mapping (e.g. because of mixin), resulting in
non-remapped mixins with fail to apply at runtime.

With this commit, we no longer include jGui in our raw jar and instead now have
shadowJar depend on jGui's remapJar task.
2020-06-15 08:58:02 +02:00
Jonas Herzig
88be6b3935 Update to 20w22a (minimal mode only) 2020-06-04 13:03:34 +02:00
Jonas Herzig
6210cb09aa Fix recording in minimal mode 2020-06-04 11:44:54 +02:00
Jonas Herzig
20b410f963 Release 2.3.1 2020-05-24 14:08:45 +02:00
Jonas Herzig
ef13d020a2 Fix incorrect screen and crash when encountering replay restrictions 2020-05-24 13:39:15 +02:00
Jonas Herzig
fabe4783c8 Make Replay Viewer button work with CustomMainMenu (fixes #195) 2020-05-24 13:38:10 +02:00
Jonas Herzig
ef79331037 Remove online features, they're no longer available 2020-05-24 12:38:57 +02:00
Jonas Herzig
244aeb244f Fix incorrect 1.14.4-forge to 1.12.2 mapping
This causes the reverse conversion to incorrect results again but I cannot
currently be bothered to fix that.
2020-05-23 23:24:24 +02:00
Jonas Herzig
ea95863b4a Update ReplayStudio (fixes #173) 2020-05-23 22:54:11 +02:00
Jonas Herzig
3c526a6cd4 Support MM1 in addition to MM2 (fixes #162)
Cause the latest OptiFabric on 1.14.4 still ships that and it has no support for
entrypoints.
2020-05-23 22:31:01 +02:00
Jonas Herzig
363a8d595c Apply OF chunk building bug fix only during rendering (fixes #164) 2020-05-23 22:05:42 +02:00
Jonas Herzig
d1ff98c76a Fix 1.12.2 to 1.14.4-forge conversion 2020-05-23 20:13:54 +02:00
Jonas Herzig
1123341182 Fix RM not loading another mod loads mixin first (fixes #181) 2020-05-23 20:06:18 +02:00
Jonas Herzig
a23f18d92e Fix fabric dependency declaration (fixes #187) 2020-05-23 14:37:44 +02:00
Jonas Herzig
154952a8ac Change ModCore messages cause people keep thinking those are errors 2020-05-23 14:37:44 +02:00
Jonas Herzig
b68d077b38 Update preprocess plugin and enable parallel builds by default 2020-05-23 13:25:37 +02:00
Jonas Herzig
c0be8da65b Release 2.3.0 2020-05-08 13:09:42 +02:00
Jonas Herzig
b534d1395d Update ReplayStudio, fixes squashing of empty columns (fixes #151) 2020-05-08 12:23:35 +02:00
Jonas Herzig
4e5122db5d Close packet output stream before saving replay
Aside from being best practice, this is necessary for the recording CRC to be
written to the replay file (cause that only happens on close).

Also potentially fixes https://github.com/ReplayMod/ReplayMod/issues/144 though
that should already be covered by ZipReplayFile tracking and closing all of its
`OutputStream`s before saving.
2020-05-08 11:38:12 +02:00
Jonas Herzig
8193006aea Update ReplayStudio, fixes cache invalidation when recording changes 2020-05-08 11:29:33 +02:00
Jonas Herzig
4aa256d53b Cleanup raw and cache files after some time (fixes #143) 2020-05-08 10:57:34 +02:00
Jonas Herzig
62c6b36f08 Fix crash when minimizing on Windows during rendering (fixes #140)
Hopefully, haven't actually tried it cause, you know, Windows (and minimizing
with just xfwm4 doesn't exhibit the same behavior).
2020-05-08 10:17:49 +02:00
Jonas Herzig
a1cee391fb Render GuiOverlays before (i.e. behind) debug overlay
Also fixes https://github.com/ReplayMod/ReplayMod/issues/155
2020-05-08 09:45:06 +02:00
Jonas Herzig
d4192b354c [1.15] Fix dead-lock due to data race during rendering (fixes #156) 2020-05-08 09:45:06 +02:00
Jonas Herzig
d24800160b Improve MarkerProcessor output generation (fixes multiple issues)
In particular:
- No longer generate any replays when auto-recording is off and recording is
never enabled from the ingame menu (fixes #138)
- Do not generate an additional empty replay file when recording was stopped in
ingame menu (fixes #147)
- only do squash if there are further output replays (fixes #142)
- Use the input file name as output file name even if there was a split (as long
as it's the only output file, e.g. because recording was never un-paused after
the split)
2020-05-08 09:45:06 +02:00
Jonas Herzig
9fb4dce367 Reset export arguments when upgrading from old version (fixes #148) 2020-05-08 09:45:06 +02:00
Jonas Herzig
811f52dc17 Throw helpful error message when rendering with sodium (see #150) 2020-05-08 09:45:06 +02:00
Jonas Herzig
72ce522813 Ensure task queue is not locked during rendering (fixes #157)
Similar to 3fedc22 in effect and cause. However tasks are executed, they just
cannot be submitted pre-1.14 because MC would continuously hold the lock on the
scheduledTasks queue for the entire renderVideo call.
2020-05-07 14:11:02 +02:00
Jonas Herzig
316f4e2c3c Prevent keyframe time from being set out of bounds (fixes #152) 2020-05-07 11:45:01 +02:00
Jonas Herzig
0962f1895e Fix 1.14.4 forge and fabric jars having the same name (fixes #149)
This caused one of them to be deployed at random, e.g. forge for 2.3.0-b1,
obviously resulting in an unusable build.
2020-05-07 11:20:20 +02:00
Jonas Herzig
8e05a67c5e Pre-release 1 of 2.3.0 2020-04-22 10:48:44 +02:00
Jonas Herzig
715bd8d366 Fix doRelease gradle task 2020-04-22 10:48:07 +02:00
Jonas Herzig
195942cd62 Add .gitkeep files to versions/{1.14.4,1.15.2} 2020-04-22 10:38:58 +02:00
Jonas Herzig
9dfd25c3fd Update README 2020-04-22 10:10:01 +02:00
Jonas Herzig
3d71f7c526 [Pre-1.12] Include less-outdated netty library for ReplayStudio
On 1.12+ MC's bundled version is sufficiently up-to-date but before that it
didn't have e.g. `ByteBuf.retainedSlice`.
2020-04-21 23:08:04 +02:00
Jonas Herzig
05f617a885 Use ReplayOutputStream for packet writing
We didn't used to do that because it would have required us to serialize and
then de-serialize as MCProtocolLib only to re-serialize each packet.
With ReplayStudio v2, we only have to convert to from MC's ByteBuf types to
ReplayStudio's ByteBuf (fairly trivial).

This also allows us to automatically make use of ReplayStudio's backwards
compatibility features: We didn't used to record the login phase pre-1.14 and we
still don't, so we now would have to inject a fake login packet (because we're
no longer generating legacy-version replay files) but ReplayOutputStream can
do that for us.
Without this commit, any pre-1.14 replays generated are unplayable due to the
missing LoginSuccess packet.
2020-04-21 22:58:55 +02:00
Jonas Herzig
c8b7e5b213 [Forge] Fix saving of CustomPayload packets 2020-04-21 22:04:01 +02:00
Jonas Herzig
1249ca4167 Add ModCore integration 2020-04-21 21:30:24 +02:00
Jonas Herzig
b852a1787d Downgrade pre-1.12 back to Mixin 0.7.10 2020-04-21 21:11:31 +02:00
Jonas Herzig
a733d301fd Update preview gui framebuffer size regardless of performance mode
This used to be more of an issue in the past but `displaySizeChanged` has gotten
pretty cheap by now and not updating it will basically make the rendering GUI
useless once you resize even once.
2020-04-17 13:56:19 +02:00
Jonas Herzig
059063430c Update ReplayStudio (fixes #134)
9117411 ReplayOutputStream must not change ByteBuf reader index of packet
2020-04-17 01:24:46 +02:00
Jonas Herzig
7c35e1c7d1 Set CameraEntity.noClip depending on spectator state (fixes #136)
This field is used to decide whether or not to render the inside-block overlay,
as such we want it to be set while we're in spectator mode).

This wasn't a problem before 1.15 because we also cancel the renderHand call
while we're in spectator mode and the same method which renders your hand also
renders the overlay, so we were inadvertently canceling that at the same time.
With 1.15, that's still the case except when using OF, which splits the method
apart by adding three boolean arguments indicating which part to execute.
2020-04-16 23:59:00 +02:00
Jonas Herzig
3b72a67d2b Persist gradle (and loom) cache between Jenkins jobs 2020-04-16 18:51:01 +02:00
Jonas Herzig
808793a121 Switch from Drone to Jenkins 2020-04-16 18:50:59 +02:00
Jonas Herzig
023a1bcf0f Fix :1.7.10:setup{CI,Decomp}Workspace
For details see the referenced FG commit.
Related commit for 1.8+: 190210f
2020-04-16 18:50:51 +02:00
Jonas Herzig
5953435dc5 [1.14+] Fix reading of lang files with CRLFs (mitigates #132) 2020-04-16 14:55:46 +02:00
Jonas Herzig
0d3a689f17 [1.14+] Fix "Player Overview" title
We used to remap the old language key layout for inputs to the one used by
fabric but didn't consider that we might still be directly referencing the old
key somewhere else (e.g. for the Player Overview title).

With this commit, we retain the original and add the new mapping.
2020-04-16 14:48:23 +02:00
Jonas Herzig
f8b22d449c [1.14] Work around bug in mixin causing Accessors to not resolve
This intentionally breaks the mixin in a development environment but makes the
compiled jar work in a live environment (which is probably more useful given the
primary version is 1.15 now).
2020-04-15 19:47:12 +02:00
Jonas Herzig
f96ed03f12 Update loom: 0.2.2 → 0.2.6 2020-04-15 19:41:21 +02:00
Jonas Herzig
3fedc22899 Execute task queue even when rendering a paused replay (fixes #129)
The task queue is executed by MC each frame, not just each tick, so we should do
so as well. Most async actions also rely on it to re-synchronize with the
rendering thread, e.g. skins won't load if we never poll the task queue.
2020-04-15 18:42:39 +02:00
Jonas Herzig
a514e53d11 [1.7.10] Disable tests for now 2020-04-15 18:34:25 +02:00
Jonas Herzig
4586cb5382 Only update timeline when default iterp type changed (fixes #127) 2020-04-15 17:40:26 +02:00
Jonas Herzig
6ccb576637 Update lombok (see #127) 2020-04-15 17:26:53 +02:00
Jonas Herzig
82f86122c8 Handle third-party buttons without text in ingame menu (see #120) 2020-04-15 16:56:16 +02:00
Jonas Herzig
39ccf60f15 Update ReplayStudio
6990c48 SquashFilter: Fix leaking of MapData packets
2020-04-08 23:49:13 +02:00
Jonas Herzig
f5afeb918c Fixup mixin config changes of c119392
- Remove MixinRenderGlobal, it's now called Mixin_ForceChunkLoading
- Re-add MixinChunkRenderWorker (1.8-1.14) which was accidentally removed
2020-04-08 23:26:02 +02:00
Jonas Herzig
dafbeb34d4 Workaround a bug in OF which incorrectly queues chunks (fixes #123) 2020-04-08 22:43:02 +02:00
Jonas Herzig
5aa1d7be53 Update 1.14.4 fabric-api version to 0.4.3 (fixes #101) 2020-04-08 17:46:01 +02:00
Jonas Herzig
c5476025ec Fix terrain not rendering with OF shaders enabled (fixes #122)
This was caused by us setting `needsTerrainUpdate` to false during the shadow
pass in order to break out of the ForceChunkLoading loop (cause OF doesn't
update chunks during the shadow pass). However, this inadvertently caused the
chunk updates to be skipped during the normal pass as well if there didn't
happen to be another reasons for updating.

To fix this, we simply move the shadow pass check into the ForceChunkLoading
mixin and skip the entire loop during the shadow pass.
2020-04-08 17:45:06 +02:00
Jonas Herzig
8f7d263ad9 Fix livelock caused by OF not properly resetting ChunkVisibility
This can lead to a livelock when rendering with shaders after exiting a
singleplayer world (3/4 chance of breakage on each exit).
2020-04-08 14:18:25 +02:00
Jonas Herzig
97f901408e Reduce mixin plugin log message verbosity to debug level 2020-04-08 12:59:59 +02:00
Jonas Herzig
1d7a49907c Fix compilation with Mixin 0.8 on ForgeGradle 2020-04-07 17:20:04 +02:00
Jonas Herzig
9970ac798a Update 1.14.4 fabric-loader (for Mixin 0.8) 2020-04-07 15:40:42 +02:00
Jonas Herzig
5d0ea19c72 Fix rendering not being cancelled until unpaused (fixes #125) 2020-04-07 15:30:40 +02:00
Jonas Herzig
7613fdd4c3 Abort rendering when window receives close request even when paused
Previously we'd get stuck in the paused render loop even when window close was
requested.
2020-04-07 15:26:07 +02:00
Jonas Herzig
31caa68b34 Fix hover pos not respecting gui scale in render gui (fixes #124) 2020-04-07 15:25:19 +02:00
Jonas Herzig
b6ff3855a1 Fix rendering gui framebuffer size when not paused (fixes #126) 2020-04-07 15:10:29 +02:00
Jonas Herzig
3be3072082 Run video rendering from runLater
Prevents any issues arising from the fact that we would otherwise be somewhere
deep in the GUI lib button handling call stack.
2020-04-07 14:51:16 +02:00
Jonas Herzig
3f4156b91b Stop using interrupts to abort the rendering process (fixes #119)
They ended up lingering around and breaking any further blocking operations,
resulting in random errors afterwards. And using them was really unnecessary
anyway.
2020-04-06 20:56:22 +02:00
Jonas Herzig
e3f621b86a Work around the fact that our mixins may be loaded before Optifabric 2020-04-06 20:39:15 +02:00
Jonas Herzig
27bdc78688 Give up on end portal animation mixin when OF is installed 2020-04-06 20:38:53 +02:00
Jonas Herzig
ed6ba740bb Workaround OF breaking spectator hand mixin 2020-04-06 20:37:45 +02:00
Jonas Herzig
4c577c4559 Update non-fabric versions to Mixin 0.8 2020-04-06 20:33:44 +02:00
Jonas Herzig
51e10d890a Update ReplayStudio (fixes #121) 2020-04-06 15:21:39 +02:00
Jonas Herzig
b4a2c1b266 Fix race condition between inbound and injected packets (fixes #118)
In the case of #118, this was resulting in the EntityTrackerUpdate packet (which
contains info on which skin layers should be visible) sometimes ending up before
the SpawnPlayer packet, hence the players outer skin layers being invisible at
the start of the recording.
2020-04-06 15:14:47 +02:00
Jonas Herzig
ee68a63233 Fix Redirect target in MixinRenderLivingBase for 1.15 (see #120)
For some reason this applied fine in a development environment (even though the
method signature changed significantly), hence why I didn't notice it being
broken. It did not work (just like one would expect) in a live environment.
2020-04-06 13:19:11 +02:00
Jonas Herzig
b119d2d127 ./gradlew :1.15.2:setCoreVersion
Also `./gradlew :jGui:1.15.2:setCoreVersion`.
2020-04-06 13:18:37 +02:00
Jonas Herzig
f3c4092c72 Update preprocessor 2020-04-06 12:14:05 +02:00
Jonas Herzig
065d713e94 Update ReplayStudio
338c5a8 RandomAccessReplay: Handle light packets arriving after chunk packet
1658b5e SquashFilter: Fix entity delta position not being reset on teleport
2020-04-02 15:34:56 +02:00
Jonas Herzig
de40b5aa47 Fix spectating via point&click on fabric 2020-04-02 15:31:59 +02:00
Jonas Herzig
c119392c92 Implement chunk forcing during rendering for 1.15 2020-04-02 14:15:05 +02:00
Jonas Herzig
4ea13051fd Disable Blend render mode on 1.15 for now 2020-04-02 10:54:19 +02:00
Jonas Herzig
6113336c37 Disable ContainerLocalRenderInformationAccessor in 1.15 for now
It appears to suffer from https://github.com/SpongePowered/Mixin/issues/390 and
since we don't yet support the ChunkExporter, it's not yet needed anyway.
2020-04-02 10:51:14 +02:00
Jonas Herzig
724c236524 Cache configureRelocation output so we can do up-to-date checks
Saves us from having to run it every time even if the shadowJar task would be
up-to-date anyway.
2020-04-02 10:12:02 +02:00
Jonas Herzig
0b31e8c9df Implement MCVer.getProtocolVersion() for MC<11400 2020-04-02 02:00:18 +02:00
Jonas Herzig
8ce84e39e2 Fix shadowJar task using incorrect jar with loom 2020-04-02 01:59:32 +02:00
Jonas Herzig
c0e27634f4 Fix particle orientation during omnidirectional rendering in 1.15 2020-04-02 00:11:06 +02:00
Jonas Herzig
bf6f71ef89 Fix packet reference counting in MarkerProcessor 2020-04-02 00:11:06 +02:00
Jonas Herzig
2dbd5cde02 Update ReplayStudio 2020-04-02 00:11:06 +02:00
Jonas Herzig
c9285ab4a1 Fix end portal texture animation while replay is paused
Figured out where they moved it.
2020-04-02 00:11:06 +02:00
Jonas Herzig
d5fcdfb8c2 Fix ODS rendering in 1.15 2020-04-02 00:11:06 +02:00
Jonas Herzig
ad523009b4 Fix entity rendering with larger/smaller than actual resolution 2020-04-02 00:11:06 +02:00
Jonas Herzig
4116a3a7c9 Fix path preview rendering in 1.15 2020-04-02 00:11:06 +02:00
Jonas Herzig
b11b9db548 Fix frustum culling during non-ODS omnidirectional rendering
Not sure when this changed (probably with 1.14 update) but it definitely was
before the 1.15 update.
2020-04-02 00:11:06 +02:00
Jonas Herzig
2c3697c2ec Fix cubic rendering orientation 2020-04-02 00:11:06 +02:00
Jonas Herzig
d6559a21fc Get all 1.15 mixins applying 2020-04-02 00:11:06 +02:00
Jonas Herzig
a3e1792fe7 More 1.15 mapping fixes 2020-04-02 00:11:06 +02:00
Jonas Herzig
5315c66943 Cleanup 1.15.2 → 1.14.4 remapping 2020-04-02 00:11:06 +02:00
Jonas Herzig
9e7dc61d20 #ifdef DEV_ENV is no longer applicable since 8bc0b0a
There is no longer a dedicated "core" project where DEV_ENV would be defined,
instead whichever is the currently selected version automatically becomes the
main project using the main src folder.
2020-04-02 00:11:06 +02:00
Jonas Herzig
b69cd9fb81 Fix mode of various files
None of these should be executable, I blame Marius.
2020-04-02 00:11:06 +02:00
Jonas Herzig
527562549b Update 1.14.4 yarn 2020-04-02 00:11:02 +02:00
Jonas Herzig
ba83aa97b3 Update preprocessor plugin, enable configure-on-demand 2020-04-02 00:10:25 +02:00
Jonas Herzig
b3b73609cb Migrate 1.15.1 project to 1.15.2 2020-03-31 14:04:50 +02:00
Jonas Herzig
78ba9bd55e Fix misc preprocessor directives 2020-03-30 15:30:22 +02:00
Jonas Herzig
190210f950 Fix setupCIWorkspace/setupDecompWorkspace
See the linked commits in our FG fork for details.

`:1.8:setupDecompWorkspace` (and only that one) still fails with an unrelated
NPE which I can't be bothered to fix.
2020-03-30 12:46:36 +02:00
Jonas Herzig
9107485c14 Fix compilation for 1.7.10 2020-03-30 12:40:07 +02:00
Jonas Herzig
823e04a858 Fix compilation of 1.9.4 2020-03-30 03:20:13 +02:00
Jonas Herzig
4c6684236b Fix compilation of 1.11.2 2020-03-30 03:18:00 +02:00
Jonas Herzig
8b7ef8d1e3 1.13 is dead (followup to 8bc0b0a) 2020-03-30 02:52:47 +02:00
Jonas Herzig
49ea1ae40a Fix compilation of 1.12.2 2020-03-30 02:52:21 +02:00
Jonas Herzig
13283fb5d2 Fix compilation of 1.14.4-forge 2020-03-30 02:52:13 +02:00
Jonas Herzig
eb1fbed0d8 Fix compilation of 1.15.1 2020-03-30 01:05:26 +02:00
Jonas Herzig
5c13995e59 Fix compilation of 1.14.4 2020-03-30 01:03:46 +02:00
Jonas Herzig
82bbf7b495 Fix ReplayStudio dependency group id 2020-03-29 21:32:44 +02:00
Jonas Herzig
af8803d6b5 WIP 1.15 and ReplayStudio v2 update 2020-03-13 14:18:19 +01:00
Jonas Herzig
8bc0b0a4df Update preprocessor and replace 1.13.2 subproject with 1.14.4-forge
The new preprocessor version brings first-party support for fabric, in
particular for automatically fetching mappings loom and for
automatically remapping between MC versions via intermediary mappings.
This will come in handy when updating to 1.15.

It also supports automatic remapping between fabric and forge on the
same MC version (by going mcp<->srg<->mojang<->intermediary<->yarn).
Therefore this commit replaces the previous 1.13.2 (forge) subproject
with a 1.14.4-forge one. Instead of manually providing full mappings for
1.14.4-fabric to 1.13.2-forge and partial (classes) for 1.13.2-forge to
1.12.2-forge, we now only need partial (classes) for 1.12.2-forge to
1.14.4-forge and preprocessor will take care of the forge to fabric
step (in fact, our mapping file for that is currently completely empty).

In an attempt to write an IDE (IntelliJ) plugin for quicker and easier
working with the preprocessor (e.g. immediately mapping single files
from within the IDE, jumping between different versions for the same
file), the preprocessor gradle plugin declaration now requires you to
explicitly specify variables in the common.gradle and the overall
relationship between projects in the build.gradle (latter is required
anyway, so the plugin can know where it should map between forge and
fabric and which subprojects are which versions).
Since that necessitated some changes to the build.gradle file, I took
the opportunity to convert it to Kotlin. As such we now also use
Gradle's newer plugin-block with the pluginManagement-block instead of
manually declaring buildScript (not for the common.gradle though), which
imo is nicer anyway and comes with various advantages (see gradle docs).

There were also some remapping bugs fixed and some new ones
introduced (e.g. manually declared inner class mappings seem to no
longer function properly under certain conditions).
There's also support for remapping Kotlin now. Just saying.
2020-01-12 23:34:10 +01:00
Jonas Herzig
f51298e2a3 Update Mixin (fixes GH-66) 2019-08-04 17:16:52 +02:00
Jonas Herzig
d8ce4275af Update ReplayStudio for misc MCProtocolLib fixes 2019-08-04 17:13:56 +02:00
Jonas Herzig
c7b0780111 Fix playback once end has been reached on 1.8 (and some above) 2019-08-04 15:06:27 +02:00
Jonas Herzig
94d6e7cb4b Fix mouse wheel speed outside of gui screen on 1.13+ 2019-07-27 11:51:39 +02:00
Jonas Herzig
ea6e452dd0 Pre-release 7 of 2.2.0 2019-07-19 22:44:05 +02:00
Jonas Herzig
7d6c263ce0 Update MCProtocolLib for modded entity attribute types on 1.12.2
E.g. "forge.swimSpeed" introduced in some later 1.12.2 Forge
2019-07-19 21:49:10 +02:00
Jonas Herzig
9c25396016 Gracefully handle incomplete QuickMode cache 2019-07-19 21:49:10 +02:00
Jonas Herzig
1245f38267 Fix 360 camera stabilization on 1.13+ 2019-07-19 21:49:10 +02:00
Jonas Herzig
5bd9b0cb6b Fix LoginCompressionS2CPacket being recorded in replay file on 1.13+ 2019-07-19 21:49:10 +02:00
Jonas Herzig
08f09dca6e Update MCProtocolLib to fix certain chunk unload packets on 1.8(.9) 2019-07-19 19:34:25 +02:00
Jonas Herzig
3cd21b8a78 Guard against corrupted config files on 1.14 2019-07-19 14:48:00 +02:00
Jonas Herzig
67d7af2dc3 Update to MC 1.14.4 2019-07-19 14:25:42 +02:00
Jonas Herzig
c4c4b75022 Pre-release 6 of 2.2.0 2019-07-12 21:06:27 +02:00
Jonas Herzig
4a115cd1a5 Fix NoSuchMethodError due to OpenNBT binary incompatibility on MC<1.12 2019-07-12 19:50:47 +02:00
Jonas Herzig
06fe165249 Fix toString call which breaks due to Windows not defaulting to UFT8 2019-07-12 19:18:32 +02:00
Jonas Herzig
aea222d176 Fix deadlock when jumping backwards in 1.7.10 under certain conditions
Not entirely sure how to fulfill those conditions but the fix should be
fairly self-explanatory anyway.
2019-07-08 14:52:42 +02:00
Jonas Herzig
ac60e58da2 Fix nested runLater on 1.7.10 2019-07-08 11:58:55 +02:00
Jonas Herzig
45ef15359e Fix replay not properly starting during rendering on 1.7.10 2019-07-08 11:30:15 +02:00
Jonas Herzig
6ca1d037c1 Update ReplayStudio (fixes LIGHTNING_BOLT mappings on 1.14) 2019-07-08 10:35:03 +02:00
Jonas Herzig
c4d2be9e89 Make thread requirements of ReplayHandler#setup explicit and fix illegal usage 2019-07-08 09:53:47 +02:00
Jonas Herzig
8261767657 Pre-release 5 of 2.2.0 2019-07-06 22:16:53 +02:00
Jonas Herzig
cdf6ff4419 Update ReplayStudio 2019-07-06 21:36:54 +02:00
Jonas Herzig
a0e397d1d5 Add support for camera roll on 1.7.10 2019-07-06 21:24:26 +02:00
Jonas Herzig
8a75edb218 Fix vanilla keys being handled by VanillaGuiScreen's internal screen
This becomes an issue once e.g. Esc is overwritten to return to the
parent screen instead of no screen (e.g. pressing Esc in JEI recipe).
2019-07-06 20:28:52 +02:00
Jonas Herzig
e497e5930b Fix event dispatching between layered VanillaGuiScreen on MC<=1.12.2 2019-07-06 20:00:22 +02:00
Jonas Herzig
989a54b067 Fix stack overflow after entity tracker popup has been shown
Failure to load the entity tracker usually (not always) results in
`entityTracker` remaining to be `null`, so there has to be an additional
condition for aborting the thenRun-loadEntityTracker-…-recursion.
2019-07-06 17:37:28 +02:00
Jonas Herzig
31d327efc7 Fix entity tracker loading error popup never being shown 2019-07-06 17:35:10 +02:00
Jonas Herzig
d47c899ef8 Fix advanced screenshot writer (switch from rgb to bgra) 2019-07-06 13:59:46 +02:00
Jonas Herzig
55924c1d46 Fix serialization of settings on Fabric 2019-07-06 13:05:20 +02:00
Jonas Herzig
731ea1ab9f Fix NPE when adding marker during recording before player is spawned
Can happen e.g. when auto-recording is disabled
2019-07-06 12:56:39 +02:00
Jonas Herzig
67e300bcff Fix NPE in MarkerProcessor when unnamed markers are present 2019-07-06 12:50:31 +02:00
Jonas Herzig
dc86da7a20 Pre-release 4 of 2.2.0 2019-06-30 22:20:38 +02:00
Jonas Herzig
7eecb2664d Fix rendering of sky (or anything with textures disabled) during ODS 2019-06-30 20:32:54 +02:00
Jonas Herzig
7299ecd0ce Fix main/offhand items of spectated player not being updated 2019-06-30 15:46:52 +02:00
Jonas Herzig
4fe2fee456 Fix constant equip sound when spectating player with head gear in replay 2019-06-30 15:46:09 +02:00
Jonas Herzig
b2b0ca1cd1 Fix recording of certain mobs on Hypixel
For some reason hypixel is sending duplicate entity meta data entries
in their spawn packets.
We'll now be ignoring all but the last one for each id (should match
how vanilla handles these).
2019-06-30 13:14:47 +02:00
Jonas Herzig
7241036e61 AWT is forbidden on 1.13+ (this includes BufferedImage)
Instead use NativeImage on 1.13+ via newly introduced Image class.
See Image docs for details.

Also fixes an issue with thumbnail taking on 1.13+: The original
ScreenshotHelper method is now async, luckily there's a sync
variant and as a bonus it directly returns a NativeImage so we can
skip having to read the screenshot from disk.
2019-06-30 12:12:13 +02:00
Jonas Herzig
732e1ab32e Update ReplayStudio to fix illegal reflection issue on JDK12 2019-06-29 15:09:31 +02:00
Jonas Herzig
954052aaa0 Pre-release 3 of 2.2.0 2019-06-28 18:28:23 +02:00
Jonas Herzig
c051b0ba3b Fix crash when quickly double-clicking the "Load"-replay button
This has previously been fixed for quadruple-clicking on the replay
itself but for some reason has not been fixed for simply double-clicking
the "Load" button.
2019-06-28 17:38:55 +02:00
Jonas Herzig
801f0871d5 Fix framebuffer resizing for rendering on 1.13+ 2019-06-28 17:23:07 +02:00
Jonas Herzig
fcb8cc329b Fix second column of RM settings being displaced by long dropdown labels 2019-06-28 16:57:25 +02:00
Jonas Herzig
a9f7e09e64 Fix RM settings being shown in random order 2019-06-28 16:56:15 +02:00
Jonas Herzig
2351698b66 Show popup when replay saving/postprocessing fails
because asking people for logs turned out to not be a viable strategy
when they can figure out how to get back their replay on their own…
2019-06-28 16:43:13 +02:00
Jonas Herzig
94d2e523ab Fix crash when converting position for newly appended element
E.g. happens when clicking on newly added elements in a resource loading
list before those were rendered at least once.
2019-06-28 16:10:33 +02:00
Jonas Herzig
9320bd931b Fix container GUIs opening in 1.14+
Not sure why MC has yet another packet for those now but tbh idc.
2019-06-28 15:29:40 +02:00
Jonas Herzig
654a640a60 Fix tracking of enabled state for primary texture 2019-06-28 15:01:45 +02:00
Jonas Herzig
214da6ba59 Update to MC 1.14.3 2019-06-24 18:36:12 +02:00
Jonas Herzig
1f547f92ce Fix core module not being included in 1.7.10
Probably a remnant of when we used a different gradle version for it.
2019-06-24 17:15:33 +02:00
Jonas Herzig
862c8d9b36 Update preprocessor
- Switch from ECJ to IDEA (with potential for kotlin)
- Can pull SRG mappings from FG, reducing amount of manual mappings (basically just class mappings and fixing errors in SRG mappings)
2019-06-24 17:15:33 +02:00
Jonas Herzig
b846d5308e Fix FullBrightness having no effect during rendering 2019-06-21 22:20:45 +02:00
Jonas Herzig
e7deed73b5 Fix NPE when jumping to beginning of replay (before player is spawned) 2019-06-21 22:14:22 +02:00
Jonas Herzig
4213d37c76 Fix race-condition-induced dead lock on replay restart in 1.14+
MC clears it scheduled tasks on disconnect. If we don't wait for
that to have happened on the async sender, then we might loose
some of the initial handshake packets (resulting in a dead lock in
fabric's registry syncing code).
2019-06-21 22:06:04 +02:00
Jonas Herzig
25ec311c86 Pre-release 2 of 2.2.0 2019-06-21 15:01:51 +02:00
Jonas Herzig
4ec5ef75a1 Fix various replay editor issues caused by shadow plugin bug 2019-06-21 15:00:08 +02:00
Jonas Herzig
75c4c7213f Fix NPE applying camera keyframes when camera entity is not yet loaded
Still not sure when this can happen but users are reporting it:
https://www.replaymod.com/forum/thread/2548#post10627
2019-06-21 12:05:05 +02:00
Jonas Herzig
f1f760a0e9 [1.14] Fix ingame menu buttons with ModMenu installed 2019-06-21 07:34:22 +02:00
Jonas Herzig
b8d319eba9 Skip world during video rendering if it has not yet been loaded 2019-06-21 07:34:22 +02:00
Jonas Herzig
de0f40f4dd [1.14] Allow opening of replay settings via ModMenu 2019-06-20 18:44:38 +02:00
Jonas Herzig
5305352b77 [1.14] Mark mod as client-side-only in ModMenu 2019-06-20 18:44:26 +02:00
Jonas Herzig
44a70c8ecf [1.14] Fix invalid mod icon (icons on fabric must be square) 2019-06-20 18:44:26 +02:00
Jonas Herzig
481b7b4c9d [1.14] Fix ModMenu buttons clashing with RM buttons on main menu 2019-06-20 18:44:10 +02:00
Jonas Herzig
b7136e6d70 [1.14] Fix camera entity after restarting replay (same as 1eafc3f) 2019-06-20 18:44:10 +02:00
Jonas Herzig
70acd79431 Allow continued use of most of pathing even if entity tracker fails
The failing entity tracker really only breaks spectator keyframes.
This is also very desirable for minimal mode where entity tracker
failure is highly likely.
2019-06-20 18:44:10 +02:00
Jonas Herzig
af55951f42 Introduce minimal mode (allows RM to run on unsupported MC versions)
by disabling various version-specific features (i.e. everything which
requires the ReplayStudio).
2019-06-20 18:44:10 +02:00
Jonas Herzig
357501e5db Qualify some (remapped) field references which the preprocesser ignored
The preprocessor should have complained about these but it didn't for
some reason. This commit isn't fixing any imminent bug, it's just
precautionary (and required to compile once the preprocessor is fixed).
2019-06-17 12:04:51 +02:00
Jonas Herzig
679e4805a0 Fix error popup in replay editor being off-screen 2019-06-17 12:01:39 +02:00
Jonas Herzig
e59b5db859 Fix the replay editor now showing non-IO exceptions during processing
Instead it just froze which is unhelpful if people don't look at the log.
2019-06-17 11:52:47 +02:00
Jonas Herzig
d417c58d00 Pre-release 1 of 2.2.0 2019-06-14 22:35:44 +02:00
Jonas Herzig
bf2d72976c Fix rendering with OF F1_pre13 (via OptiFabric) installed
Note that to run it in dev env, one must switch back fabric-api to 0.2.
2019-06-14 22:16:18 +02:00
Jonas Herzig
d02b239e74 Fix incorrect RM config location
While I might wish it was `configs`, the world (forge) has settled on
`config`.
2019-06-14 22:09:56 +02:00
Jonas Herzig
73723ed9e2 Guard against broken render settings file 2019-06-14 22:09:56 +02:00
Jonas Herzig
8112c852ef [1.14] Fix NPE in FullBrightness
Turns out fabric's init runs earlier than forge so mc.options is still
null.
Instead we just store mc and access the options when needed (thanks to
the preprocessor that's even shorter than before).
2019-06-14 22:09:56 +02:00
Jonas Herzig
a76268138a [1.14] Fix recording player's hand not swinging 2019-06-14 22:09:56 +02:00
Jonas Herzig
1eafc3fadf [1.14] Fix closing of replay not actually fully shutting down the world 2019-06-14 22:09:56 +02:00
Jonas Herzig
4dd02f8299 [1.14] Fix recording not always being stopped 2019-06-14 22:09:56 +02:00
Jonas Herzig
d15fa6a3f9 Fix notice screen back buttons not being hooked up 2019-06-14 22:09:56 +02:00
Jonas Herzig
a840cadfb7 Fix camera event handler staying registered leading to lack of HUD
When unloading the camera without killing it first (e.g. jumping back
in time), the event handler wouldn't ever get unregistered.
2019-06-14 22:09:56 +02:00
Jonas Herzig
2a08c11598 [1.7.10] Fix dead lock and NPE when jumping backwards in replays
The deadlock is a regression due to login phase inclusion.
Not sure about the NPE, it might have always existed.
2019-06-14 22:09:56 +02:00
Jonas Herzig
c72392fb62 Fix various NPE while in replay on 1.8.9 or below
Nulling the world and calling runTick proved to be too volatile, so
instead let's try performing an early return from runTick via mixin.
2019-06-14 14:49:54 +02:00
Jonas Herzig
560982a14a Fix NPE when replay is closed but camera entity is still being rendered 2019-06-14 14:09:42 +02:00
Jonas Herzig
047f216f73 [1.7.10] Fix event handler visibility 2019-06-14 14:04:52 +02:00
Jonas Herzig
898e29d7a1 [1.7.10] Fix crash when opening replay
Looks to be two regressions, one due to login phase inclusion and one
due to simplification of InputReplayTimer.
2019-06-14 13:35:53 +02:00
Jonas Herzig
208b9c1b60 Update to MC 1.14.2 2019-05-28 11:55:58 +02:00
Jonas Herzig
d89655e69a Remove some more preprocessor statements in favor of remap 2019-05-28 11:25:46 +02:00
Jonas Herzig
f3acf8cde7 Fix realms icon offsets in main menu on 1.14+ 2019-05-25 20:07:27 +02:00
Jonas Herzig
e7d96fca2a Fix lack of hand when spectating player in replay on 1.13+ 2019-05-25 19:45:53 +02:00
Jonas Herzig
cfdc4b9713 Remove workaround for super-super-class remapping bug 2019-05-25 18:57:32 +02:00
Jonas Herzig
26d8c97136 Switch to custom FG fork for Gradle 5 compatibility
Also drop MixinGradle since it supports neither Gradle 5 nor FG1 nor FG3
2019-05-24 16:26:01 +02:00
Jonas Herzig
a57ce21ebb Update Gradle Wrapper to 5.4.1 2019-05-24 16:26:01 +02:00
Jonas Herzig
5f57f3a1e2 Fix incompatible OpenNBT version on 1.12.2 and below 2019-05-24 16:25:24 +02:00
Jonas Herzig
62c673f4bc Update jGui to fix NPE in file chooser gui on windows
Regression introduced in 213ac13627178f49ce9671b29b6a542cb0e4c922
2019-05-24 10:59:55 +02:00
Jonas Herzig
05aec482c9 Fix classic camera movement (regression from switching to lwjgl vecs) 2019-05-22 11:04:10 +02:00
Jonas Herzig
5e407cc9aa Fix translations in replay recovery gui 2019-05-22 10:41:41 +02:00
Jonas Herzig
41251a1e18 Update ReplayStudio to remove ViaVersion server plugin classes 2019-05-21 20:43:28 +02:00
Jonas Herzig
cc9f2828c1 Fix world being set to null on replay restart when in sync mode 2019-05-21 11:04:38 +02:00
Jonas Herzig
8627867b62 Fix render preview (broken due to BGRA changes)
Also de-duplicates some code by combining >=1.13 and <1.13
2019-05-21 10:37:39 +02:00
Jonas Herzig
cf30f39b0e Be explicit about when we expect a login phase and when we don't 2019-05-20 18:57:20 +02:00
Jonas Herzig
2d02948203 Remove old replay editor gui screens 2019-05-20 18:55:07 +02:00
Jonas Herzig
993cdeab73 Work around mixin bug where a non-@Shadow field is treated as @Shadow
Note: Happens on 1.12.2 (different mappings than 1.14.1) and probably
only in dev env.
2019-05-20 18:37:40 +02:00
Jonas Herzig
fc1d99f985 Fix mouse input to overlays while the replay is paused in 1.8-1.12.2 2019-05-20 17:34:07 +02:00
Jonas Herzig
3a45147974 Move Mixins which exist specifically for jGui from RM to jGui repo 2019-05-20 17:18:12 +02:00
Jonas Herzig
1ef4f605d7 Fix accidental relocating of guava, commons-io and apache-logging (all provided by MC) 2019-05-20 17:08:19 +02:00
Jonas Herzig
e5ee6a3d94 Update to MC 1.14.1
The ReplayStudio update also fixes an issue with reading the
PlayerListEntryPacket leading to NPEs during Quick Mode.
2019-05-20 14:59:31 +02:00
Jonas Herzig
0e086d91a6 Use own event distribution system instead abusing fabric's one 2019-05-20 14:59:13 +02:00
Jonas Herzig
7cbf7f7c94 Switch core to 1.14 (generated via ./gradlew :1.14:setCoreVersion) 2019-05-10 14:09:22 +02:00
Jonas Herzig
7f7d33def8 Fail hard if versions/core/mcVersion is missing 2019-05-10 14:06:40 +02:00
Jonas Herzig
5f37ba48ff Reduce amount of 'relocate' statements for far better build times 2019-05-09 18:47:45 +02:00
Jonas Herzig
69e80fb3f4 Update Preprocessor to fix parallel builds 2019-05-09 17:45:26 +02:00
Jonas Herzig
7b97d9ea85 Use FG1.2 fork with Gradle 4.9 fixes so we can build everything at once 2019-05-08 14:00:46 +02:00
Jonas Herzig
362f61a337 Sign .drone.yml
Forgot to do it in f1527c51
2019-05-07 13:29:58 +02:00
Jonas Herzig
f1527c51fe Fix -dirty suffix of 1.7.10 build on CI 2019-05-07 12:49:53 +02:00
Jonas Herzig
d54905713f Fix mouse scroll and screenshot mixin targets 2019-05-07 12:48:36 +02:00
Jonas Herzig
6ba05f3d99 Fix resource pack recorder mixin
The old targets weren't inside the method but inside an inner class.
2019-05-07 11:59:06 +02:00
Jonas Herzig
2463e5dbf0 Work around bug in fabric's mapping provider (or Mixin itself?)
See https://github.com/FabricMC/fabric-mixin-compile-extensions/issues/1
2019-05-07 11:21:33 +02:00
Jonas Herzig
0f9150d7ce Fix modifier of scroll handler method 2019-05-07 10:30:20 +02:00
Jonas Herzig
2c843f4b45 Fix spectated player hand swinging 2019-05-06 23:31:35 +02:00
Jonas Herzig
6b9b9c2131 Get rid of annotation workaround (by not referencing affected classes) 2019-05-06 23:31:35 +02:00
Jonas Herzig
bd91d0d3bd Get rid of all the ATs in favor of Mixins 2019-05-06 22:46:21 +02:00
Jonas Herzig
2094c518a0 Fix :shadowJar task. Take 2.
This time, wait for the subprojects to be evaluated before trying
to get their shadowJar tasks (otherwise they won't be there).
2019-05-06 13:31:50 +02:00
Jonas Herzig
1d21002eb0 Run shadowJar and setCoreVersion in same gradle invocation on CI 2019-05-06 11:33:40 +02:00
Jonas Herzig
b55dce280c Fix :shadowJar task
It now copies any shadowed jar in any configured subprojects
instead of requiring all subprojects
2019-05-06 11:05:33 +02:00
Jonas Herzig
a65f3efbc5 Fix fetching of remap in jGui 2019-05-05 13:33:23 +02:00
Jonas Herzig
a02fe4e985 More FG build classpath workarounds
Though this one seems to have a different cause from the previous
one.
2019-05-05 13:26:53 +02:00
Jonas Herzig
2b4bee84f0 Fix preprocessor version in jGui 2019-05-04 20:41:25 +02:00
Jonas Herzig
08ff063a3b Fix 1.7.10 jar not being archived after drone build 2019-05-04 20:31:53 +02:00
Jonas Herzig
220b22869a Fix replay initialization with login phase on 1.11.2 and below
While this commit also considerably simplifies/cleans the setup
method, the actual fix is that the networkManager is now added
to the channel pipeline with under the "packet_handler" key,
whereas before it was unnamed causing issues when transitioning
to the play state.
2019-05-04 19:22:41 +02:00
Jonas Herzig
af86faeaf9 Fix webm encoding preset (caused by BGRA changes) 2019-05-04 15:27:03 +02:00
Jonas Herzig
3d009e45c7 Update to MC 1.14 / Fabric 2019-05-04 15:27:03 +02:00
Jonas Herzig
17fe5b345f Replace all ATs with Mixin on 1.13+ in preparation for Fabric 2019-04-26 12:04:33 +02:00
Jonas Herzig
d5b9e60c4d Workaround class loader errors by loading single guava in the root scope
Possibly related to gradle/gradle#4823 as it only appeared after
using evaluationDependsOn (via The Preprocessor and on jGui).
2019-04-25 09:17:07 +02:00
Jonas Herzig
2d572f6740 Get restrictions module "compiling" on 1.13 2019-04-24 19:26:43 +02:00
Jonas Herzig
6f15df8081 Get compat module compiling on 1.13 2019-04-24 19:26:43 +02:00
Jonas Herzig
df6f744d51 Update preprocessor to fix encoding issues 2019-04-24 17:17:53 +02:00
Jonas Herzig
7cff2e0cf3 Get 1.7.10 working with source remapping
Requires changing the 'core' version to 1.8 before compiling
2019-04-24 17:17:53 +02:00
Jonas Herzig
2ee91515f7 Make use of the source remapping feature of The Preprocessor plugin 2019-04-24 15:38:34 +02:00
Jonas Herzig
6127e0a027 Replace dev-only reflection with access transformer entry 2019-04-24 14:03:17 +02:00
Jonas Herzig
fa8f8f52aa Stop using @SneakyThrows since it breaks the JDT used for source remap 2019-04-24 13:41:06 +02:00
Jonas Herzig
9968f81073 Split source preprocessor into separate gradle plugin 2019-04-21 01:40:39 +02:00
Jonas Herzig
73597dd031 Fix camera being reset to 0/0/0 when jumping in quick mode in 1.13 2019-03-27 11:04:41 +01:00
Jonas Herzig
b8c892fcd4 Fix initialization of quick mode with login phase
Replay is always already past the login phase when quick mode is
enabled, hence the LoginSuccess packet must not be sent.
2019-03-27 10:58:37 +01:00
Jonas Herzig
2c0ae426de Fix drone build 2019-03-15 19:04:54 +01:00
Jonas Herzig
cf592bdedb Skip netty when shading libs (MC already provides it) 2019-03-15 17:50:22 +01:00
Jonas Herzig
2997d3e8f6 Update ReplayStudio for ViaVersion 1.12.2 and 1.13.2 support 2019-03-15 17:12:15 +01:00
Jonas Herzig
44151876cd Add task which collects shadowed jars in root project build/libs folder 2019-03-15 14:50:56 +01:00
Jonas Herzig
f795b27251 Use shadow gralde plugin on 1.8+ and enable its minimize option
Cuts RM jar sizes in half.
2019-03-15 13:43:05 +01:00
Jonas Herzig
fc0f070721 Make our non-shading of Mixin's deps explicit 2019-03-15 10:51:15 +01:00
Jonas Herzig
2e29632fab Merge branch 'johni/blend' into johni/1.13-pre 2019-03-15 10:49:38 +01:00
Jonas Herzig
1e1104f4d3 Add blend export to GuiRenderSettings 2019-03-14 18:20:17 +01:00
Jonas Herzig
7cc62b13c1 Fix blend compilation on pre-1.13 2019-03-14 18:20:17 +01:00
Jonas Herzig
3cb1d8189b Preshadow lwjgl_util instead of copying source of specific classes 2019-03-14 18:20:17 +01:00
Jonas Herzig
dc6de5bd5f Apply rotation and scale to entity (livingbase), not its parts
Reduces amount of keyframes per entity and makes it easier to work with.
2019-03-14 11:30:40 +01:00
Jonas Herzig
cd16e014d1 Vastly improve performance of major block name generation 2019-03-13 22:03:03 +01:00
Jonas Herzig
22ab39c2db Get blend export running on 1.13 2019-03-13 19:10:44 +01:00
Jonas Herzig
4eb5d2d9cf Preshadow lwjgl_util instead of copying source of specific classes 2019-03-13 18:32:05 +01:00
Jonas Herzig
106f14d8c7 Merge branch 'johni/1.13-pre' into johni/blend 2019-03-13 16:07:32 +01:00
Jonas Herzig
443c1ca2af Render to BGRA instead of RGB format for better performance on most GPUs 2019-03-13 15:27:53 +01:00
Jonas Herzig
27efc3c717 Fix pre-1.13 imports 2019-03-13 14:52:11 +01:00
Jonas Herzig
d7f2cba214 Update ReplayStudio to fix SquashFilter as used by MarkerProcessor 2019-03-13 13:55:28 +01:00
Jonas Herzig
2d7696b09e Fix NPE in MarkerProcessor when done 2019-03-13 12:06:35 +01:00
Jonas Herzig
1db94b7871 Fix timestamp of squashed packets in MarkerProcessor 2019-03-13 11:50:18 +01:00
Jonas Herzig
681e803d44 Update ReplayStudio for custom entity attribs and binary tracker cache 2019-03-13 11:46:12 +01:00
Jonas Herzig
1d88ca044d Add "Edit" button to replay viewer gui 2019-03-12 20:11:07 +01:00
Jonas Herzig
51c073012e Re-work Replay Editor UI 2019-03-12 19:44:34 +01:00
Jonas Herzig
eb6e7b79d0 Add start/stop/pause/resume recording functionality
Using automatically applied, ReplayStudio-based post processing.
2019-03-12 13:29:21 +01:00
Jonas Herzig
fe68f76bd1 Remove accidentally added mixin-hack subproject inclusion 2019-03-11 18:52:00 +01:00
Jonas Herzig
9d315134fc Fix packet re-encoding in pre-1.13 versions 2019-03-11 18:16:23 +01:00
Jonas Herzig
32de147ae2 Update ReplayStudio for dedicated replay cache
Also change artifact back from localMaven to jitpack
2019-03-11 17:51:53 +01:00
Jonas Herzig
fde807f8ff Fix pack.mcmeta for pre-1.13 versions 2019-03-11 17:29:22 +01:00
Jonas Herzig
79f02b5dfb Fix regression in MixinRenderItem redirect method signature 2019-03-11 15:48:11 +01:00
Jonas Herzig
8526264dab Disable reproducible builds for now since people keep breaking it
Need to re-enable it before 1.13 release since it's required for sigs.
2019-03-11 15:24:55 +01:00
Jonas Herzig
4da57dceb0 Fix GSON dependency configuration for FG3 2019-03-11 15:13:31 +01:00
Jonas Herzig
0f3a6253e0 Complete all currently actionable 1.13.2 FIXMEs 2019-03-11 15:13:31 +01:00
Jonas Herzig
e9ca1bb47e Fix FOV during 360 rendering 2019-03-11 15:13:31 +01:00
Jonas Herzig
5f0bd1cf5d Only update uniforms when ODS shader is bound (fixes GL errors) 2019-03-11 15:13:31 +01:00
Jonas Herzig
cdcd6f6893 Get render module mostly working 2019-03-10 16:59:59 +01:00
Jonas Herzig
f8fc3462e8 Get recording and replay working 2019-03-10 14:15:14 +01:00
Jonas Herzig
8705bbad9a Re-enable and fix building for older MC versions 2019-03-09 13:08:47 +01:00
Jonas Herzig
528791c91f fixup snapshot 2019-03-02 15:10:15 +01:00
Jonas Herzig
f13f2dda1c Get extras module compiling on 1.13
Remove LocalizationExtra (too much update work for too little gain)
2019-03-02 09:59:57 +01:00
Jonas Herzig
c8cf4d66c5 Get editor module compiling on 1.13 2019-03-01 17:22:50 +01:00
Jonas Herzig
cae970ec6b Get online module compiling on 1.13 2019-03-01 17:22:50 +01:00
Jonas Herzig
1727702de4 Get simplepathing module compiling on 1.13 2019-03-01 17:22:50 +01:00
Jonas Herzig
344a550dc1 Get render module compiling on 1.13 2019-03-01 17:22:50 +01:00
Jonas Herzig
641014b0d1 Get pathing module compiling 2019-03-01 17:22:50 +01:00
Jonas Herzig
c1fefdeb3c Get core, recording and replay modules compiling on 1.13.2 2019-03-01 17:22:50 +01:00
Jonas Herzig
b6a4206816 Update FG3 and Forge from git version to first official snapshots 2019-03-01 17:22:50 +01:00
Jonas Herzig
1e584769af Misc 1.13 progress 2019-03-01 17:22:50 +01:00
Jonas Herzig
1470123ec9 Get replay module compiling on 1.13 2019-03-01 17:22:50 +01:00
Jonas Herzig
9655677972 Start update to 1.13 2019-03-01 17:22:50 +01:00
Jonas Herzig
65295b311e Merge branch 'spherical-fov' into develop 2018-12-19 10:20:23 +01:00
Jonas Herzig
3bc9bb32b9 Merge branch 'fix-bitrate-label' into develop 2018-12-19 10:18:01 +01:00
Jonas Herzig
c575049bd9 Merge branch 'johni/quick-mode' into develop 2018-12-19 10:17:45 +01:00
Jonas Herzig
3f7818aeec Auto-save the current timeline after changes and on exit
This auto-saved timeline is loaded when the replay is opened the next time.
2018-12-18 15:04:21 +01:00
Jonas Herzig
c1b4964978 Handle entity position interpolation when jumping in quick mode 2018-12-18 13:32:26 +01:00
Jonas Herzig
1da7060bb2 Fix entity head rotation in quick mode 2018-12-18 12:55:51 +01:00
Jonas Herzig
5366758cf6 Compress packets to reduce quick mode memory usage by ~80% 2018-12-18 12:43:39 +01:00
Jonas Herzig
60ef8df523 Add Quick Mode keybinding translation key 2018-12-18 10:48:31 +01:00
Jonas Herzig
2737077828 Retain camera position when switching to and from quick mode 2018-12-18 10:44:57 +01:00
Jonas Herzig
1670ed4e80 Fix dead lock when switching from async to quick mode 2018-12-18 10:44:42 +01:00
Jonas Herzig
c30520ad3d Fix previous block state of BlockChange being loaded incorrectly 2018-12-18 10:04:46 +01:00
Jonas Herzig
e989b60ea8 Properly handle non-full chunks in QuickReplaySender 2018-12-18 10:04:46 +01:00
Jonas Herzig
c8ecd17fe9 Re-write QuickReplaySender caching to be significantly more memory efficient 2018-12-18 10:04:46 +01:00
Jonas Herzig
3319d4263c Ensure replay has ended when MP GUI is opened (fixes #134) 2018-12-17 15:01:01 +01:00
Jonas Herzig
c94f5d17f4 Fix packet data being trashed by Restore Replay GUI (fixes #129) 2018-12-17 14:42:03 +01:00
Jonas Herzig
d791eedae9 Replace dropdown replay selection with popup in ReplayEditor (fixes #132) 2018-12-17 14:00:44 +01:00
CrushedPixel
2f44d5f380 GuiRenderSettings: Fix bitrate label 2018-12-06 14:47:29 +01:00
CrushedPixel
7c3fcd4e42 Adjustments for consistency 2018-12-06 14:18:55 +01:00
CrushedPixel
a7ec6524b7 Add FOV slider for spherical render methods
Before uploading to YouTube, convert all spherical non-mp4 files to mp4 to be able to inject metadata
Properly re-throw errors during the rendering pipeline
2018-12-06 01:29:31 +01:00
Jonas Herzig
ef368254cd Merge branch 'stable' into johni/quick-mode 2018-08-31 12:44:00 +02:00
Jonas Herzig
20dfebbc2a Release 2.1.4 2018-08-25 14:23:32 +02:00
Jonas Herzig
8e2b0c304c Merge branch 'johni/fix-optifine-e1' into develop 2018-08-25 13:48:05 +02:00
Jonas Herzig
a9e32a53ea Update jGui (fixes "Cannot convert pos unless rendered at least once.") 2018-08-25 13:47:31 +02:00
Jonas Herzig
85a167a0d5 Fix camera position being able to become NaN with classic controls
To reproduce, hold A for about a second, then release A and press D in the same frame.
2018-08-25 11:06:24 +02:00
Jonas Herzig
73c52b5cf0 Backport quick mode to 1.9.4+ and disable below 2018-08-22 17:40:57 +02:00
Jonas Herzig
b6a7d3bcda Disable maven artifact checksum verification because Mojang keeps breaking it
(and so do some maven repos) and I can't be bothered to constantly fix it.
2018-08-22 14:07:48 +02:00
Jonas Herzig
34343a809f Update ReplayStudio (fixes #131) 2018-08-22 13:32:42 +02:00
Jonas Herzig
3db9d58f8f Handle Respawn packet in QuickReplaySender 2018-07-28 13:07:57 +02:00
Jonas Herzig
ec5ffe3e02 Add caching to the quick replay sender 2018-07-28 12:59:58 +02:00
Jonas Herzig
42a2ae35ed fixup quick weather 2018-07-27 21:26:55 +02:00
Jonas Herzig
12605f51de Add GUI popup for initializing quick mode and signaling failures 2018-07-27 19:50:40 +02:00
Jonas Herzig
6cb207fd47 Also track weather and time during quick replay mode 2018-07-27 18:49:06 +02:00
Jonas Herzig
ad9c82c991 Fix compatibility with Optifine 1.12.2 E1
Optifine has changed some package names, this commit deals with that.
2018-07-20 11:05:21 +02:00
Jonas Herzig
edc54ce6d4 Add quick replay mode
Allows very quick forwards and backwards jumping at the cost of only
replaying entity positions and block updates.

Still needs to be backported from 1.12.2 and contains FIXMEs
2018-07-18 21:55:03 +02:00
Jonas Herzig
8314803cda Use "-dirty" for marking dirty builds because Windows doesn't like "*" 2018-06-12 22:24:57 +02:00
Jonas Herzig
832413dda0 Set default memory for gradle JVM (fixes #32)
See: https://github.com/MinecraftForge/MinecraftForge/pull/3361
2018-06-12 22:24:05 +02:00
Jonas Herzig
c48187e784 Disable .blend export for 1.7.10 2018-06-11 00:31:50 +02:00
Jonas Herzig
c5229628e3 Merge branch 'stable' into blend 2018-06-11 00:31:25 +02:00
Jonas Herzig
f96e715b0b Release 2.1.3 2018-06-10 17:59:22 +02:00
Jonas Herzig
16b40a5725 Only try to sign jars if the current call built any 2018-06-10 17:59:22 +02:00
Jonas Herzig
38892026c5 Add .gitkeep to versions/1.7.10 directory
This is required for it to be included in the versions.json
on the master branch for the next release.
2018-06-10 16:43:37 +02:00
Jonas Herzig
ab4153f375 Update ReplayStudio to fix custom potion effects (fixes #126) 2018-06-10 16:06:45 +02:00
Jonas Herzig
5e6a85d475 Update dependency checksums 2018-06-10 13:39:21 +02:00
Jonas Herzig
1b9d430176 Handle unbalanced quotes in ffmpeg arguments (fixes #119) 2018-06-10 13:12:42 +02:00
Jonas Herzig
62d2ce4b37 Fix crash when in replay with Optifine 1.12.2 DX (fixes #120)
Re-creating the RenderChunk lost any custom data Optifine had in them which
resulted in NPEs.
The reason we re-create the RenderChunks is because otherwise, once it's
assigned an empty chunk once, it's not getting any further update even when
moving back to filled chunks. Since just calling setNeedsUpdate works as well,
this commit changes the whole mixin to doing that instead.
2018-06-09 23:55:39 +02:00
Jonas Herzig
efaa5b7c41 Shouldn't release jars be final..
Well, looks like the jcenter repo doesn't care because the hash for
one of its jars has changed (a few bits in the jar were flipped).
Maven Central is still serving the original version, so we have to allow
both hashes.
2018-04-03 16:17:33 +02:00
Jonas Herzig
fb1254ce12 Merge branch 'johni/1.7.10' into johni/develop 2018-04-02 11:53:06 +02:00
Jonas Herzig
277e55a241 [1.7.10] Workaround for crash when loading replay with TCNodeTracker (fixes #118) 2018-04-02 11:52:11 +02:00
Jonas Herzig
3f00c1f977 [1.7.10] Update ReplayStudio to fix custom entity types (fixes #117) 2018-04-02 11:51:42 +02:00
Jonas Herzig
feb39f02ec Fix Optifine language data missing when localization extra is enabled (fixes #109) 2018-03-22 14:52:12 +01:00
Jonas Herzig
65e3d45c9b Switch submodules from ssh to https 2018-03-16 17:34:24 +01:00
Jonas Herzig
8b044b344a [1.7.10] Remove unnecessary pre-MixinGradle configuring in common.gradle 2018-03-16 16:59:15 +01:00
Jonas Herzig
9631f1cf5f [1.7.10] Fix recording player y position 2018-03-16 16:57:08 +01:00
Jonas Herzig
63b2f3abcc Add transformer exclusion for transformers and fix transforming of null classes 2018-03-16 16:57:08 +01:00
Jonas Herzig
0b262d1a74 [1.7.10] Fix reobf task missing fields due to incorrect classpath
The reobf task was not handling certain fields because it was missing
the respective classes on its classpath because we removed MC&deps
from the compile configuration.
2018-03-16 16:55:19 +01:00
Jonas Herzig
75a14a7488 Catch _all_ errors during recording setup 2018-03-16 16:55:19 +01:00
Jonas Herzig
031582957f Merge branch 'stable' into develop-1.7.10 2018-03-16 13:03:22 +01:00
Jonas Herzig
e32dab8749 Add 1.7.10 to reprod / drone build 2018-03-16 13:01:33 +01:00
Jonas Herzig
3e23826c8d [1.7.10] Fix recording of chunk packets in MP (fixes #98) 2018-03-16 13:01:33 +01:00
Jonas Herzig
eb04eb47dc Add 1.7.10 version 2018-03-16 13:01:33 +01:00
Jonas Herzig
0a26f59c9c Release 2.1.2 2018-03-15 23:12:53 +01:00
Jonas Herzig
9cdd1bbca8 Sign jars based on current commit instead of tag 2018-03-15 22:56:40 +01:00
Jonas Herzig
31a9e4eaf6 Fix preprocessor not processing ifdef 2018-03-15 22:17:51 +01:00
Jonas Herzig
221991bf2c Do not shade gson lib (fixes #115)
The gson lib is provided by MC anyway.
Additionally, by shading it, we relocate the lib via the FG reobfJar
task which doesn't properly handle annotations causing the Mixin
lib's MixinConfig to no longer parse properly.
2018-03-15 22:17:28 +01:00
Jonas Herzig
48b39fe551 Update MCProtocolLib (via ReplayStudio)
Primarily because of
1728e10 Default to no team color when receiving unknown values.
63e06fa Remove hard bitsPerEntry limit, enforce minimum of 4.
6de0593 Add CustomStatistic as fallback for custom or unimplemented statistic IDs.
2018-03-11 20:57:00 +01:00
Jonas Herzig
76be6c1d2e Fix dead lock when jumping backwards in time during rendering
A jump backwards in time entails unloading the current world and with it
the ChunkRenderDispatcher that the ChunkLoadingRenderGlobal has locked.
2018-03-11 13:45:19 +01:00
Jonas Herzig
13d5586583 Fix trimming of replays not actually removing any packets (fixes #113)
The init method of the Squash filter has never been called therefore it had
never registered its packets and was never able to properly function.
2018-03-11 12:29:51 +01:00
Jonas Herzig
34172cd737 Fix race condition due to ReplaySender in async mode during setup()
The ReplaySender used to be started in async mode even before the call
to setup(). If the ReplaySender restarts the replay before the setup()
call finishes, that call may instead produce a NPE in
clientToServerHandshake().
To fix this race condition, the ReplaySender is always started in sync
mode and only switched to async after the setup() call.
2018-03-11 12:17:18 +01:00
Jonas Herzig
fbbca76099 Remove :versions prefix from gradle projects and remove duplicated build code 2018-03-06 12:39:24 +01:00
Jonas Herzig
8ed9c75ba1 Release 2.1.1 2018-03-05 12:12:07 +01:00
Jonas Herzig
e7b5ba9e72 Update blend export for all remaining MC versions 2018-03-04 16:28:35 +01:00
Jonas Herzig
40da0d10c8 Parse raw buffer instead of intercepting all BufferBuilder calls 2018-03-04 16:28:35 +01:00
Jonas Herzig
1bdf7da525 Update blend export to 1.12.2 2018-03-04 16:28:29 +01:00
Jonas Herzig
6794b58524 Add .blend export 2018-03-04 15:30:50 +01:00
Jonas Herzig
78ad02bc84 Change from tag-based versioning to commit/file based 2018-03-03 12:33:50 +01:00
Jonas Herzig
9c76f0fcc0 Unload old world when restarting replay, fixes floating heads 2018-03-03 09:50:13 +01:00
Jonas Herzig
5d9dc9eb95 Fix half-despawned non-player entities if they are inside an unloading chunk (see #111) 2018-03-03 09:11:16 +01:00
Jonas Herzig
66312e4d40 Fix half-despawned player entities if they are inside an unloading chunk (fixes #111) 2018-03-02 15:54:21 +01:00
Jonas Herzig
180fda20d7 Do not shade lombok 2018-03-02 10:40:45 +01:00
Jonas Herzig
94c33df308 Exclude guava from ReplayStudio deps 2018-03-02 10:40:45 +01:00
Jonas Herzig
598827f074 Do not relocate javax package 2018-02-28 23:06:46 +01:00
Jonas Herzig
49c756b97d Fix version replacement in source and resources 2018-02-28 22:53:41 +01:00
Jonas Herzig
5ce08874d6 Do not relocate mixin lib 2018-02-28 21:56:57 +01:00
Jonas Herzig
da6d9e8167 Only replace FG2.1 when not a reprod build 2018-02-28 21:15:37 +01:00
Jonas Herzig
2fa2d2f745 Remove superfluous opening of MainMenu on replay exit (fixes #110) 2018-02-28 20:16:09 +01:00
Jonas Herzig
e508ac40cf Fix formatting/typos in README 2018-02-28 19:33:03 +01:00
Jonas Herzig
f0d4d93936 Replace FG 2.1 with custom fork for Gradle 3 compatibility 2018-02-28 19:20:48 +01:00
Jonas Herzig
95877be3e6 Replace FG 2.0 with custom fork for Gradle 3 compatibility 2018-02-28 11:55:59 +01:00
Jonas Herzig
d9f318623c Update README for single tree 2018-02-28 11:55:59 +01:00
Jonas Herzig
dd26163a7c Update .drone.yaml for single tree build 2018-02-28 11:55:59 +01:00
Jonas Herzig
5f4c15de2b Update proxy-witness and disable its cache 2018-02-28 08:36:02 +01:00
Jonas Herzig
7546d421b0 Use https for downloading gradle wrapper 2018-02-28 08:36:02 +01:00
Jonas Herzig
943fa45bbc Change project version to partially depend on the MC version 2018-02-28 08:36:02 +01:00
Jonas Herzig
ad6345de88 Re-write reprod to support all versions in one tree 2018-02-28 08:36:02 +01:00
Jonas Herzig
aabc3b52fe Replace reprod patched mixingradle with specific upstream version 2018-02-22 18:25:36 +01:00
Jonas Herzig
2f96694a73 Replace reprod patched mixin with upstream + gradle task for fixing refmap 2018-02-22 18:25:36 +01:00
Jonas Herzig
c5ad912a79 Relocate shaded libs 2018-02-22 18:25:36 +01:00
Jonas Herzig
aa1900bee6 Remove unused lombok dependency 2018-02-22 18:25:36 +01:00
Jonas Herzig
748b9da443 Combine all versions into a single tree 2018-02-22 18:25:36 +01:00
Jonas Herzig
ec50efec10 Merge branch '1.12.1-dev' into 1.12.2-dev 2018-01-19 19:50:18 +01:00
Jonas Herzig
d7e3c4d242 Merge branch '1.12-dev' into 1.12.1-dev 2018-01-19 19:48:36 +01:00
Jonas Herzig
b176dd9879 Manually repack jar file after reobfJar task for reproducibility 2018-01-19 19:45:57 +01:00
Jonas Herzig
a090a00360 Merge branch '1.12.1-dev' into 1.12.2-dev 2018-01-19 13:17:31 +01:00
Jonas Herzig
ddeaf37e8e Merge branch '1.12-dev' into 1.12.1-dev 2018-01-19 13:16:56 +01:00
Jonas Herzig
d0e4475b40 Merge branch '1.11.2-dev' into 1.12-dev 2018-01-19 13:15:40 +01:00
Jonas Herzig
00adf7f083 Merge branch '1.11-dev' into 1.11.2-dev 2018-01-19 13:10:55 +01:00
Jonas Herzig
5f2366e49d Merge branch '1.12.1-dev' into 1.12.2-dev 2018-01-17 20:46:34 +01:00
Jonas Herzig
f6b4ea015d Merge branch '1.12.2-reprod' into 1.12.2-dev 2018-01-17 20:13:05 +01:00
Jonas Herzig
638cc59097 Merge branch '1.12-dev' into 1.12.1-dev 2018-01-17 20:02:27 +01:00
Jonas Herzig
3a2abf05cb Merge branch '1.12.1-reprod' into 1.12.1-dev 2018-01-17 19:49:37 +01:00
Jonas Herzig
0f004537af Whitelist version.json checksum
Why is there even a sha1 value in the URL if the file can change?
2018-01-17 19:37:34 +01:00
Jonas Herzig
dc1bc1ee8e Merge branch '1.11.2-dev' into 1.12-dev 2018-01-17 00:18:04 +01:00
Jonas Herzig
87335cd243 Add lombok-1.16.4.jar to checksums list 2018-01-17 00:13:40 +01:00
Jonas Herzig
06bebda557 Merge branch '1.11-dev' into 1.11.2-dev 2018-01-16 23:28:46 +01:00
Jonas Herzig
430a5044f5 Merge branch '1.11.2-reprod' into 1.11.2-dev 2018-01-16 23:25:23 +01:00
Jonas Herzig
c07080650a Fix realms notifications not being offset with button (fixes #22 GH) 2017-11-03 09:24:57 +01:00
Jonas Herzig
4ac418cdd5 Update reprod to 1.12.2 2017-10-28 21:13:01 +02:00
Jonas Herzig
42aa0d9b61 Merge branch '1.12.2-dev' into 1.12.2-reprod 2017-10-28 19:52:54 +02:00
Jonas Herzig
117dc6191f Update reprod to 1.12.1 2017-10-28 19:51:02 +02:00
Jonas Herzig
903762f042 Merge branch '1.12.1-dev' into 1.12.1-reprod 2017-10-28 19:34:38 +02:00
Jonas Herzig
f9b6fd1ced Update reprod to 1.12 2017-10-28 19:32:26 +02:00
Jonas Herzig
9592c6b8ea Merge branch '1.12-dev' into 1.12-reprod 2017-10-28 18:28:19 +02:00
Jonas Herzig
5f7e4fd9dd Update reprod to 1.11.2 2017-10-28 18:25:22 +02:00
Jonas Herzig
e70ef7a601 Merge branch '1.11.2-dev' into 1.11.2-reprod 2017-10-28 18:06:00 +02:00
Jonas Herzig
c8dc70af56 Merge branch 1.12.1-dev into 1.12.2-dev
db1717f Merge branch 1.12-dev into 1.12.1-dev
d7dc2ba Merge branch 1.11.2-dev into 1.12-dev
b1c6098 Merge branch 1.11-dev into 1.11.2-dev
caf6051 Merge branch 1.9.4-dev into 1.11-dev
263e080 Merge branch 1.8.9-dev into 1.9.4-dev
8fad02c Merge branch 1.8-dev into 1.8.9-dev
1c888aa Add minVersion to mixin configs and bump bundled mixin version
10ce71e Fix mapwriter crash when opening replay for <MC1.12 (fixes #96)
5fb1cf3 Fix half-despawned player entities (see #93) when the entity is moved greater distances
adfe6a2 Fix NPE when spectated non-player entity despawns (fixes #94)
b27af27 Fix player entities being half-despawned after jumping in time (fixes #93)
2017-10-28 12:50:29 +02:00
Jonas Herzig
db1717ffdd Merge branch 1.12-dev into 1.12.1-dev
d7dc2ba Merge branch 1.11.2-dev into 1.12-dev
b1c6098 Merge branch 1.11-dev into 1.11.2-dev
caf6051 Merge branch 1.9.4-dev into 1.11-dev
263e080 Merge branch 1.8.9-dev into 1.9.4-dev
8fad02c Merge branch 1.8-dev into 1.8.9-dev
1c888aa Add minVersion to mixin configs and bump bundled mixin version
10ce71e Fix mapwriter crash when opening replay for <MC1.12 (fixes #96)
5fb1cf3 Fix half-despawned player entities (see #93) when the entity is moved greater distances
adfe6a2 Fix NPE when spectated non-player entity despawns (fixes #94)
b27af27 Fix player entities being half-despawned after jumping in time (fixes #93)
2017-10-28 12:47:13 +02:00
Jonas Herzig
d7dc2badf8 Merge branch 1.11.2-dev into 1.12-dev
b1c6098 Merge branch 1.11-dev into 1.11.2-dev
caf6051 Merge branch 1.9.4-dev into 1.11-dev
263e080 Merge branch 1.8.9-dev into 1.9.4-dev
8fad02c Merge branch 1.8-dev into 1.8.9-dev
1c888aa Add minVersion to mixin configs and bump bundled mixin version
10ce71e Fix mapwriter crash when opening replay for <MC1.12 (fixes #96)
5fb1cf3 Fix half-despawned player entities (see #93) when the entity is moved greater distances
adfe6a2 Fix NPE when spectated non-player entity despawns (fixes #94)
b27af27 Fix player entities being half-despawned after jumping in time (fixes #93)
2017-10-28 12:28:58 +02:00
Jonas Herzig
b1c6098205 Merge branch 1.11-dev into 1.11.2-dev
caf6051 Merge branch 1.9.4-dev into 1.11-dev
263e080 Merge branch 1.8.9-dev into 1.9.4-dev
8fad02c Merge branch 1.8-dev into 1.8.9-dev
1c888aa Add minVersion to mixin configs and bump bundled mixin version
10ce71e Fix mapwriter crash when opening replay for <MC1.12 (fixes #96)
5fb1cf3 Fix half-despawned player entities (see #93) when the entity is moved greater distances
adfe6a2 Fix NPE when spectated non-player entity despawns (fixes #94)
b27af27 Fix player entities being half-despawned after jumping in time (fixes #93)
2017-10-28 12:13:04 +02:00
Jonas Herzig
f2755f6e1f Update to 1.12.2 2017-09-19 10:37:19 +02:00
Jonas Herzig
cfb990ad43 Remove ReplayStudio submodule and depend on it via maven instead 2017-09-19 10:21:07 +02:00
Jonas Herzig
b1a2826cb4 Merge branch 1.12 into 1.12.1
0d6c1ca Merge branch 1.11.2 into 1.12
13bb0bd Merge branch 1.11-staging into 1.11.2-staging
5257a41 Merge branch 1.10.2 into 1.11
689f897 Merge branch 1.9.4 into 1.10.2
0aed9c3 Merge branch 1.8.9 into 1.9.4
f36ebf1 Merge branch 1.8 into 1.8.9
08170b3 Downgrade FG to 2.1 because FG 2.2 is 1.9+ only
41d2547 Update translations
00e999f Fix replay not being closed when opened via URI scheme handler (fixes #92)
767ea29 Fix book gui not being suppressed during replay (fixes #90)
5b04edb Hide ReplayMod app entry from menus on Linux
6aff99d Fix livelock during netty write to embedded channel (fixes #85)
703805f Fix infinite loop in mc.scheduledTasks (fixes #86)
922c039 Fix server with RM installed refusing clients without RM (fixes #76)
7a4440c Update ReplayStudio
0b9c56c Fix resource packs not working after first time jumping back in time
933ee5f [Compat] Fix camera entity with BetterSprinting prior to 2.0.0 (fixes #78)
83b1090 Fix hotbar being visible while spectating player (fixes #83)
5c73117 [Compat] Fix invisible entities with Orange's 1.7 Animations (fixes #78)
4704b29 Replace the RenderPlayer hook (used subclassing) with a mixin (fixes #79)
0c226b0 Fix path at end of replay resulting in constant reloading (fixes #56)
1b9b13e Rename render success sound to all lowercase (required for 1.11) (fixes #66)
c2000b3 Fix only front-facing chunks visible for ODS rendering (fixes #67)
aafeecc Fix initial login gui not closing on success (fixes #68)
9292add Use percent-encoding for replay file names (fixes #71)
8499c0f Fix name of invis armor stand with CustomNameVisible not rendering (fixes #72)
b9ea572 Try to handle invalid ffmpeg arguments more gracefully (fixes #77)
a2f8c88 Fix compression packets being recorded (fixes #80)
19629c3 Replace usages of System.out with logger
fe1d9b8 Stop Forge from allowing the mod to load on other MC versions (fixes #82)
d56fa9b Update ReplayStudio/MCProtocolLib (Fixes missing ARMOR_STAND MobType)
7c719e0 Update ReplayStudio/MCProtocolLib (Fixes missing ARMOR_STAND MobType)
1a1e96c Fix server with RM installed refusing clients without RM (fixes #76)
35eb9ca Replace usage of FMLLog with the mod logger
2017-08-26 14:53:36 +02:00
Jonas Herzig
0d6c1caffc Merge branch 1.11.2 into 1.12
13bb0bd Merge branch 1.11-staging into 1.11.2-staging
5257a41 Merge branch 1.10.2 into 1.11
689f897 Merge branch 1.9.4 into 1.10.2
0aed9c3 Merge branch 1.8.9 into 1.9.4
f36ebf1 Merge branch 1.8 into 1.8.9
08170b3 Downgrade FG to 2.1 because FG 2.2 is 1.9+ only
41d2547 Update translations
00e999f Fix replay not being closed when opened via URI scheme handler (fixes #92)
767ea29 Fix book gui not being suppressed during replay (fixes #90)
5b04edb Hide ReplayMod app entry from menus on Linux
6aff99d Fix livelock during netty write to embedded channel (fixes #85)
703805f Fix infinite loop in mc.scheduledTasks (fixes #86)
7a4440c Update ReplayStudio
0b9c56c Fix resource packs not working after first time jumping back in time
933ee5f [Compat] Fix camera entity with BetterSprinting prior to 2.0.0 (fixes #78)
83b1090 Fix hotbar being visible while spectating player (fixes #83)
5c73117 [Compat] Fix invisible entities with Orange's 1.7 Animations (fixes #78)
4704b29 Replace the RenderPlayer hook (used subclassing) with a mixin (fixes #79)
0c226b0 Fix path at end of replay resulting in constant reloading (fixes #56)
1b9b13e Rename render success sound to all lowercase (required for 1.11) (fixes #66)
c2000b3 Fix only front-facing chunks visible for ODS rendering (fixes #67)
aafeecc Fix initial login gui not closing on success (fixes #68)
9292add Use percent-encoding for replay file names (fixes #71)
8499c0f Fix name of invis armor stand with CustomNameVisible not rendering (fixes #72)
b9ea572 Try to handle invalid ffmpeg arguments more gracefully (fixes #77)
a2f8c88 Fix compression packets being recorded (fixes #80)
19629c3 Replace usages of System.out with logger
fe1d9b8 Stop Forge from allowing the mod to load on other MC versions (fixes #82)
d56fa9b Update ReplayStudio/MCProtocolLib (Fixes missing ARMOR_STAND MobType)
7c719e0 Update ReplayStudio/MCProtocolLib (Fixes missing ARMOR_STAND MobType)
1a1e96c Fix server with RM installed refusing clients without RM (fixes #76)
35eb9ca Replace usage of FMLLog with the mod logger
2017-08-26 14:44:16 +02:00
Jonas Herzig
13bb0bde13 Merge branch 1.11-staging into 1.11.2-staging
5257a41 Merge branch 1.10.2 into 1.11
689f897 Merge branch 1.9.4 into 1.10.2
0aed9c3 Merge branch 1.8.9 into 1.9.4
f36ebf1 Merge branch 1.8 into 1.8.9
08170b3 Downgrade FG to 2.1 because FG 2.2 is 1.9+ only
41d2547 Update translations
00e999f Fix replay not being closed when opened via URI scheme handler (fixes #92)
767ea29 Fix book gui not being suppressed during replay (fixes #90)
5b04edb Hide ReplayMod app entry from menus on Linux
6aff99d Fix livelock during netty write to embedded channel (fixes #85)
703805f Fix infinite loop in mc.scheduledTasks (fixes #86)
7a4440c Update ReplayStudio
0b9c56c Fix resource packs not working after first time jumping back in time
933ee5f [Compat] Fix camera entity with BetterSprinting prior to 2.0.0 (fixes #78)
83b1090 Fix hotbar being visible while spectating player (fixes #83)
5c73117 [Compat] Fix invisible entities with Orange's 1.7 Animations (fixes #78)
4704b29 Replace the RenderPlayer hook (used subclassing) with a mixin (fixes #79)
0c226b0 Fix path at end of replay resulting in constant reloading (fixes #56)
1b9b13e Rename render success sound to all lowercase (required for 1.11) (fixes #66)
c2000b3 Fix only front-facing chunks visible for ODS rendering (fixes #67)
aafeecc Fix initial login gui not closing on success (fixes #68)
9292add Use percent-encoding for replay file names (fixes #71)
8499c0f Fix name of invis armor stand with CustomNameVisible not rendering (fixes #72)
b9ea572 Try to handle invalid ffmpeg arguments more gracefully (fixes #77)
a2f8c88 Fix compression packets being recorded (fixes #80)
19629c3 Replace usages of System.out with logger
fe1d9b8 Stop Forge from allowing the mod to load on other MC versions (fixes #82)
d56fa9b Update ReplayStudio/MCProtocolLib (Fixes missing ARMOR_STAND MobType)
7c719e0 Update ReplayStudio/MCProtocolLib (Fixes missing ARMOR_STAND MobType)
1a1e96c Fix server with RM installed refusing clients without RM (fixes #76)
35eb9ca Replace usage of FMLLog with the mod logger
2017-08-26 14:37:33 +02:00
Jonas Herzig
922c039e43 Fix server with RM installed refusing clients without RM (fixes #76) 2017-08-23 21:11:12 +02:00
Jonas Herzig
0b462280fc Update to 1.12.1 2017-08-04 09:10:48 +02:00
Jonas Herzig
cae95d1c8f Fix usage of deprecated netty method 2017-06-29 10:48:47 +02:00
Jonas Herzig
67b7872c4d Update to first Forge 1.12 RB 2017-06-29 10:32:12 +02:00
Jonas Herzig
9b04d317c5 Suppress advancement and crafting unlocks (fixes #69) 2017-06-27 15:17:57 +02:00
Jonas Herzig
a6ffae2148 Update to Forge Build 2375 (fixes #70) 2017-06-27 15:07:54 +02:00
Jonas Herzig
6109960d4a Fix integration test failing because of conflicting keybindings 2017-06-15 20:44:10 +02:00
Jonas Herzig
4dcecc5697 Do not show OpenEye offer gui if there's no OpenEye for the current MC version 2017-06-15 16:28:44 +02:00
Jonas Herzig
bef5e41a8d Update mappings 2017-06-15 16:15:01 +02:00
Jonas Herzig
6ecb87e8dd Add workaround for race condition preventing us from joining SP (see MinecraftForge/MinecraftForge#3974)
This is done by preventing all calls to ChannelConfig.setAutoRead(false) during
the call to FMLNetworkHandler.fmlClientHandshake (the two @Redirects in
MixinNetworkDispatcher) and manually issuing the call before handleLoginSuccess
returns (at which point the NetHandlerPlayClient has been set).

This commit should be reverted once the issue mentioned above has been fixed.
2017-06-15 16:15:01 +02:00
Jonas Herzig
921c9e0098 Update to 1.12 2017-06-15 16:15:01 +02:00
Jonas Herzig
5dd31f4cac Merge branch '1.11' into 1.11.2
2a47f57 Merge branch '1.10.2' into 1.11
96b2904 Merge branch '1.9.4' into 1.10.2
6c8c779 Merge branch '1.8.9' into 1.9.4
aa16e42 Add workaround for setupCIWorkspace not being sufficient
ed56673 Merge branch '1.8' into 1.8.9
91573d9 Update jGui, ReplayStudio and Translations
d71358b Add confirmation dialog before overwriting path presets (fixes #65)
1a55983 Move addCallback method from integration test Utils to main Utils
18c5bcd Be more cooperative with other mods on the ingame menu (fixes #42)
c054fe8 Register keys for simplepathing only once (fixes #63)
f13297c Fix default interpolator handling in keyframe gui and after loading (fixes #64)
391f304 Show error popup if entity tracker fails to load
0e0eaaa Fix entity tracker being set even if it failed loading (fixes #50)
a34bbbc Fix NPE when spectating a player without a camera entity
60879fb Change local class to be an inner class because Srg2Source breaks with it
dfafbec Load translations from github repo, only reload language not all resource packs
8a6ec51 Add missing tooltips to player overview and various missing chat messages
5677fc5 Re-add warning to replay editor
748a91e Fix missing tooltips on fav/like/dislike buttons in replay center
ee24866 Fix upload replay button not being updated when name/tags change
dba085c Move translations into separate repo
3f0e3e7 Fix NPE when receiving Replay|Restrict messages (fixes #16 GH)
40e1d85 Fix crash when saving the last keyframe in the edit gui (fixes #61)
03aada1 Update Mixin to 0.6.8 (fixes #9 GH)
0c1dc65 Fix interpolator being lost when moving keyframe to the end (fixes #62)
fcbbbc9 Add integration test. Run with ./gradlew runIntegrationTest
fe6ded0 Fix movement of keyframe via GuiEditKeyframe not updating selected keyframe
f58fa8f Fix Login GUI not respecting other GUIs opened on startup
4fc3a31 Fix OpenEye being installed into working dir instead of mcDataDir
2017-06-01 15:32:37 +02:00
johni0702
cda8493df1 Merge branch '1.11' into 1.11.2
0c36022 Merge branch '1.10.2' into 1.11
325d041 Merge branch '1.9.4' into 1.10.2
d9d57e2 Merge branch '1.8.9' into 1.9.4
24c58cb Merge branch '1.8' into 1.8.9
1ffeb01 Update jGui
c122d30 Merge branch '1.8-path-segments' into 1.8
27fd25a Fix crash when server responds with garbage to language query (fixes #51)
db6b0ff Fix / by 0 when two spectator keyframes are closer than 50ms (fixes #60)
d61d0ac Fix hand of invisible spectated player being visible (fixes #59)
f7460f9 Re-enable time path after path playback (fixes #55)
bdbffd5 Add Catmull-Rom spline interpolator to simplepathing
5cbfd28 Generate interpolator settings from InterpolatorType enum
6095aef Fix loading and storing of default interpolator with settings
3f52336 Revert "Fix AbstractMethodError caused by FG2.0 not supporting lambdas (fixes #58)"
c6293bc Update to FG2.2
c8126ed Merge '1.8' into 1.8.9
64898ce Fix NPE when saving recorded resource pack
70e3e54 Fix AbstractMethodError caused by FG2.0 not supporting lambdas (fixes #58)
3f2b3d6 Fix replacing source file in Replay Editor (fixes #57)
d2def94 Fix duration of replays corrupted because of JVM/OS crash
2c64030 Refactor simple pathing timeline logic into dedicated class with unit tests Fix logic for user-set interpolators
4deb374 Enable validation on focus change for all number input fields
5302bca Fix id and text of Replay Editor button in docs
057edcc Manually inject root cert for cross-signed LetsEncrypt cert in requests
cd16211 Register new Property to imply that the path segment following a keyframe has a user-set interpolator instead of the default Modified Keyframe GUI to allow for custom Path interpolator
2017-01-29 13:46:06 +01:00
johni0702
33cb1405d5 Update to 1.11.2 2017-01-15 01:23:44 +01:00
655 changed files with 31572 additions and 13126 deletions

View File

@@ -1,19 +0,0 @@
pipeline:
clone:
image: plugins/git
tags: true
build:
image: maven:3.3.9-jdk-8
commands:
- curl --fail --create-dirs -o $HOME/.gradle/init.d/mirror.gradle https://maven.johni0702.de/config/gradle
- git config --global user.email "replaymod@drone" && git config --global user.name "Drone"
- SIGNED_JAR=$(! git describe --exact 2>&1 > /dev/null; echo $?) REPRODUCIBLE_BUILD=1 ./gradlew :build
archive:
image: plugins/s3
acl: public-read
region: "us-east-1"
bucket: "replaymod"
path_style: true
source: build/libs/*
strip_prefix: build/libs/
target: /

View File

@@ -1 +0,0 @@
eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgY2xvbmU6CiAgICBpbWFnZTogcGx1Z2lucy9naXQKICAgIHRhZ3M6IHRydWUKICBidWlsZDoKICAgIGltYWdlOiBtYXZlbjozLjMuOS1qZGstOAogICAgY29tbWFuZHM6CiAgICAgIC0gY3VybCAtLWZhaWwgLS1jcmVhdGUtZGlycyAtbyAkSE9NRS8uZ3JhZGxlL2luaXQuZC9taXJyb3IuZ3JhZGxlIGh0dHBzOi8vbWF2ZW4uam9obmkwNzAyLmRlL2NvbmZpZy9ncmFkbGUKICAgICAgLSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgInJlcGxheW1vZEBkcm9uZSIgJiYgZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIkRyb25lIgogICAgICAtIFNJR05FRF9KQVI9JCghIGdpdCBkZXNjcmliZSAtLWV4YWN0IDI-JjEgPiAvZGV2L251bGw7IGVjaG8gJD8pIFJFUFJPRFVDSUJMRV9CVUlMRD0xIC4vZ3JhZGxldyA6YnVpbGQKICBhcmNoaXZlOgogICAgaW1hZ2U6IHBsdWdpbnMvczMKICAgIGFjbDogcHVibGljLXJlYWQKICAgIHJlZ2lvbjogInVzLWVhc3QtMSIKICAgIGJ1Y2tldDogInJlcGxheW1vZCIKICAgIHBhdGhfc3R5bGU6IHRydWUKICAgIHNvdXJjZTogYnVpbGQvbGlicy8qCiAgICBzdHJpcF9wcmVmaXg6IGJ1aWxkL2xpYnMvCiAgICB0YXJnZXQ6IC8K.cFk9CFCSYjJSwQhcJJp0BqSMwigKYCBd6r-KkvxlQZ0

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
* text=auto

BIN
.gitignore vendored

Binary file not shown.

3
.gitmodules vendored
View File

@@ -5,3 +5,6 @@
[submodule "src/main/resources/assets/replaymod/lang"]
path = src/main/resources/assets/replaymod/lang
url = https://github.com/ReplayMod/Translations
[submodule "ReplayStudio"]
path = libs/ReplayStudio
url = ../ReplayStudio

30
Jenkinsfile vendored Normal file
View File

@@ -0,0 +1,30 @@
pipeline {
agent {
docker { image 'openjdk:8-jdk' }
}
stages {
stage('Build') {
environment {
GRADLE_USER_HOME = '.gradle/user_home'
}
steps {
cache(maxCacheSize: 4096, caches: [
[$class: 'ArbitraryFileCache', excludes: 'modules-2/modules-2.lock,*/plugin-resolution/**', includes: '**/*', path: '.gradle/user_home/caches'],
[$class: 'ArbitraryFileCache', excludes: '', includes: '**/*', path: '.gradle/user_home/wrapper'],
[$class: 'ArbitraryFileCache', excludes: '', includes: '**/*', path: '.gradle/loom-cache'],
]) {
// sh './gradlew :jGui:1.7.10:setupCIWorkspace :1.7.10:setupCIWorkspace'
sh './gradlew --parallel'
}
archiveArtifacts 'versions/*/build/libs/*.jar'
}
}
stage('Deploy') {
steps {
withAWS(endpointUrl: 'https://minio.johni0702.de', credentials: 'minio') {
s3Upload bucket: 'replaymod', includePathPattern: '*.jar', workingDir: 'build/libs', acl: 'PublicRead', pathStyleAccessEnabled: true
}
}
}
}
}

View File

@@ -4,46 +4,38 @@ A Minecraft mod to record game sessions and replay them afterwards from any pers
## Building
Make sure your sub-projects are up-to-date: `git submodule update --init --recursive`
For each branch you visit the first time, running `./gradlew setupDecompWorkspace` is necessary.
This will also be necessary if the `replaymod_at.cfg` file has been changed (getting errors about code that is trying
to access private fields is a good indication that this has happened).
For compiling 1.7.10, you must run `./gradlew :jGui:1.7.10:setupDecompWorkspace :1.7.10:setupDecompWorkspace` once after the initial clone. This may take quite some time.
### No IDE
You can build the mod by running `./gradlew :build`. You can then find the final jar files in `build/libs/`.
You can build the mod by running `./gradlew build` (or just `./gradlew bundleJar`). You can then find the final jar files in `versions/$MCVERSION/build/libs/`.
You can also build single versions by running `./gradlew :1.8:build` (or just `./gradlew :1.8:bundleJar`) (builds the MC 1.8 version).
### IntelliJ
For the initial setup run `./gradlew idea genIntellijRuns`.
You also need to enable the Mixin annotation processor:
1. Go to File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors
2. Tick "Enable annotation processing"
3. Add a new entry to the "Annotation Processor options"
4. Set the name to "reobfSrgFile" and the value to "$path/build/mcp-srg.srg" where you replace $path with the full
path to the folder containing the gradlew file
Whenever you switch to another branch, you can either just run `./gradlew idea` or instead run
`./gradlew copySrg` and then refresh the gradle project from within IntelliJ.
Ensure you have at least IDEA 2020.1.
Build the mod via Gradle as explained above at least once (`./gradlew compileJava` should be sufficient). This will ensure that the sources for all MC versions are generated.
Then import the Gradle project from within IDEA: File -> Open -> build.gradle -> Open as Project
Finally configure IDEA to build everything by itself instead of delegating it to Gradle (cause that is slow): File -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle -> Build and run using: IntelliJ IDEA
### Eclipse
## Development
### Branches
New features are developed on the `1.8` branch and merged upwards for release. Larger features are developed on their
own branch that is based on `1.8` and then merged back once it's finished.
Loosely based on [this branching model](http://nvie.com/posts/a-successful-git-branching-model/) with `stable` instead of `master`.
Features or bug fixes that apply only to a specific Minecraft version are fixed on the branch corresponding to that
version and reverted when merging upwards.
Both subprojects follow a similar branching model.
The user documentation (`docs` folder) is only committed to on the current development branch. Any changes committed on
a branch for a more recent Minecraft version are not kept up to date on the website and should only be
of importance once support for the previous Minecraft version is dropped.
TL;DR:
Main development happens on the `develop` branch, snapshots are built from this branch.
The `stable` branch contains the most recent release.
The `master` branch is solely to be used for the `version.json` file that contains a list of all versions
used by the clients to check for updates of this mod.
### The Preprocessor
To support multiple Minecraft versions with the ReplayMod, a [JCP](https://github.com/raydac/java-comment-preprocessor)-inspired preprocessor is used.
It has by now acquired a lot more sophisticated features to make it as noninvasive as possible.
Please read the [preprocessor's README](https://github.com/ReplayMod/preprocessor/blob/master/README.md) to understand how it works.
### Versioning
The ReplayMod uses the versioning scheme outlined [here](http://mcforge.readthedocs.io/en/latest/conventions/versioning/)
The ReplayMod uses the versioning scheme outlined [here](https://docs.minecraftforge.net/en/1.12.x/conventions/versioning/)
with three changes:
- No `MAJORAPI`, the ReplayMod does not provide any external API
- "Updating to a new Minecraft version" should not increment `MAJORMOD`, we maintain one version of the ReplayMod
@@ -52,20 +44,19 @@ keep the version name the same for all of them (with the exception of `MCVERSION
"Multiple Minecraft Version" section does not apply.
- For pre-releases the shorter `-bX` is used instead of `-betaX`
When a new version is (pre-)release, a new annotated tag should be added with the name of the version and the
When a new version is (pre-)release, a new commit modifying the `version.txt` file should be added and the
`versions.json` file in the `master` branch should be updated. To simplify this process the gradle task `doRelease` can
be used: `./gradlew -PreleaseVersion=1.8-2.0.0-rc1 doRelease`. It will create the tag and update the version.json
be used: `./gradlew -PreleaseVersion=2.0.0-rc1 doRelease`. It will create the commit and update the version.json
accordingly.
Care should be taken that the updated `version.json` is not pushed before a jar file is available on the
download page (or Jenkins) as it will inform the users of the update.
### Bugs
Bugs in the mod are tracked via [Bugzilla](https://bugs.replaymod.com/).
GitHub should only be used for issues that are generally not likely to affect any end users.
GitHub should generally be used to report bugs.
Bug numbers in commits such as `(fixes #42)` refer to Bugzilla unless noted otherwise.
In the past, bugs were tracked via [Bugzilla](https://bugs.replaymod.com/), so bug numbers in commits prior to 2020 such as `(fixes #42)` generally referred to Bugzilla unless noted otherwise.
## License
The ReplayMod is provided under the terms of the GNU General Public License Version 3 or (at your option) any later version.
See `LICENSE.md` for the full license text.
See `LICENSE.md` for the full license text.

View File

@@ -1,339 +0,0 @@
import groovy.json.JsonOutput
buildscript {
repositories {
mavenCentral()
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
maven {
name = "sponge"
url = "https://repo.spongepowered.org/maven"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT'
}
}
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'org.spongepowered.mixin'
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = gitDescribe()
group= "com.replaymod"
archivesBaseName = "replaymod"
minecraft {
coreMod = 'com.replaymod.core.LoadingPlugin'
version = '1.11-13.19.1.2188'
runDir = "eclipse"
mappings = "snapshot_20161111"
replace '@MOD_VERSION@', project.version
// Includes intentional whitespace to stop Forge from declaring the mod to be compatible with
// a newer srg-compatible MC version (that may be using a different protocol version)
replace '@MC_VERSION@', "[ ${project.minecraft.version} ]"
}
repositories {
maven {
name = "SpongePowered Repo"
url = "http://repo.spongepowered.org/maven/"
}
maven { url 'https://jitpack.io' }
}
configurations {
shade
compile.extendsFrom shade
}
dependencies {
compile 'org.projectlombok:lombok:1.16.4'
compile 'org.spongepowered:mixin:0.7.5-SNAPSHOT'
shade 'com.googlecode.mp4parser:isoparser:1.1.7'
shade 'org.apache.commons:commons-exec:1.3'
shade 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0'
shade 'com.google.api-client:google-api-client-gson:1.20.0'
shade 'com.google.api-client:google-api-client-java6:1.20.0'
shade 'com.google.oauth-client:google-oauth-client-jetty:1.20.0'
shade 'org.aspectj:aspectjrt:1.8.2'
shade 'com.github.ReplayMod:ReplayStudio:2b063ec'
testCompile 'junit:junit:4.11'
}
jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
dependsOn configurations.compile
dependsOn configurations.shade
def shade = {files(
configurations.compile.findAll {it.name.startsWith 'mixin-'}
+ configurations.shade
)}
def noticeDir = file("$buildDir/NOTICE")
doFirst {
noticeDir.deleteDir()
noticeDir.mkdirs()
shade().collect { it.isDirectory() ? fileTree(it) : zipTree(it) }.each {
it.matching { include '**/NOTICE*' }.each {
new File(noticeDir, 'NOTICE.txt') << it.getText('UTF-8') + '\n'
}
}
}
from noticeDir
from ({shade().collect { it.isDirectory() ? it : zipTree(it) }}) {
exclude '**/NOTICE*'
// exclude everything taken in from jGui for running the mod in a dev environment
exclude { new File(file('jGui/src/main/resources'), it.relativePath.pathString).exists() }
eachFile {
if (getName() == 'LICENSE.txt') {
setName(getFile().getParentFile().getName().split('.jar_')[0] + '-LICENSE.txt')
}
}
}
manifest {
attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker',
'TweakOrder': '0',
'FMLCorePluginContainsFMLMod': 'true',
'FMLAT': 'replaymod_at.cfg'
}
}
def gitDescribe() {
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--always', '--dirty=*'
standardOutput = stdout
}
return stdout.toString().trim()
} catch (e) {
return "unknown"
}
}
processResources
{
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version
// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
// replace version and mcversion
expand 'version': project.version, 'mcversion': project.minecraft.version
}
// copy everything else, thats not the mcmod.info
from(sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
}
}
sourceSets {
main {
// Directly include jGui into main build
// This could also be done by including it as a gradle subproject, however
// doing so caused classpath issues on some IntelliJ versions.
java {
srcDir 'jGui/src/main/java'
}
resources {
srcDir 'jGui/src/main/resources'
}
ext.refMap = "mixins.replaymod.refmap.json"
}
integrationTest {
compileClasspath += main.runtimeClasspath + main.output
java {
srcDir file('src/integration-test/java')
}
resources.srcDir file('src/integration-test/resources')
}
}
task copySrg(type: Copy, dependsOn: 'genSrgs') {
from {project.tasks.genSrgs.mcpToSrg}
into 'build'
}
setupDecompWorkspace.dependsOn copySrg
setupDevWorkspace.dependsOn copySrg
project.tasks.idea.dependsOn copySrg
import org.objectweb.asm.*
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import java.util.zip.ZipOutputStream
import static org.objectweb.asm.Opcodes.ASM5
// MC binaries were complied with a java version that produces invalid class files under certain circumstances
// This causes setupCIWorkspace to be insufficient for compiling.
// Related JDK bug: https://bugs.openjdk.java.net/browse/JDK-8066725
// As a workaround, to use setupCIWorkspace on Drone, we modify the bin jar in-place and remove all parameter annotations.
// WARNING: This piece of code ignores any and all gradle conventions and will probably fail horribly when run outside
// of a single-use environment (e.g. Drone). Use setupDecompWorkspace for normal use.
tasks.deobfMcMCP.doLast {
println "Applying RuntimeInvisibleParameterAnnotations workaround..."
File jar = getOutJar()
File tmp = new File((File) getTemporaryDir(), "workaround.jar")
tmp.withOutputStream {
new ZipOutputStream(it).withStream { dst ->
new ZipFile(jar).withCloseable { src ->
src.entries().each {
if (it.name.startsWith("net/minecraft/") && it.name.endsWith(".class")) {
def cw = new ClassWriter(0)
def cv = new ClassVisitor(ASM5, cw) {
@Override
MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
return new MethodVisitor(ASM5, cv.visitMethod(access, name, desc, signature, exceptions)) {
@Override
AnnotationVisitor visitParameterAnnotation(int parameter, String pdesc, boolean visible) {
return null // Strip all parameter annotations
}
}
}
}
new ClassReader(src.getInputStream(it)).accept(cv, 0)
dst.putNextEntry(new ZipEntry(it.name))
dst.write(cw.toByteArray())
} else {
dst.putNextEntry(it)
dst.write(src.getInputStream(it).bytes)
}
}
}
}
}
jar.delete()
tmp.renameTo(jar)
}
task runIntegrationTest(type: JavaExec, dependsOn: ["makeStart", "jar"]) {
main = 'GradleStart'
standardOutput = System.out
errorOutput = System.err
workingDir file(minecraft.runDir)
def testDir = new File(minecraft.runDir, "integration-test")
doFirst {
testDir.deleteDir()
testDir.mkdirs()
}
doLast {
testDir.deleteDir()
}
afterEvaluate {
def runClient = tasks.getByName("runClient")
runIntegrationTest.jvmArgs = runClient.jvmArgs + "-Dfml.noGrab=true"
runIntegrationTest.args = runClient.args + "--gameDir" + testDir.canonicalPath
runIntegrationTest.classpath runClient.classpath + sourceSets.integrationTest.output
}
}
def generateVersionsJson() {
// List all tags
def stdout = new ByteArrayOutputStream()
project.exec {
commandLine 'git', 'for-each-ref', '--sort=taggerdate', '--format=%(refname:short)', 'refs/tags'
standardOutput = stdout
}
def versions = stdout.toString().tokenize('\n').reverse()
def mcVersions = versions.collect {it.substring(0, it.indexOf('-'))}.unique().reverse()
def root = [
homepage: 'https://www.replaymod.com/download/',
promos: [:]
]
mcVersions.forEach { mcVersion ->
def mcVersionRoot = [:]
def latest
def recommended
versions.forEach {
def (thisMcVersion, modVersion, preVersion) = it.tokenize('-')
if (thisMcVersion == mcVersion) {
mcVersionRoot[it] = "See https://github.com/ReplayMod/ReplayMod/releases/$it"
if (latest == null) latest = it
if (preVersion == null) {
if (recommended == null) recommended = it
}
}
}
root[mcVersion] = mcVersionRoot
root.promos[mcVersion + '-latest'] = latest
if (recommended != null) {
root.promos[mcVersion + '-recommended'] = recommended
}
}
root
}
task doRelease() {
doLast {
// Parse version
def version = project.releaseVersion as String
if (project.version.endsWith('*')) {
throw new InvalidUserDataException('Git working tree is dirty. Make sure to commit all changes.')
}
def (mcVersion, modVersion, preVersion) = version.tokenize('-')
preVersion = preVersion != null && preVersion.startsWith('b') ? preVersion.substring(1) : null
// Create new tag
if (preVersion != null) {
project.exec {
commandLine 'git', 'tag',
'-m', "Pre-release $preVersion of $modVersion for Minecraft $mcVersion",
"$mcVersion-$modVersion-b$preVersion"
}
} else {
project.exec {
commandLine 'git', 'tag',
'-m', "Release $modVersion for Minecraft $mcVersion",
"$mcVersion-$modVersion"
}
}
// Switch to master branch to update versions.json
project.exec { commandLine 'git', 'checkout', 'master' }
// Generate versions.json content
def versionsRoot = generateVersionsJson()
def versionsJson = JsonOutput.prettyPrint(JsonOutput.toJson(versionsRoot))
// Write versions.json
new File('versions.json').write(versionsJson)
// Commit changes
project.exec { commandLine 'git', 'add', 'versions.json' }
project.exec { commandLine 'git', 'commit', '-m', "Update versions.json for $version" }
// Return to previous branch
project.exec { commandLine 'git', 'checkout', '-' }
}
}
defaultTasks 'build'

377
build.gradle.kts Normal file
View File

@@ -0,0 +1,377 @@
import com.replaymod.gradle.preprocess.PreprocessTask
import gg.essential.gradle.util.*
import net.fabricmc.loom.task.RemapJarTask
plugins {
java
id("com.gradleup.shadow") apply false
id("gg.essential.multi-version")
id("gg.essential.defaults.repo")
id("gg.essential.defaults.java")
id("gg.essential.defaults.loom")
}
val mcVersion = platform.mcVersion
var jGuiVersion = project.name
if (jGuiVersion in listOf("1.10.2", "1.11", "1.11.2")) jGuiVersion = "1.9.4"
if (jGuiVersion in listOf("1.12.1", "1.12.2")) jGuiVersion = "1.12"
val jGui = project.evaluationDependsOn(":jGui:$jGuiVersion")
version = "${project.name}-${rootProject.version}"
base.archivesName.set("replaymod")
java.withSourcesJar()
loom {
noServerRunConfigs()
}
if (!platform.isUnobfuscated) {
loom.mixin.useLegacyMixinAp = true
loom.mixin.defaultRefmapName.set("mixins.replaymod.refmap.json")
}
if (platform.isLegacyForge) {
loom.runs.named("client") {
property("fml.coreMods.load", "com.replaymod.core.LoadingPlugin")
}
}
repositories {
mavenLocal()
maven("https://repo.spongepowered.org/maven/")
maven("https://maven.terraformersmc.com/releases/") {
content {
includeGroup("com.terraformersmc")
}
}
maven("https://jitpack.io") {
content {
includeGroupByRegex("com\\.github\\..*")
}
}
exclusiveContent {
forRepository {
maven("https://api.modrinth.com/maven")
}
filter {
includeGroup("maven.modrinth")
}
}
}
// Include dep in fat jar without relocation and, when forge supports it, without exploding (TODO)
val shade by configurations.creating
// Include dep in fat jar with relocation and minimization
val shadow by configurations.creating {
exclude(group = "net.fabricmc", module = "fabric-loader")
exclude(group = "com.google.guava", module = "guava-jdk5")
exclude(group = "com.google.guava", module = "guava") // provided by MC
exclude(group = "com.google.code.gson", module = "gson") // provided by MC (or manually bundled for 1.11.2 and below)
}
dependencies {
if (platform.isFabric) {
val fabricApiVersion = when (mcVersion) {
11404 -> "0.4.3+build.247-1.14"
11502 -> "0.5.1+build.294-1.15"
11601 -> "0.14.0+build.371-1.16"
11603 -> "0.17.1+build.394-1.16"
11604 -> "0.42.0+1.16"
11701 -> "0.46.1+1.17"
11800 -> "0.43.1+1.18"
11801 -> "0.43.1+1.18"
11802 -> "0.47.9+1.18.2"
11900 -> "0.55.3+1.19"
11901 -> "0.58.5+1.19.1"
11902 -> "0.68.0+1.19.2"
11903 -> "0.68.1+1.19.3"
11904 -> "0.76.0+1.19.4"
12001 -> "0.83.1+1.20.1"
12002 -> "0.91.2+1.20.2"
12004 -> "0.91.2+1.20.4"
12006 -> "0.98.0+1.20.6"
12100 -> "0.100.3+1.21"
12102 -> "0.106.1+1.21.2"
12104 -> "0.111.0+1.21.4"
12105 -> "0.119.9+1.21.5"
12107 -> "0.128.1+1.21.7"
12110 -> "0.135.0+1.21.10"
12111 -> "0.139.5+1.21.11"
26_01_00 -> "0.144.3+26.1"
else -> throw UnsupportedOperationException()
}
val fabricApiModules = mutableListOf(
"api-base",
"networking-v0",
"keybindings-v0",
"resource-loader-v0",
)
if (mcVersion >= 11600) {
fabricApiModules.remove("keybindings-v0")
fabricApiModules.add("key-binding-api-v1")
}
if (mcVersion >= 11604) {
fabricApiModules.add("screen-api-v1")
fabricApiModules.add("networking-api-v1")
}
if (mcVersion >= 11700) {
fabricApiModules.remove("networking-v0")
}
if (mcVersion >= 12109) {
fabricApiModules.add("resource-loader-v1")
}
if (mcVersion >= 26_01_00) {
fabricApiModules.remove("key-binding-api-v1")
fabricApiModules.add("key-mapping-api-v1")
}
for (module in fabricApiModules) {
val dep = fabricApi.module("fabric-$module", fabricApiVersion)
modImplementation(dep)
"include"(dep)
}
}
if (!platform.isFabric) {
// Mixin 0.8 is no longer compatible with MC 1.11.2 or older
val mixinVersion = if (mcVersion >= 11200) "0.8.2" else "0.7.11-SNAPSHOT"
compileOnly("org.spongepowered:mixin:$mixinVersion")
implementation(shade("org.spongepowered:mixin:$mixinVersion") {
isTransitive = false // deps should all be bundled with MC
})
}
if (platform.isFabric) {
"include"(implementation(annotationProcessor("io.github.llamalad7:mixinextras-fabric:0.3.6")!!)!!)
}
implementation(shadow("com.googlecode.mp4parser:isoparser:1.1.7")!!)
implementation(shadow("org.apache.commons:commons-exec:1.3")!!)
implementation(shadow("com.google.apis:google-api-services-youtube:v3-rev178-1.22.0")!!)
implementation(shadow("com.google.api-client:google-api-client-gson:1.20.0")!!)
implementation(shadow("com.google.api-client:google-api-client-java6:1.20.0")!!)
implementation(shadow("com.google.oauth-client:google-oauth-client-jetty:1.20.0")!!)
val lwjgl by configurations.creating
for (suffix in listOf("", ":natives-linux", ":natives-windows", ":natives-macos", ":natives-macos-arm64")) {
lwjgl("org.lwjgl:lwjgl:3.3.1$suffix")
lwjgl("org.lwjgl:lwjgl-tinyexr:3.3.1$suffix")
}
compileOnly("org.lwjgl:lwjgl-tinyexr:3.3.1")
shadow(prebundle(lwjgl, "com/replaymod/render/utils/lwjgl.jar"))
if (mcVersion < 11200) {
// The version which MC ships is too old, we'll need to ship our own
implementation(shadow("com.google.code.gson:gson:2.8.7")!!)
}
implementation(shadow("com.github.javagl.JglTF:jgltf-model:3af6de4")!!)
if (platform.isFabric) {
implementation(shadow("org.apache.maven:maven-artifact:3.6.1")!!)
}
implementation(shadow("org.aspectj:aspectjrt:1.8.2")!!)
implementation(shadow("com.github.ReplayMod.JavaBlend:2.79.0:a0696f8")!!)
implementation(shadow("com.github.ReplayMod:ReplayStudio")!!)
// FIXME hack because I don't know how to get this to be inherited properly
implementation(rootProject.files("libs/ReplayStudio/.gradle/prebundled-jars/viaVersion.jar"))
implementation(project(path = jGui.path, configuration = if (platform.isUnobfuscated) null else "namedElements"))
implementation(shadow("com.github.ReplayMod:lwjgl-utils:27dcd66")!!)
if (platform.isFabric) {
val modMenuVersion = when {
mcVersion >= 26_01_00 -> "18.0.0-alpha.8"
mcVersion >= 12111 -> "17.0.0-alpha.1"
mcVersion >= 12110 -> "16.0.0-rc.1"
mcVersion >= 12107 -> "15.0.0-beta.3"
mcVersion >= 12105 -> "14.0.0-rc.2"
mcVersion >= 12104 -> "13.0.0-beta.1"
mcVersion >= 12102 -> "12.0.0-beta.1"
mcVersion >= 12100 -> "11.0.0-rc.4"
mcVersion >= 12006 -> "10.0.0-beta.1"
mcVersion >= 12003 -> "9.0.0-pre.1"
mcVersion >= 12002 -> "8.0.0"
mcVersion >= 12000 -> "7.0.1"
mcVersion >= 11904 -> "6.1.0-rc.4"
mcVersion >= 11903 -> "5.0.0-alpha.4"
mcVersion >= 11901 -> "4.0.5"
mcVersion >= 11900 -> "4.0.4"
mcVersion >= 11802 -> "3.1.0"
mcVersion >= 11800 -> "3.0.0"
mcVersion >= 11700 -> "2.0.0-beta.7"
mcVersion >= 11602 -> "1.16.8"
mcVersion >= 11600 -> null // maven doesn't have one for this version (only 1.16.5)
mcVersion >= 11500 -> "1.10.6"
else -> null
}
if (modMenuVersion != null) {
modCompileOnly("com.terraformersmc:modmenu:$modMenuVersion")
} else {
// Oldest modmenu on their maven is 1.10.5 for MC 1.15.2; for older versions we won't run it in dev
modCompileOnly("com.terraformersmc:modmenu:1.10.6")
}
// Lacks maven dependencies
if (mcVersion == 12006) {
//modRuntimeOnly("net.fabricmc.fabric-api:fabric-api:0.98.0+1.20.6")
}
}
val irisVersion = when {
mcVersion >= 26_01_00 -> "1.10.8+26.1-fabric"
mcVersion >= 12000 -> "1.7.2+1.20.1"
mcVersion >= 11600 -> "1.18.x-v1.2.0"
else -> null
}
if (irisVersion != null) {
modCompileOnly("maven.modrinth:iris:$irisVersion")
}
testImplementation("junit:junit:4.11")
}
preprocess {
keywords.set(mapOf(
".java" to PreprocessTask.DEFAULT_KEYWORDS,
".kt" to PreprocessTask.DEFAULT_KEYWORDS,
".json" to PreprocessTask.DEFAULT_KEYWORDS,
".mcmeta" to PreprocessTask.DEFAULT_KEYWORDS,
".cfg" to PreprocessTask.CFG_KEYWORDS,
".vert" to PreprocessTask.DEFAULT_KEYWORDS,
".frag" to PreprocessTask.DEFAULT_KEYWORDS,
))
patternAnnotation.set("com.replaymod.gradle.remap.Pattern")
}
tasks.jar {
archiveClassifier.set("raw")
if (!platform.isFabric) {
manifest {
attributes(
"TweakClass" to "com.replaymod.core.tweaker.ReplayModTweaker",
"TweakOrder" to "0",
"FMLCorePluginContainsFMLMod" to "true",
"FMLCorePlugin" to "com.replaymod.core.LoadingPlugin",
"FMLAT" to "replaymod_at.cfg",
)
}
}
}
if (!platform.isUnobfuscated) {
tasks.named<RemapJarTask>("remapJar") {
if (platform.isFabric) {
addNestedDependencies.set(true)
}
archiveClassifier.set("obf")
}
}
val configureRelocationOutput = project.layout.buildDirectory.file("configureRelocation")
val configureRelocation by tasks.registering {
dependsOn(tasks.jar)
dependsOn(shadow)
outputs.file(configureRelocationOutput)
doLast {
val pkgs = files(shadow).filter { it.exists() }.map {
val tree = if (it.isDirectory) fileTree(it) else zipTree(it)
val pkgs = mutableSetOf<String>()
tree.visit {
val file = this
if (!file.isDirectory && file.name.endsWith(".class") && file.path.contains("/")) {
val pkg = file.path.substring(0, file.path.lastIndexOf("/")) + "/"
if (pkg.startsWith("com/")) {
if (pkg.startsWith("com/google/")) {
if (!pkg.startsWith("com/google/common")) {
pkgs += pkg.substring(0, pkg.indexOf("/", "com/google/".length))
}
} else if (!pkg.startsWith("com/replaymod")) {
pkgs += pkg.substring(0, pkg.indexOf("/", 4))
}
} else if (pkg.startsWith("net/")) {
if (!pkg.startsWith("net/minecraft")
&& !pkg.startsWith("net/fabric")) {
pkgs += pkg.substring(0, pkg.indexOf("/", "net/".length))
}
} else if (pkg.startsWith("org/")) {
if (pkg.startsWith("org/apache/")) {
if (pkg.startsWith("org/apache/commons/")) {
if (!pkg.startsWith("org/apache/commons/io")) {
pkgs += pkg.substring(0, pkg.indexOf("/", "org/apache/commons/".length))
}
} else if (!pkg.startsWith("org/apache/logging")) {
pkgs += pkg.substring(0, pkg.indexOf("/", "org/apache/".length))
}
} else if (pkg.startsWith("org/lwjgl")) {
return@visit // either bundled with MC or uses natives which we can't relocate
} else if (!pkg.startsWith("org/spongepowered")) {
pkgs += pkg.substring(0, pkg.indexOf("/", 4))
}
} else if (pkg.startsWith("it/unimi/dsi/fastutil") && mcVersion >= 11400) {
return@visit // MC uses this as well
} else if (!pkg.startsWith("javax/")) {
// Note: we cannot just use top level packages as those will be too generic and we'll run
// into this long standing bug: https://github.com/johnrengelman/shadow/issues/232
val i = pkg.indexOf("/")
val i2 = pkg.indexOf("/", i + 1)
if (i2 > 0) {
pkgs += pkg.substring(0, i2)
}
}
}
}
pkgs
}.flatten().toSortedSet()
configureRelocationOutput.get().asFile.writeText(pkgs.joinToString("\n"))
}
}
val bundleJar by tasks.registering(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) {
from((if (platform.isUnobfuscated) tasks.jar else tasks.named<RemapJarTask>("remapJar")).flatMap { it.archiveFile }.map { zipTree(it) })
from((if (platform.isUnobfuscated) jGui.tasks.jar else jGui.tasks.named<RemapJarTask>("remapJar")).flatMap { it.archiveFile }.map { zipTree(it) }) {
filesMatching("mixins.jgui.json") {
filter { it.replace("de.johni0702", "com.replaymod.lib.de.johni0702") }
}
filesMatching("mixins.jgui.refmap.json") {
filter { it.replace("de/johni0702", "com/replaymod/lib/de/johni0702") }
}
}
relocate("de.johni0702", "com.replaymod.lib.de.johni0702")
manifest.from(tasks.jar.get().manifest)
from(shade.elements.map { it.map { zipTree(it) } })
configurations = listOf(shadow)
exclude("META-INF/INDEX.LIST", "META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", "module-info.class")
dependsOn(configureRelocation)
inputs.file(configureRelocationOutput)
doFirst {
configureRelocationOutput.get().asFile.forEachLine { pkg ->
val pkgName = pkg.replace("/", ".")
relocate(pkgName, "com.replaymod.lib.$pkgName")
}
}
// No need to shadow netty, MC provides it
// (actually, pre-1.12 ships a netty which is too old, so we need to shade it there anyway)
if (mcVersion >= 11200) {
relocate("com.github.steveice10.netty", "io.netty")
exclude("com/github/steveice10/netty/**")
}
if (mcVersion >= 11400) {
// MC ships this
exclude("it/unimi/dsi/fastutil/**")
}
minimize {
exclude(dependency(".*spongepowered:mixin:.*"))
}
}
tasks.assemble { dependsOn(bundleJar) }

385
docs/content.md Normal file → Executable file
View File

@@ -1,16 +1,14 @@
# Installation [installing]
## Installing the Replay Mod [replaymod]
The **ReplayMod** requires **Minecraft Forge** to be installed.
### Minecraft 1.14 and above
The **ReplayMod** for Minecraft 1.14 and above requires **Fabric** to be installed.
Depending on your **Replay Mod** version we recommend the following **Forge** versions:
You can find Fabric and the installation instructions [here](https://fabricmc.net/use/).
- Replay Mod 2.0.0 or later for Minecraft 1.11: Forge [1.11-13.19.1.2189](https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.11.html)
- Replay Mod 2.0.0 or later for Minecraft 1.10.2: Forge [1.10.2-12.18.2.2099](https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.10.2.html)
- Replay Mod 2.0.0 or later for Minecraft 1.9.4: Forge [1.9.4-12.17.0.1976](https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.9.4.html)
- Replay Mod 2.0.0 or later for Minecraft 1.8: Forge [1.8-11.14.4.1563](https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.8.html)
- Replay Mod 1.0.8 or older for Minecraft 1.8: Forge [1.8-11.14.3.1450](http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.8.html)
After installing Fabric, simply put the downloaded ReplayMod .jar file into the `/mods` folder of your Minecraft directory.
Other Forge Versions might, but don't necessarily work.
### Minecraft 1.12.2 and below
For Minecraft 1.12.2 and below it requires **Minecraft Forge** to be installed.
If you don't know how to install Forge, follow [this tutorial](https://www.youtube.com/watch?v=4i7-RystzC4).
@@ -19,63 +17,44 @@ After installing Forge, simply put the downloaded `ReplayMod.jar` file in the `/
> **Note:** The **Replay Mod** is entirely client side and can not be installed on the servers you play on.
## Installing FFmpeg [ffmpeg]
To use the **Replay Mod**'s [Rendering Feature](#replaying-render), you need to have FFmpeg installed.
To render your creations with **Replay Mod** you will need to have FFmpeg installed.
### Windows [windows]
Download the latest **FFmpeg Static Build** for your architecture from <http://ffmpeg.zeranoe.com/builds/>.
Then, extract the downloaded `.7z` file in the folder you want to install FFmpeg in.
Download the latest FFmpeg release from https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip.
Next, download this **Batch Script** to quickly install FFmpeg: <https://replaymod.com/files/ffmpeg-path-installer.bat>
Extract the downloaded .zip file into your `.minecraft` folder.
> **Note:** If your browser warns you about the download, dismiss the message. It's a simple Batch Script which won't damage your computer.
Historically the exact location inside the `.minecraft` folder was important, this is no longer the case.
It is sufficient for the `ffmpeg.exe` to be anywhere inside your `.minecraft` folder.
Put the downloaded script into the folder where you extracted FFmpeg and run itt by double-clicking it.
If you see a success message in the console, you've sucessfully installed **FFmpeg**!
**Notes for alternative launchers**
- Twitch launcher by default installs Minecraft instances in C:\\Users\\*username*\\Twitch\\Minecraft\\Instances\\*instancename*\\
- GD Launcher by default installs Minecraft instances in C:\\Users\\*username*\\AppData\\Roaming\\gdlauncher_next\\instances\\*instancename*\\
- MultiMC by default installs Minecraft instances in C:\\Program Files (x86)\\MultiMC\\instances\\*Instancename*\\.minecraft\\
Alternatively, starting with ReplayMod 2.0.0-b5, you can also extract the downloaded `.7z` file into a `ffmpeg` folder
(you have to create it, it doesn't exist by default) in your `.minecraft` folder. No need to run any **Batch Script**.
The FFmpeg executable should end up at `.minecraft/ffmpeg/bin/ffmpeg.exe`.
For these launchers, make sure FFmpeg exists inside the corresponding folder.
### Mac OSX [mac]
On OSX, you can install **FFmpeg** with **[Homebrew](http://brew.sh/)** using `brew install ffmpeg`.
Alternatively, you can download the latest static build from <https://ffmpeg.org/> and copy the ffmpeg executable to `/usr/local/bin`.
Alternatively, you can download the latest static build from <https://ffmpeg.org/> and copy the FFmpeg executable to `/usr/local/bin`.
### Linux [linux]
On Linux, you can install **FFmpeg** using your system's package manager, for example using `apt install ffmpeg`.
If in doubt, consult the documentation of your distribution.
## Compatibility with other Mods [compatibility]
### General information [general]
In General, the Replay Mod _should_ be compatible with most Forge Mods.
### Shaders Mod [shaders]
[Karyonix' Shaders Mod](http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1286604-shaders-mod-updated-by-karyonix)
is no longer compatible with Minecraft Forge starting with 1.9.4. As such it is not compatible with the Replay Mod either.
Please use [Optifine](https://optifine.net/) instead.
### Custom Main Menu [custom-main-menu]
The [Custom Main Menu](https://mods.curse.com/mc-mods/minecraft/226406-custom-main-menu) mod is often used in mod packs to customize their Main Menu with a button layout fitting the background image, links to their website / bug tracker and similar.
If you are familiar with it, the button ids for the Replay Mod are: **17890234** (text: `replaymod.gui.replayviewer`), **17890237** (text: `replaymod.gui.replayeditor`) and **17890236** (text: `replaymod.gui.replaycenter`)
Due to the nature of this Custom Main Menu mod, buttons added to the Main Menu by 3rd party mods like the **Replay Mod** will not show up by default.
Thus, to access the Replay Viewer/Editor/Center, you need to manually configure the position for those buttons.
To do so, you need to modify the Custom Main Menu configuration file.
Usually, you can find it at `.minecraft/config/CustomMainMenu/mainmenu.json` (if you're using a mod pack launcher, it normally has its own .minecraft folder).
For an explanation of this config file, have a look at Custom Main Menu's page.
You can find a list of already modified config files [here](https://gist.github.com/Johni0702/3f3fab81dbf7ada83d045d9fe8f345aa).
## Troubleshooting [troubleshooting]
If you need help installing the **Replay Mod** or **FFmpeg**, please read [this forum thread](https://www.replaymod.com/forum/thread/220)
by [bela333](https://www.replaymod.com/user/bela333) - it covers most of the problems that users encountered so far.
## Settings [settings]
To access the **Replay Mod Settings** from the Main Menu click the **"Mods"** button, select the **Replay Mod** from the list and
the click the **"Config"** button.
To access the **Replay Mod Settings** from the Main Menu click the **"Replay Viewer"** button and click the **Settings** button.
While playing, you can click the 'Mods' button in the Pause screen to reach **Replay Mod Settings** if you use Minecraft 1.12.2 and below, or have the mod _Mod Menu_ installed.
When in a Replay, you can either bind a hotkey to the **Replay Mod Settings** in Minecraft's Control settings
or use the hotkey GUI by clicking on the arrow button in the lower left corner.
or use the hotkey GUI by clicking on the hamburger button in the lower left corner.
## Accounts [accounts]
In previous versions of ReplayMod we used accounts to deliver videos to the **Replay Center**. This has since been discontinued and with that, so have the accounts.
Instead of the forum, you can join our [Discord server](https://discord.gg/5GR7RSb) to get support and answers.
# Recording [recording]
![](img/recording-indicator.jpg)
@@ -143,15 +122,13 @@ The minimum Speed value is **0.1 times** the normal Minecraft Tick Speed, and th
To the right of the Speed Slider, there is the **Replay Timeline**.
On the Replay Timeline, you see a yellow cursor indicating your current position in the Replay.
By clicking somewhere on this Timeline, you will travel in time towards the specified point in time.
Please note that it takes longer to do larger steps in time or to jump backwards in time.
Please note that it takes longer to do larger steps in time or to jump backwards in time (see also [Quick Mode](#replaying-quickmode)).
## Camera Paths [paths]
### Introduction [intro]
While in a Replay, you can create controlled **Camera Movements** using the Mods's **Keyframe System**.
Those Camera Paths can be rendered to a video later (see [Rendering](#replaying-render)).
Camera Paths are inspired by the [PixelCam Mod](http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/2327429-pixelcam-camera-studio-for-minecraft-1-8) which is based on the Camera Studio Mod.
The **Replay Mod Keyframe System** is similar to many Video Editing Software's Keyframe Systems.
If you're new to Keyframe Systems, try reading [this Wikipedia article](https://en.wikipedia.org/wiki/Key_frame).
@@ -170,6 +147,8 @@ If two Keyframes are 5 seconds apart, the Camera Path will take 5 seconds to int
You can drag Keyframes on the **Keyframe Timeline** by left-clicking them, holding the mouse button and moving your mouse.
> **Hint:** Made a mistake? You can use `Ctrl+Z` to undo your changes to the keyframe timeline. Changed you mind? Press `Ctrl+Y` (or `Ctrl+Shift+Z`) to redo them.
### Position Keyframes [place]
The basic components of a Camera Path are **Position Keyframes**.
A Position Keyframe stores a **Camera Position** (x, y, z, yaw, pitch, roll).
@@ -200,9 +179,6 @@ If you wish to disable smooth interpolation and want to make the Path follow str
You can easily toggle between **Linear** and **Cubic Interpolation** using the `O` key.
#### Path Preview [preview]
![](img/path-preview-icon.jpg)
While the **Path Preview** is enabled, this camera symbol is displayed in the lower right corner of the screen.
![](img/path-preview.jpg)
A normal **Path Preview**
@@ -278,60 +254,6 @@ You can change a Preset's name, select it from the list and click the **"Rename"
To load a Keyframe Preset, select a Preset from the list and click the **"Load"** button.
Using the **"Remove"** button, you can permanently delete a Keyframe Preset from the **Keyframe Repository**.
## Custom Objects [objects]
> Custom Objects are not available in the 2.0.0 versions. They are expected to return eventually.
[YouTube](_Xdpg828fbE)
### Introduction [introduction]
**Custom Objects** are mainly meant for **video creators**. They allow you to add any image into the Replay World and animate its Position, Opacity and much more.
Instead of using [Motion Tracking](https://en.wikipedia.org/wiki/Match_moving) to add text or pictures to a video, you can directly add these to the rendered file.
### Adding Assets [assets]
![](img/asset-manager.jpg)
The **Asset Manager** with an example Asset
In order to create **Custom Objects**, you first have to add **Assets** to your Replay File.
Therefore, open the **Asset Manager** using the `G` key.
In the **Asset Manager**, you can add **Image Files (.png, .jpg and more)**, so-called **Assets**, to the Replay.
When clicking the **"Add"** button, a File Chooser will show up. Select the image file you want to use.
You can give the Asset a custom name using the Text Input Field in the top right corner.
All of the Assets you added can be used by **Custom Objects**.
### Creating Custom Objects [creating]
![](img/object-manager.jpg)
The **Object Manager** with some **Animation Keyframes**
Using the `F` key, you can open the **Object Manager**. Initially there won't be any Objects in the **Object List**, but you can simply add an Object using the **"Add"** button.
After doing so, you can name the newly created **Custom Object** using the Text Field in the upper right corner.
To define which **Asset File** (i.e. image) the **Custom Object** should use, select the desired **Asset** from the dropdown beneath the Name Input.
If you leave the **Object Manager**, you should see the image in the World somwhere near your position.
### Animating Custom Objects [animating]
![](img/custom-object-animated.gif)
An animated **Custom Image Object**.
Of course, you don't want the image to stay at that position.
herefore, open the **Object Manager** again and select the **Custom Object** you want to modify.
On the lower half of the screen you will see mutliple **Input Fields**, using which you can modify various settings
(so-called **Transformations**), for example the Object's **Position**, **Scale**, **Orientation** and **Opacity**.
When editing these values, you'll notice that on the TImeline to the right, Keyframes appear.
You can set and remove Keyframes for specific settings using its "Add Keyframe" button on the very left of the screen.
The **Object Manager's Keyframe System** is very similar to the **Position Keyframe** and **Time Keyframe** System.
During a **Camera Path**, the **Custom Objects** will interpolate their **Transformation Values** like **Position Keyframes** are interpolated.
While outside the **Object Manager** you can preview the Objects' position by moving the cursor on the **Keyframe Timeline** - the Objects will interpolate to the position they'll be at that timestamp during the **Camera Path**.
Once you got the hang of it, you'll be able to quickly animate **Custom Objects**.
## Rendering [render]
With the **Replay Mod**, you can render **Camera Paths** to videos **without** using a screen recording tool like Fraps.
To get started, first [set up your Camera Path](#replaying-paths) as described in the previous chapters.
@@ -436,7 +358,14 @@ There are **7 Encoding Presets** you can choose from:
While these video files are of perfect quality, most **non-FFmpeg-based video players and video editing software** (e.g. QuickTime Player, Sony Vegas and Adobe Premiere) can't play these videos. Therefore, you should instead use the **MP4 - High Quality** preset in most cases.
- **PNG Sequence**
Exports the sequence as individual frames in the **PNG Format**.
**Warning:** This can create a huge amount of files, so make sure to save them in a separate folder.
The images are of perfect quality.
Depth map images are 32-bit float encoded in the 8-bit components in BGRA order and will need some kind of post-processing to be useful in most editors.
- **OpenEXR Sequence** (Minecraft 1.14 and above)
Exports the sequence as individual frames in the **OpenEXR Format**.
The images are of perfect quality and may contain
additional image layers beyond the visible one (e.g. [depth](#replaying-render-advanced-depth-map)).
As such, this format is a good choice if you have plenty of disk space to spare and want to perform additional editing
on the video in a third-party video editor.
### Advanced Settings [advanced]
![](img/rendersettings-advanced.jpg)
@@ -463,6 +392,21 @@ Using a **Video Editing Software** like **Adobe After Effects** or **Sony Vegas*
> **Note:** For best results, you should **disable clouds** before rendering, as they are transparent.
#### Depth Map [depth-map]
![](img/depthmapsuzanne.jpg)
"Suzanne" model added into a scene using Blender
This setting causes depth information to be recorded and included in video formats which support it
(currently only [OpenEXR](#replaying-render-settings-quality)).
Using a video editor which supports it (e.g. [Blender](https://www.blender.org/)), you can then for example (among many
other effects) add arbitrary geometry onto your rendered video in such a way that foreground objects in the
video will still occlude background geometry as if it actually was part of the world.
> **Note:** For best results, avoid semi-transparent blocks in front of your geometry, as they cannot be accurately represented in the depth map.
> **Note:** Anti-aliasing is not supported when exporting depth. Instead simply render and edit your video at a higher resolution and scale it down at the very end.
### Command Line Settings [commandline]
![](img/rendersettings-commandline.jpg)
The **Command Line Render Settings**
@@ -475,7 +419,7 @@ The **Replay Mod** runs [FFmpeg](http://ffmpeg.org/) via the **Command Line** to
You can customize both the **executed Command** and the **Command Line Arguments** in the **Command Line Settings** part of the **Render Settings Screen**.
#### Custom Command [command]
If you leave the left input field blank, `ffmpeg` will be used as **command**. If you haven't set your **PATH variable** to link to your FFmpeg distribution, simply enter the full path to your FFmpeg executable (e.g. `C:/ffmpeg/ffmpeg.exe` or `/usr/local/bin/ffmpeg`).
If you leave the left input field blank, `ffmpeg` will be used as **command**. If you haven't set your **PATH variable** to link to your FFmpeg distribution, simply enter the full path to your FFmpeg executable (e.g. `C:\ffmpeg\ffmpeg.exe` or `/usr/local/bin/ffmpeg`).
#### Command Line Arguments [arguments]
In the right input field, you can input custom **Command Line Arguments** to be used in the console.
@@ -510,29 +454,6 @@ To use **High Performance Rendering**, hold down the `Ctrl` key (`Cmd` key on M
but only after one rendered seconds (e.g. every 60 frames when rendering with 60fps)
- Resizing the Minecraft Window does not update the Rendering Gui
### Troubleshooting [troubleshooting]
> If you have trouble with rendering, please first consult the Documentation before asking for help in the Forums.
#### No FFmpeg installation found [ffmpeg]
![](img/ffmpeg-missing.jpg)
The error screen that is displayed when no FFmpeg installation could be found
If the **Replay Mod** tells you to install FFmpeg even though you already have, you have to manually tell the **Replay Mod** where your FFmpeg executable is located.
First, get the full path to your `ffmpeg.exe` (on Windows) or `ffmpeg` executable (on Mac/Linux).
On Windows, this path might look like `C:/ffmpeg/ffmpeg.exe`.
Then, open the **"Command Line Settings" Tab** in the Render Settings and paste this path into the **left input field** and retry rendering.
#### Crash while rendering [crash]
If Minecraft crashes after a few frames of rendering, it most likely means the **FFmpeg** didn't like the **Command Line Arguments** you passed.
If you customized the Command Line Arguments manually, re-check them - it's probably your own fault.
> **Hint:** In your .minecraft folder, you'll find a file called `export.log` which contains information about FFmpeg's rendering process.
If you did **not** customize the **Command Line Arguments**, you might have entered some insanely high (or low) values e.g. for Bitrate or Video Resolution. Try again with other, more reasonable values.
## Ambient Lighting [lighting]
![](img/ambient-lighting-comparison.jpg)
The same setting, onace with **Ambient Lighting** enabled, once with **Ambient Lighting** disabled
@@ -544,6 +465,14 @@ If you have a Replay in a dark setting (for example at nighttime, or in a cave)
This works as a replacement for the **Night Vision Potion Effect**, without the side effect of a weird sky color.
## Quick Mode [quickmode]
![](img/quickmode-icon.jpg)
In **Quick Mode**, this clock symbol is displayed in the lower right corner of the screen.
When you first enable **Quick Mode** in a replay, an internal reference of certain entity and block properties is stored for quick access, allowing for faster navigation in the **Replay Timeline**.
As a side effect, certain features like particles and second skin layers will not be rendered in the preview.
By default, **Quick Mode** is toggled with `Q`.
## Player Overview [overview]
![](img/player-overview.jpg)
The **Player Overview** Screen
@@ -567,11 +496,9 @@ The **Default Thumbnail** which is used if no Thumbnail was created
While in a Replay, you can use the `N` key to create a **Thumbnail** of the current Replay.
A **Thumbnail** is a Screenshot which should give the viewer a good impression of your Replay's content.
**Thumbnails** are important when uploading a Replay to the **Replay Center**,
as other users are much more likely to download your Replay if they can see a preview of it.
They also help keeping your **Replay Viewer** clear and structured.
**Thumbnails** help keeping your **Replay Viewer** clear and structured.
If no **Thumbnail** is set for a Replay, the **Default Thumbnail** will be displayed in the **Replay Viewer** and in the **Replay Center**.
If no **Thumbnail** is set for a Replay, the **Default Thumbnail** will be displayed in the **Replay Viewer**.
## Event Markers [markers]
![](img/marker-timeline.jpg)
@@ -594,84 +521,8 @@ This way, it's even simpler to add structure to your Replays.
You can **delete an Event Marker** by clicking it once to select it and then pressing the `DELETE` key.
# Replay Center [center]
The **Replay Center** is where you can **share** your **Minecraft Moments** with others and discover awesome **Replays by other Users**.
To be able to use the **Replay Center**, you need an **account on ReplayMod.com**.
## Authentication [auth]
![](img/auth-login.jpg)
The **Login Screen** which is displayed upon startup
![](img/auth-register.jpg)
The **Register Screen**
When starting Minecraft with the **Replay Mod** installed, you will be asked to login to **ReplayMod.com**.
If you don't want to use the **Replay Center**, you can click the **"Skip" Button** to continue without logging in.
If you want to browse other users' **Replays** and **share your own Replays** however, you need to **Register an account**.
> **Note:** By registering an Account on **ReplayMod.com**, you agree to the Website's [Terms of Service](https://www.replaymod.com/legal/terms)
Please note that you can only create **one ReplayMod.com Account per Minecraft Account**, so choose your username wisely.
Once you've registered, you're automatically going to be logged in. The Mod **remembers your login** until you manually log out from the **Replay Center**, so it won't ask you upon every startup if you logged in once.
## Replay Files [files]
![](img/replay-center.jpg)
The **Replay Center** in the Mod
Once you've logged in, you can use the **"Replay Center" Button** in the Main Menu to access the **Replay Center**.
In the upper half of the screen, there are **5 Buttons** for **5 Tabs** of the **Replay Center**:
- **Recent**
Shows the most recently uploaded Replays in the **Replay Center**
- **Best**
Shows the Replays with the **best rating and most downloads**
- **Downloaded**
Shows all of the Replays you've downloaded locally
- **Favorited**
Shows all of the Replays you favorited
- **Search**
Allows you to search for specific Replays
When you've found an insteresting looking Replay, you can download it using the **"Download" Button** in the lower left corner.
After downloading, you'll automatically join the Replay.
After you've downloaded a Replay, you can rate and favorite it in the **Replay Center** using the respective buttons.
> You are encouraged to rate Replays after you downloaded them to help promoting the best Replays.
## Upload Replays [upload]
![](img/replay-upload.jpg)
The **Replay Upload Screen**
You can share your own **Replay Files** with other users in the **Replay Center**.
Therefore, click the **"Upload" Button** in the **Replay Viewer** after selecting a Replay.
In the **Replay Upload Screen** there are **6 input fields**:
- **Replay Name**
The Replay's Name in the Replay Center
- **Replay Description**
A description of what happens in the Replay. Try to give the user a good impression why your Replay is worth downloading.
- **Category**
The Replay's Category, one of the following: **Survival**, **Build**, **Minigame**, **Miscellaneous**. If none of the other categories fit, use **Miscellaneous**.
- **Tags**
One or more tags that fit your replay, spearated by comma. **Example tags:** pvp,battle,redstone,creative
- **Hide Server IP**
If you've recorded a Replay on a private Server, you can remove the Server IP by checking the respective checkbox.
- **Thumbnail**
While you can't directly edit the Thumbnail when uploading, it is highly recommended that
you [create a Thumbnail](#replaying-thumbnail) before sharing your Replay.
Replays without a Thumbnail are much less likely to be downloaded by other users.
When uploading a Replay File, make sure to follow the [Replay Center Rules](https://www.replaymod.com/rules).
# Frequently Asked Questions [faq]
### Do I need a ReplayMod.com Account to use the mod?
You only need a ReplayMod.com Account to access the [Replay Center](#center).
All of the other features are also available offline.
### For how long can I record?
Theoretically, a Replay File can be up to **24 days, 20 hours, 30 minutes and 23 seconds** long - which is a timespan you'll probably never reach.
@@ -694,3 +545,113 @@ A Replay in which you travelled around and discovered a lot of terrain is signif
An average Replay File of **10 Minutes duration** usually is between **2MB and 10MB large**.
Replays recorded on **Minigame Servers** with lots of particle effects and world changes might be larger.
# Troubleshooting [troubleshooting]
> If you have trouble with rendering, please first consult the Documentation before asking for help in the Discord.
## No FFmpeg installation found [ffmpeg]
![](img/ffmpeg-missing.jpg)
The error screen that is displayed when no FFmpeg installation could be found
If you have not installed FFmpeg, please follow the steps provided [here](#installing-ffmpeg)
If already have installed FFmpeg, you have to manually tell the **Replay Mod** where your FFmpeg executable is located.
First, get the full path to your `ffmpeg.exe` (on Windows) or `ffmpeg` executable (on Mac/Linux).
On Windows, this path might look like `C:\ffmpeg\ffmpeg.exe`.
Then, open the **"Command Line Settings" Section** in the Render Settings and paste this path into the **left input field** and retry rendering.
## Crash while rendering [crash]
If Minecraft crashes after a few frames of rendering, it most likely means the **FFmpeg** didn't like the **Command Line Arguments** you passed.
If you customized the Command Line Arguments manually, re-check them - it's probably your own fault.
> **Hint:** In your .minecraft folder, you'll find a file called `export.log` which contains information about FFmpeg's rendering process.
- If you did **not** customize the **Command Line Arguments**, you might have entered some insanely high (or low) values e.g. for Bitrate or Video Resolution. Try again with other, more reasonable values.
- Make sure the camera doesn't move below Y=0 or above Y=255
## Unsupported Launchers [launchers]
_Future Client_ is not compatible with the Mixin required by ReplayMod.
_Lunar Client_ does not support ReplayMod.
_Badlion Client_ offers a different ReplayMod that is not the same as this one.
## Compatibility with other Mods [compatibility]
### General information [general]
In General, the Replay Mod _should_ be compatible with most Forge and Fabric Mods.
### Shaders Mod [shaders]
_Karyonix' Shaders Mod_ is no longer compatible with Minecraft Forge starting with 1.9.4. As such it is not compatible with the Replay Mod either.
Below Minecraft 1.16 you can try _Optifine_ instead. Note however, that official support has ended and many versions break ReplayMod.
On Minecraft 1.16.5 and up you can use _Iris_, which is fully supported. For the time being, you will have to use it with the custom _Sodium_ provided on our download page. The fix it includes is pending for the official version.
### Custom Main Menu [custom-main-menu]
The _Custom Main Menu_ mod is often used in mod packs to customize their Main Menu with a button layout fitting the background image, links to their website / bug tracker and similar.
If you are familiar with it, the button id for the Replay Mod is: **17890234** (text: `replaymod.gui.replayviewer`).
Due to the nature of this Custom Main Menu mod, buttons added to the Main Menu by 3rd party mods like the **Replay Mod** will not show up by default.
Thus, to access the Replay Viewer/Editor/Center, you need to manually configure the position for those buttons.
To do so, you need to modify the Custom Main Menu configuration file.
Usually, you can find it at `.minecraft/config/CustomMainMenu/mainmenu.json` (if you're using a mod pack launcher, it normally has its own .minecraft folder).
For an explanation of this config file, have a look at Custom Main Menu's page.
You can find a list of already modified config files [here](https://gist.github.com/Johni0702/3f3fab81dbf7ada83d045d9fe8f345aa).
### Tickrate Changer [tickrate-changer]
The _Tickrate Changer_ mod may cause minecraft to freeze when you try to use the Replay Viewer UI.
### LabyMod [labymod]
_LabyMod_ v3.7.x has been reported to be compatible with ReplayMod and other Forge mods.
Lower versions are not compatible.
### OldAnimationsMod [oldanimationsmod]
In case your Minecraft crashes when you are using both ReplayMod and _OldAnimationsMod_, try removing OldAnimationsMod.
### Orange's 1.7 Animations [17animations]
If you use ReplayMod with shaders and _1.7 Animations_ you may see floating water and glass. Remove 1.7 Animations to resolve this.
### Sk1er Club: Patcher [patcher]
We have seen reports of crashes that were related to _Patcher_; in case of crashes try removing Patcher.
### Baritone [baritone]
The _Baritone_ mod can cause a crash when you're trying to load a replay. If you experience such problems, try running without Baritone.
### RandomPatches [randompatches]
Minecraft may crash if you try to use _RandomPatches_ together with ReplayMod. Try removing RandomPatches if Minecraft crashes on startup.
### Sodium [sodium]
ReplayMod can record when _Sodium_ is installed, but currently lacks the FREX Flawless Frames API to render. A modified build of _Sodium_, that supports this API, is available from the ReplayMod downloads, by clicking the `Click to show compatible Sodium versions` button.
### Resource Loader [resourceloader]
The _Resource Loader_ mod is not compatible with ReplayMod.
### LiteLoader [liteloader]
![](img/mutlimc-liteloader.jpg)
The MultiMC interface to place ReplayMod above LiteLoader.
![](img/multimc-addempty.jpg)
The properties for the new *Empty*.
_LiteLoader_ is known to cause issues due to the mixin version it contains.
You can use MultiMC to workaround this problem.
> The MultiMC `Edit` function requires that your computer has a default editor for json files associated.
1: Create your instance then edit the instance
2: Click `Install Forge`
3: Click `Install LiteLoader`
4: Click `Add Empty`; use `ReplayMod` as name and `com.replaymod` as uid
5: Select the new *ReplayMod* and click `Edit`
6: Replace the contents with one of the below snippets
7: Save and close the text editor
8: Move *ReplayMod* up until it is **above** *LiteLoader*
9: Remove the ReplayMod jar from the mods folder if you installed it previously.
** Snippet for 1.8.9 **
`{ "formatVersion": 1, "name": "ReplayMod", "uid": "com.replaymod", "version": "1.8.9-2.4.5", "libraries": [{ "name": "com.replaymod:replaymod:1.8.9-2.4.5", "MMC-absoluteUrl": "https://minio.replaymod.com/replaymod/replaymod-1.8.9-2.4.5.jar" }]}`
** Snippet for 1.12.2 **
`{ "formatVersion": 1, "name": "ReplayMod", "uid": "com.replaymod", "version": "1.12.2-2.4.5", "libraries": [{ "name": "com.replaymod:replaymod:1.12.2-2.4.5", "MMC-absoluteUrl": "https://minio.replaymod.com/replaymod/replaymod-1.12.2-2.4.5.jar" }]}`

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 KiB

After

Width:  |  Height:  |  Size: 439 KiB

BIN
docs/img/quickmode-icon.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
docs/img/quickmode-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 255 KiB

23
docs/package-lock.json generated Normal file
View File

@@ -0,0 +1,23 @@
{
"name": "replaymod-docs",
"version": "0.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"array-findindex-polyfill": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/array-findindex-polyfill/-/array-findindex-polyfill-0.1.0.tgz",
"integrity": "sha1-w2JmW+x2RfItejw6rJeT9xw2Iu8="
},
"md-jml": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/md-jml/-/md-jml-2.0.1.tgz",
"integrity": "sha1-th99rTm1JPVKCmpthnMcTRLOCDo="
},
"string.prototype.endswith": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/string.prototype.endswith/-/string.prototype.endswith-0.2.0.tgz",
"integrity": "sha1-oZwg3uUamHd+mkfhDwm+OTubunU="
}
}
}

10
gradle.properties Normal file
View File

@@ -0,0 +1,10 @@
essential.defaults.loom=0
essential.defaults.loom.fabric-loader=net.fabricmc:fabric-loader:0.18.5
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx8G
org.gradle.parallel=true
org.gradle.configureondemand=true
loom.ignoreDependencyLoomVersionValidation=true

View File

@@ -1,482 +0,0 @@
0ab7e4217b2702316adceabd4c1dfca0250dbe33c22e08c98b433939207edfc0 /com/cloudbees/cloudbees-oss-parent/1/cloudbees-oss-parent-1.pom
e6509db2167c983d254d3530c66a060443e91a6ca38df9fdc4ef2a88ad813fa5 /com/cloudbees/diff4j/1.1/diff4j-1.1.jar
a09a4ac520f9ec5ccd16195272fd8ed4c667285f9e129da5acf633bb21a7d174 /com/cloudbees/diff4j/1.1/diff4j-1.1.pom
754184022345800c2d066eceeaf2f7a88a7c2aaeae23eb1c76ef598854aa9157 /com/fasterxml/jackson/core/jackson-core/2.1.3/jackson-core-2.1.3.jar
cc3bfcc34a29c041e7cafc05ed6f0c3ebf8a7dcf812489a64f4c37f4f5279adf /com/fasterxml/jackson/core/jackson-core/2.1.3/jackson-core-2.1.3.pom
a30a3f89fbbea23deb5290e832eb0d12a8171ae8ba4461af2b936ed0245ee697 /com/fasterxml/oss-parent/4/oss-parent-4.pom
4cad4ee2f1c379fa1f6496912fe026d8a4f2febf0a140ff867206b00a22f988f /com/github/abrarsyed/jastyle/jAstyle/1.3/jAstyle-1.3.jar
cd62bdfd946618c26b49451084361edf79cd6ddb3eae1a485ecb05319295896d /com/github/abrarsyed/jastyle/jAstyle/1.3/jAstyle-1.3.pom
33b3d79f3e27d33c46411ab7b7d81f43f12756e18c8936063f18b1a950a5f84b /com/github/jengelman/gradle/plugins/shadow/1.2.3/shadow-1.2.3.jar
f00facfc855e7d5517fc57553614b4690e61df9ab44f6e93ff583ae201b5a3aa /com/github/jengelman/gradle/plugins/shadow/1.2.3/shadow-1.2.3.pom
27fc3b7f0436f532c9d798dbc006d7e0b9b7c9b436f8d977f122665c633e9892 /com/github/johni0702/gradle-ecj-plugin/795736c/gradle-ecj-plugin-795736c.jar
f98b3e07c6b6a32dd6f9f70f5cef4ac9be42a9a6c850ceb8f33767da94706635 /com/github/johni0702/gradle-ecj-plugin/795736c/gradle-ecj-plugin-795736c.pom
11f4032947acc6ef1be538031cb0ea4d2fdfd50d97a0391af27bff3274a239f2 /com/github/johni0702/gradle-reproducible-builds-plugin/a524ada/gradle-reproducible-builds-plugin-a524ada.jar
03e3dff7f9b3ac6cd3b87684fd36a2f6996a4b164a2f8fab9c22c01cb7bfb84b /com/github/johni0702/gradle-reproducible-builds-plugin/a524ada/gradle-reproducible-builds-plugin-a524ada.pom
75ccc0e24d37ed5b8916e1bcffad1e067c2b1cfa21b635287f968db5c3c1963a /com/github/jponge/lzma-java/1.3/lzma-java-1.3.jar
fbcba81b21a8bc3c0761e4798fa05285444b43d681c03c9af49f9b2e1ecb0184 /com/github/jponge/lzma-java/1.3/lzma-java-1.3.pom
0dbc963a2906295a032f6b46459ad7e9fbd276243da4b347787b536c4ead3d2c /com/github/ReplayMod/ReplayStudio/2b063ec/ReplayStudio-2b063ec.jar
29a7d1756a4a080891bc7521811d848d6e4f1f61520d2327ebaaf3c5ab220c84 /com/github/ReplayMod/ReplayStudio/2b063ec/ReplayStudio-2b063ec.pom
c6ebd74cd6108b8c372c95b842725ee5bd6d3303ba26cb00f18bc92f80b47956 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.jar
7cdd89a892927998beab59398ef073232588f6e83e411cf4f0905833bf300487 /com/github/tony19/named-regexp/0.2.3/named-regexp-0.2.3.pom
47c625c83a8cf97b8bbdff2acde923ff8fd3174e62aabcfc5d1b86692594ffba /com/google/api-client/google-api-client/1.22.0/google-api-client-1.22.0.jar
83175461277124a08d23d9df647912771276fed44ce60ff03847b51c98bf7459 /com/google/api-client/google-api-client/1.22.0/google-api-client-1.22.0.pom
d68647ba10cfa33e0b6e538c704723229932795d5ee495288cec46a6156c5891 /com/google/api-client/google-api-client-gson/1.20.0/google-api-client-gson-1.20.0.jar
383d5b31bfa2b5599de972dfc3d77750b8015c9496f66c591d92ca778a23dd4e /com/google/api-client/google-api-client-gson/1.20.0/google-api-client-gson-1.20.0.pom
df4f423f33f467d248e51deb555404771f7bc41430b2d4d1e49966c79c0b207b /com/google/api-client/google-api-client-java6/1.20.0/google-api-client-java6-1.20.0.jar
766995ae6c9240e1c77a68b3347706506ecde95aa8196ddd4ed567ce8df8cceb /com/google/api-client/google-api-client-java6/1.20.0/google-api-client-java6-1.20.0.pom
d8e9ec26a01cc19c530ab781cc71185acb9f9d576716e3d585a1d4f12f2089c8 /com/google/api-client/google-api-client-parent/1.20.0/google-api-client-parent-1.20.0.pom
2bc283b1247550e6e8401d97dc7f1ac2d5b17382b9984df011d9a3564fe632ae /com/google/api-client/google-api-client-parent/1.22.0/google-api-client-parent-1.22.0.pom
88debb16c533600c3b0290a088f2de3b3a8318ff86ebe0bdbcefeab0a0eafb9e /com/google/apis/google-api-services-youtube/v3-rev178-1.22.0/google-api-services-youtube-v3-rev178-1.22.0.jar
4dad29307c34e923ebb6d29e2c265850a0f0b691c7a63384279aa8353eae28b9 /com/google/apis/google-api-services-youtube/v3-rev178-1.22.0/google-api-services-youtube-v3-rev178-1.22.0.pom
905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed /com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar
feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a /com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.pom
c885ce34249682bc0236b4a7d56efcc12048e6135a5baf7a9cde8ad8cda13fcd /com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.jar
4170a761dc5bfd3981a8e6f7aab9e2acdce82d34fd5aa9bb11e3c090d25314ce /com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.pom
8cc1f0813a186079f82d300a43156bdf852a88008f4f1a1fa71e788fb3b9a86d /com/google/code/google-collections/google-collect/snapshot-20080530/google-collect-snapshot-20080530.jar
7d131d6a082a33363bdfbf55d2fee2219d9bc8d1c455cc3f7c6403cf2a4496a5 /com/google/code/google-collections/google-collect/snapshot-20080530/google-collect-snapshot-20080530.pom
35c94198255e95f6f11501eb4b3d43a5276bfdd142ab7c904722e69bff51f69e /com/google/code/gson/gson/2.1/gson-2.1.jar
894da89d477e805389c9df1d6fa8bd552285aed56a399d5749213520a7c74054 /com/google/code/gson/gson/2.1/gson-2.1.pom
c0328cd07ca9e363a5acd00c1cf4afe8cf554bd6d373834981ba05cebec687fb /com/google/code/gson/gson/2.2.4/gson-2.2.4.jar
ae984d5d19894ce6dc4689866eaa12f8fc31409113e60ee3b44853b8ac4fd380 /com/google/code/gson/gson/2.2.4/gson-2.2.4.pom
4838f4f29a027522363cef1bcda1b48808880b0de4953fab6db4121ee27b649b /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.jar
be4f53c0bc04da4e3d6c65c8f3243d1ea4135e35c7d7dda88af1c582687263d7 /com/googlecode/jarjar/jarjar/1.1/jarjar-1.1.pom
ddbbf392f8e61f770a509a49aed5f32ead19768283b4b512c626e09e1ba5cc46 /com/googlecode/mp4parser/isoparser/1.1.7/isoparser-1.1.7.jar
6890ebacb23d3ab51a5751a830f5269b7e8fdd19d08b7e055bc739f62b4bd174 /com/googlecode/mp4parser/isoparser/1.1.7/isoparser-1.1.7.pom
8c36a80ea613d0b6b8040a17cf837c5bbe3677bc1b06a058a6c174fdb787ebbc /com/google/guava/guava/17.0/guava-17.0.jar
2a0d16010d3825c732aeab1d25f181074945063d8f76c28004e7d423d66cb75b /com/google/guava/guava/17.0/guava-17.0.pom
d664fbfc03d2e5ce9cab2a44fb01f1d0bf9dfebeccc1a473b1f9ea31f79f6f99 /com/google/guava/guava/18.0/guava-18.0.jar
e743d61d76f76b5dc060d6f7914fdd41c4418b3529062556920116a716719836 /com/google/guava/guava/18.0/guava-18.0.pom
58d4cc2e05ebb012bbac568b032f75623be1cb6fb096f3c60c72a86f7f057de4 /com/google/guava/guava/19.0/guava-19.0.jar
addc064da7f1077fdf4dc90e5aaa887cd790850d1b74fe2e6e25d5f78551ac63 /com/google/guava/guava/19.0/guava-19.0.pom
59bf456547b6dda3ced968cb56f7f2d3e14474e2de2960a32c47e31c1e456c61 /com/google/guava/guava-jdk5/17.0/guava-jdk5-17.0.jar
f8c152627813d45bc4e7cc17ad6ed6a649a0231ae819ffb8e05d19b205a3db66 /com/google/guava/guava-jdk5/17.0/guava-jdk5-17.0.pom
9fba53585551d3c775179de859760a73c4beab407dfde16b551a09a87b50532a /com/google/guava/guava-parent/17.0/guava-parent-17.0.pom
a4accc8895e757f6a33f087e4fd0b661c5638ffe5e0728f298efe7d80551b166 /com/google/guava/guava-parent/18.0/guava-parent-18.0.pom
3b76ff43ecdf10f74da36e4aae2b470c9d063e053c5ca026f5512ae94f1c3e10 /com/google/guava/guava-parent/19.0/guava-parent-19.0.pom
5a9606bc27632956b3c11df887e9b3e785854068aaa4e0808ed5660f60b1fb6f /com/google/guava/guava-parent-jdk5/17.0/guava-parent-jdk5-17.0.pom
f744c79f198e53deea4cd311f9135a568ab67052804d80fd3d60b0385644cf65 /com/google/http-client/google-http-client/1.20.0/google-http-client-1.20.0.pom
f88ffa329ac52fb4f2ff0eb877ef7318423ac9b791a107f886ed5c7a00e77e11 /com/google/http-client/google-http-client/1.22.0/google-http-client-1.22.0.jar
30e7611df40360bdc24325caaa2f7888e847680f2e64e579c28c87a53e5bb422 /com/google/http-client/google-http-client/1.22.0/google-http-client-1.22.0.pom
cc144c70d40acf7c6e6f773ac19a2ac6e3ed9830d8e33e32421ff21a91450994 /com/google/http-client/google-http-client-gson/1.20.0/google-http-client-gson-1.20.0.jar
9b292239a52300b687940164987f0fccc1132049e774d8d90274998e58949f7c /com/google/http-client/google-http-client-gson/1.20.0/google-http-client-gson-1.20.0.pom
45b1e34b2dcef5cb496ef25a1223d19cf102b8c2ea4abf96491631b2faf4611c /com/google/http-client/google-http-client-jackson2/1.22.0/google-http-client-jackson2-1.22.0.jar
184c3aaa66f32be7bf592caab362becd10a80b15b077c3ebe9ae9fa9d387f41a /com/google/http-client/google-http-client-jackson2/1.22.0/google-http-client-jackson2-1.22.0.pom
5c592d663ac30387eb30551a20cbd401bde859095f94ec2bef8ed2a4acf7a8f1 /com/google/http-client/google-http-client-parent/1.20.0/google-http-client-parent-1.20.0.pom
3927309767100e548d1f5c20e150d75716e03a3d8a1a1b970c8a75fbddae072e /com/google/http-client/google-http-client-parent/1.22.0/google-http-client-parent-1.22.0.pom
f279a8172e7671c9dcd896850aaa6ce85e1d93e5bc0a10fd7c7a6efbf76f60db /com/google/oauth-client/google-oauth-client/1.20.0/google-oauth-client-1.20.0.pom
a4c56168b3e042105d68cf136e40e74f6e27f63ed0a948df966b332678e19022 /com/google/oauth-client/google-oauth-client/1.22.0/google-oauth-client-1.22.0.jar
52a2b2c1a4365668545134157ee7bb141c6b537caa29a4e51f3228ce0bbbeaf9 /com/google/oauth-client/google-oauth-client/1.22.0/google-oauth-client-1.22.0.pom
3149ae4fa222c7e804c5b7bc0d044702bc6bb8309b5ed94f6d350a5d4d657fc9 /com/google/oauth-client/google-oauth-client-java6/1.20.0/google-oauth-client-java6-1.20.0.jar
61233bbb437dc91504076a644ce77b1066f679d1252362d08de67d296c404cf0 /com/google/oauth-client/google-oauth-client-java6/1.20.0/google-oauth-client-java6-1.20.0.pom
daabf9d4e35d4015c2c917982463572856a5c8d7fa718e94edb2b6b114a2a8a2 /com/google/oauth-client/google-oauth-client-jetty/1.20.0/google-oauth-client-jetty-1.20.0.jar
2c594b64206b24c2ec9506769cac5c637346152c7822f0337721776c6eb092db /com/google/oauth-client/google-oauth-client-jetty/1.20.0/google-oauth-client-jetty-1.20.0.pom
374fb28a2c74f92999de4d843f788838f38fd89b570c95813513546a0e7ae3ca /com/google/oauth-client/google-oauth-client-parent/1.20.0/google-oauth-client-parent-1.20.0.pom
2e7acb933f8c1b801b78925e4d22c32040a414dc7246bfdb777d8ad78404fa66 /com/google/oauth-client/google-oauth-client-parent/1.22.0/google-oauth-client-parent-1.22.0.pom
bbc21cab2e0b0c76c9977fdf8b80c311788094d81e6910a2a6e63d80910102c7 /com/gradle/publish/plugin-publish-plugin/0.9.1/plugin-publish-plugin-0.9.1.jar
89aa507536b0a93d8c9d3087d738255eefffc002cefa255ebdbd6891b8165447 /com/gradle/publish/plugin-publish-plugin/0.9.1/plugin-publish-plugin-0.9.1.pom
147592c5eb8e11fc8394125954f877acf25918bae13aa210c2825aefc3030ed8 /com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar
06b382efe9d60474aa3df7f4851397b3ae0c4f142567f0fc66a8fa2706a665e4 /com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.pom
2c149735a093b6c65a27db760896ad5c5b06e29100bb8969937667784fef4ba0 /com/mojang/authlib/1.5.16/authlib-1.5.16.jar
d05175230d79f518b5c4664d24e3d115f5f3888e3806f3b6076cd0b4943e6ca6 /com/mojang/authlib/1.5.16/authlib-1.5.16.pom
795f783dc6301d10e356d1f3db9952d71692ed8004ffdd843f0049f813a0d1a5 /com/mojang/authlib/1.5.24/authlib-1.5.24.jar
0ff47d5e96e67c629513d5cc743a5180dc935603e5957b11ea05fe021bacd5f9 /com/mojang/authlib/1.5.24/authlib-1.5.24.pom
3120fd24c09ab9bc088cb9c1eb2065be86718608450fdbc27b5d371729a619cb /com/mojang/netty/1.6/netty-1.6.jar
568cc3fad81e5e389bad0012a07eca5db073e287200c6c9cb02caf3dc489e9f6 /com/mojang/netty/1.6/netty-1.6.pom
9076a115056a4a3ce85b3f8b8c06b8e4ea723d856ab87592d72ac9fd3fa67c9f /com/mojang/realms/1.10.4/realms-1.10.4.jar
0e436798162614ebaa8a04c225ff0100d046848759a3d8a5f5bc3c73dcdaea13 /com/mojang/realms/1.10.4/realms-1.10.4.pom
e7cd8951956d349b568b7ccfd4f5b2529a8c113e67c32b028f52ffda371259d9 /commons-cli/commons-cli/1.2/commons-cli-1.2.jar
18f3e92076e08c2fde48317025098e9f6baaa85f6912eb43f2d7e68d570e4561 /commons-cli/commons-cli/1.2/commons-cli-1.2.pom
1bafd2ece2e88db4cdf835a7f8f0de65fab5b1147977a5dcc59b7c1b8c6f5080 /commons-codec/commons-codec/1.3/commons-codec-1.3.jar
d157e34244e884dd91fa01921ca84372e11f7bb08fedb5d456c0670c28054636 /commons-codec/commons-codec/1.3/commons-codec-1.3.pom
54b34e941b8e1414bd3e40d736efd3481772dc26db3296f6aa45cec9f6203d86 /commons-codec/commons-codec/1.6/commons-codec-1.6.jar
a06e35d3fff3a6b813d94894ebf3e498f9540c864c5b39ae783907e3a6c72889 /commons-codec/commons-codec/1.6/commons-codec-1.6.pom
ad19d2601c3abf0b946b5c3a4113e226a8c1e3305e395b90013b78dd94a723ce /commons-codec/commons-codec/1.9/commons-codec-1.9.jar
e5efcf039cd909688c201dc5479b144fd6f01f0e40252b7fc5e7d2e1b5c07990 /commons-codec/commons-codec/1.9/commons-codec-1.9.pom
a7f713593007813bf07d19bd1df9f81c86c0719e9a0bb2ef1b98b78313fc940d /commons-io/commons-io/1.4/commons-io-1.4.jar
2dae496a19c82b8e9985a1246aa80cf98082b1ae2217cf4b2d4d5ff13a365af2 /commons-io/commons-io/1.4/commons-io-1.4.pom
cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 /commons-io/commons-io/2.4/commons-io-2.4.jar
b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 /commons-io/commons-io/2.4/commons-io-2.4.pom
ce6f913cad1f0db3aad70186d65c5bc7ffcc9a99e3fe8e0b137312819f7c362f /commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
d0f2e16d054e8bb97add9ca26525eb2346f692809fcd2a28787da8ceb3c35ee8 /commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.pom
70903f6fc82e9908c8da9f20443f61d90f0870a312642991fe8462a0b9391784 /commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar
3250ac3ac6bd60ed0631f5cd0335032b2993d63e405a6ae0555d27a7e4865849 /commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.pom
33a4dd47bb4764e4eb3692d86386d17a0d9827f4f4bb0f70121efab6bc03ba35 /commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar
69b8be61aa746c7d02acb1b11eb3b57cb22b246780ed71d79764195cbbe3d99d /commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.pom
f868fc9e23d7203834abb5e0d11782e1e8920d4e95a06735a13dd51ab8049de8 /com/mycila/maven-license-plugin/maven-license-plugin/1.10.b1/maven-license-plugin-1.10.b1.jar
9576f1134ebf1f0dae51d1e5cce46a6a6e5b5c5998cc12318ebfd16162702d8b /com/mycila/maven-license-plugin/maven-license-plugin/1.10.b1/maven-license-plugin-1.10.b1.pom
d190c18ef3caf788c84a49d6bc200be29a76c00d3ad6030bf11f7afaa4b24f88 /com/mycila/parent-pom/5/parent-pom-5.pom
870f9396789e2f48a7b8fb28dfc070c2f8e74b2007274ce23e69b658110fd294 /com/mycila/xmltool/xmltool/3.3/xmltool-3.3.jar
eb83f616945c8c7dfb4d80e6f909e7286f523bb11077802bcd216bd70e9c717a /com/mycila/xmltool/xmltool/3.3/xmltool-3.3.pom
a661dfcb749053fc26eada2a0a8e619a8ead1ca9eda29e1698687aa2cdd80152 /com/nothome/javaxdelta/2.0.1/javaxdelta-2.0.1.jar
93bbe8babc70e175d406ac689b90e689f4915c6e39e738eb6406fa5b529ce36c /com/nothome/javaxdelta/2.0.1/javaxdelta-2.0.1.pom
6c4b4e50e608763564afa1bde2d25ece9dd715e7c9129540faa1faded4896506 /com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar
d246a119ba41e3c866bf728fb6e98277bd3f8695130056039dbbfd000cc3ff6b /com/paulscode/codecjorbis/20101023/codecjorbis-20101023.pom
bb7d17b340afe6abdfbfdaa03683bce4aef39a64887dbab0636eaff3cf2d59ba /com/paulscode/codecwav/20101023/codecwav-20101023.jar
5f95932d9b4b254b890d9105f2d3917bc60ceaf77ae1bc75a79c6b20662e596d /com/paulscode/codecwav/20101023/codecwav-20101023.pom
333bbefeff5eb1722dc9b8d2e26c38bc69c1efa07d0ca870480f29d8858aa336 /com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar
ce4a18bc8e94f155421f6b3d0b9bb6939c9ca206df85e5c10587e66e34310c44 /com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.pom
107d11509f6af59b8c2ba23df828bc5d3c4e067b58f3d858c7deb90ca5308f84 /com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar
ff88b9584f5ba98863f24fc3f6014854c7a176fe7017813a6d023e722ce05aee /com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.pom
2882d64550240dd0c026724da664d9f97ef205c91d6a85273d10790d88608f34 /com/paulscode/soundsystem/20120107/soundsystem-20120107.jar
c1a2438a4d35f8586c71d96c44a7e2f133ec924597147a246f8c501acca6acb5 /com/paulscode/soundsystem/20120107/soundsystem-20120107.pom
4ccbc821a417f0174c9734fc721f078177cacef94ded09c3775ebf40c6a7bdfd /com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.jar
9f9920b48ae5f1045fe966f08164d6b4e0a727cf17f8e4813ae5c0f2daecffbc /com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.pom
c160fbd78f51a0c2375a794e435ce2112524a6871f64d0331895e9e26ee8b9ee /com/typesafe/config/1.2.1/config-1.2.1.jar
62361ef10448869fff8c05150bd0449b423e3ff4498f2a4bab825b3c7685aa3c /com/typesafe/config/1.2.1/config-1.2.1.pom
9346e52ec542a990ea18722a7ff61a208b14796ba4a117bf0a1a043dee3cfc7c /de/oceanlabs/mcp/mcp/1.11/mcp-1.11-srg.zip
912bc85953e769198afbc52ac1b7f324a86990529706b36d4771415cab5f3a3d /de/oceanlabs/mcp/mcp_snapshot/20161111-1.10.2/mcp_snapshot-20161111-1.10.2.zip
22c45060f350fcaa94e503f4a420cf8237c26c0fcdb4ada4aa98389b75c7b231 /de/oceanlabs/mcp/RetroGuard/3.6.6/RetroGuard-3.6.6.jar
d6f165bb39aaa20ee14fdcbbdb0b8fffae38067087f333ec6e0acd3f6666b2ad /de/oceanlabs/mcp/RetroGuard/3.6.6/RetroGuard-3.6.6.pom
* /de/oceanlabs/mcp/versions.json
50510e9c9874b539b98ef931fe7eeeb002f6b5b1976ea37669b9493426294561 /io/netty/netty-all/4.0.23.Final/netty-all-4.0.23.Final.jar
990a10af14db6b136d3a539eadca5dc7b4d0ceab9a1c90c5268b0ca8ae27b14b /io/netty/netty-all/4.0.23.Final/netty-all-4.0.23.Final.pom
f7f1bd6f1e1df0b300730f1551b7222f13871e40ba5a464978bd3eed94e2212d /io/netty/netty-parent/4.0.23.Final/netty-parent-4.0.23.Final.pom
b4533f3b4029e480288d85187fc9ee6789f3d362c6633d8e9b092ec455ad2f28 /it/unimi/dsi/fastutil/7.0.12_mojang/fastutil-7.0.12_mojang.jar
2b3db089f1f78a49a628d9015cca6a95e87421fa04262553cd2c4c79d66d04a7 /it/unimi/dsi/fastutil/7.0.12_mojang/fastutil-7.0.12_mojang.pom
09adf7955baa6bddf57a4bdbf9a91cf690261314969b59a18085ece1e05eccf9 /java3d/vecmath/1.5.2/vecmath-1.5.2.jar
a4aee4668f1b127c95c9afe1b922f4c5a0b1ad879ba811077cb7d0e048dce231 /java3d/vecmath/1.5.2/vecmath-1.5.2.pom
a6d2c9c0ddff7702662073b69c6dc4ec83011d22e4eb2dada28aa2d66ee47f97 /jline/jline/2.13/jline-2.13.jar
ba62d78eb858e241a604cdf739594cd312f0572756ea7aba4544c746d7152c43 /jline/jline/2.13/jline-2.13.pom
90a8e1603eeca48e7e879f3afbc9560715322985f39a274f6f6070b43f9d06fe /junit/junit/4.11/junit-4.11.jar
18ad8b0ae9e65a9195d04e25427dfe8b58175abcdae875a5a406aee38bddfb26 /junit/junit/4.11/junit-4.11.pom
dc67378cf428c06408e7959e83bdc1518dd22ccd313e7c28a986612d65c276c7 /log4j/log4j/1.2.12/log4j-1.2.12.jar
cb54dedc5d8c4510148dfa792701cbac1a84c383a84f48f5a32e6d7e460bbb72 /log4j/log4j/1.2.12/log4j-1.2.12.pom
0c3085cb93c3ef95d731c274b6f2dd195aa0405fe9328d69cab7f5e899d5e124 /lzma/lzma/0.0.1/lzma-0.0.1.jar
a096bc9f7579cec07483874151578720eeb3189c546c19cff56a6203df17b50e /lzma/lzma/0.0.1/lzma-0.0.1.pom
* /mc/game/version_manifest.json
f0d11987ea743f55a2c03bf77216e6dc9baea7201cc7bf498ceb18043e984634 /mc/game/1.11/client/780e46b3a96091a7f42c028c615af45974629072/client.jar
3277965fd83d26944dfbd1b9740d95cf206985da330a1b3733868e4de7dc6f83 /mc/game/1.11/server/48820c84cb1ed502cb5b2fe23b8153d5e4fa61c0/server.jar
80c42a047af4aa89a43fff83f56b3a657e3e969b8ce1f23413b814fb7e1e4605 /mc/game/7a3e41e164f3e3124c05a8bc782bba466d20c431/1.11.json
3bff6a1489b8e54cf130344bc5e8744db331045ad2fc736612576e1d80eb1f48 /net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar
cf4605822bd56d135dd7031603f122a11a0ec772373f466a4f2aac72dd9a1761 /net/java/dev/jna/jna/3.4.0/jna-3.4.0.pom
ea89d5090c8303ba4e9a0056e6d8a20429f3e021411e950bfd9eba3b6e6cf15c /net/java/dev/jna/platform/3.4.0/platform-3.4.0.jar
8f0c14f62912c089d81386015e78cf212f9e96f675b3bc0e519c1e2d92aa8950 /net/java/dev/jna/platform/3.4.0/platform-3.4.0.pom
79b5a4f5829e1a49a415711f7fb8eb5b9ad22defa72929fda2da96ec30d3f018 /net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar
3199d547c1275e806e0c7be19e90dcb00d9561ec3b31fb2e780e12d7d8785810 /net/java/jinput/jinput/2.0.5/jinput-2.0.5.pom
1ab4d194277816b6105253d224c8c69f1b6d720690efe7c85f3ce884f0ea273d /net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar
171024b00f9a743b92388b48733dc30fd3f6d3a7da4f66f9821531fbcf1aa074 /net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-osx.jar
24afbd5e1fab17da57d16a4d3f19d53f36155ef46a9976484201a4bb9722287f /net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar
ba27597365ae85a836c1f51819903668b4a1a7490e39e530633cc8a7b40b5500 /net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5.pom
c3334ff39cf0ab3b54925619101054c90098b7c733b1e7834c7b75e4c41e84a5 /net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar
af09ead4eb241473e7ec4d152a91a722ea09a717a202e20e4b385eac3217b7d6 /net/java/jutils/jutils/1.0.0/jutils-1.0.0.pom
b47c5d5810643426a3147ddb2195ef2ab67c80b167e7c2ac64a5d0dee8c030dd /net/md-5/SpecialSource/1.7.4/SpecialSource-1.7.4.jar
5f374f8ae7afff8dbc23aff14e59c5bd585c230afe9a8dcaa7b928e8cb16a27e /net/md-5/SpecialSource/1.7.4/SpecialSource-1.7.4.pom
* /net/minecraftforge/forge/json
c12e3e3e269007f40dab08d4632fa907a89c8cc2edcf0e0366cd230b99dfe1d4 /net/minecraftforge/forge/1.11-13.19.1.2188/forge-1.11-13.19.1.2188.pom
bca39299eb708ab47ec91b4adcfd1817da7ae7d049ced32469fd24d17bdd503f /net/minecraftforge/forge/1.11-13.19.1.2188/forge-1.11-13.19.1.2188-userdev.jar
e74b65b8948446982a506a96176dd8baf4688237ba4903f56ca6f667b6c7ee42 /net/minecraft/launchwrapper/1.11/launchwrapper-1.11.jar
616c4971035d1e6ab4809e16daabb02aa308c1dc001c06dd547c7d3b2e916999 /net/minecraft/launchwrapper/1.11/launchwrapper-1.11.pom
57f402b626d16cc2705bf2a37add7adbb074f0ca3b3102fa6e23aa303dae682f /net/minecraft/launchwrapper/1.12/launchwrapper-1.12.jar
5f1fced192c1dc9b68ef7dec12ba7a033129a71b290c283046a59aa2902e1fbc /net/minecraft/launchwrapper/1.12/launchwrapper-1.12.pom
64335a48be6b142a7d0c13ec5c82a707857aa58c0234e6eda3eaca0e96eea51b /net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar
60f08a3d6fc0e7948fd00fc95fad014fae5a5dc7eb991a631e0efee8bfad0b27 /net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.pom
3fcfbe3203c2ea521bf7640484fd35d6303186ea2e08e72f032d640ca067ffda /net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.jar
692744a19473011539ebc1370a264b8af1c056e0ae21f5372aa9dd7d4b4e5a2b /net/sf/jopt-simple/jopt-simple/4.6/jopt-simple-4.6.pom
9f0c8d50fa4b79b6ff1502dbec8502179d6b9497cacbe17a13074001aed537ec /net/sf/jopt-simple/jopt-simple/5.0.1/jopt-simple-5.0.1.jar
606e9b1d8e448a8f454b7eb585320b392e80f68880e92bef98cdf9dab8714340 /net/sf/jopt-simple/jopt-simple/5.0.1/jopt-simple-5.0.1.pom
dc0ba5bff6140dc92339973026a0ecbddc2a3b01bdd46ed9d16becc2f6d78de6 /net/sf/opencsv/opencsv/2.3/opencsv-2.3.jar
57f5607565d6a90dee6722801d4524813d9d2785046f2954a18861dfbf4a2149 /net/sf/opencsv/opencsv/2.3/opencsv-2.3.pom
294fb88c272598b9a5dcae15f13d228e64134256de941fbc28917a994beeb075 /net/sf/trove4j/trove4j/2.1.0/trove4j-2.1.0.jar
6d486c048a84c90ad9239b7b06a7d686d43eda28f827fac08d4f4ea942d21d0a /net/sf/trove4j/trove4j/2.1.0/trove4j-2.1.0.pom
3c8616203d61a12a7e3487e8b34f3c198c2b5ba9e90da0c7ea32d99cd4958012 /net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar
11327b94615d0bf16d4e17334902de783c2022f5e909d51fbce993a7a9d7e1d8 /net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.pom
3b93b62c0ea3ab9b5c1c1cdb1a3f25a7eb758f9974e8998f4e1815ba33cb7a1e /nl/javadude/gradle/plugins/license-gradle-plugin/0.11.0/license-gradle-plugin-0.11.0.jar
afded103d53d00171f486ab23c35151d8b82b32e51390c30ae734e83de863c52 /nl/javadude/gradle/plugins/license-gradle-plugin/0.11.0/license-gradle-plugin-0.11.0.pom
4ead9d3e3f305a4ed26fd732e6f0df0be2524e2daf2681df1b001fbb8efc9735 /oauth/signpost/oauth-signpost/1.2.1.2/oauth-signpost-1.2.1.2.pom
e26198c1bb8e3cde5f6e85305d0c4ef7730c53406c0d2a1f36ce30661df9fc22 /oauth/signpost/signpost-commonshttp4/1.2.1.2/signpost-commonshttp4-1.2.1.2.jar
5d3ef59d3820f64a6dd09b9ad7a083bbe24a9f97ce01ad412238877594e34e56 /oauth/signpost/signpost-commonshttp4/1.2.1.2/signpost-commonshttp4-1.2.1.2.pom
a1d69c5346ebf086b0f63c382b4500ceb29304d8fe95157b060aa4cd3861f230 /oauth/signpost/signpost-core/1.2.1.2/signpost-core-1.2.1.2.jar
f3c6788ccec4e1818b3f02d32fe8b5ab9caac52b0962e98466d980710c47298c /oauth/signpost/signpost-core/1.2.1.2/signpost-core-1.2.1.2.pom
649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8 /org/apache/ant/ant/1.9.4/ant-1.9.4.jar
5ce23a18f28d04be351f863020da0136214218aface05560516b97555a5077fd /org/apache/ant/ant/1.9.4/ant-1.9.4.pom
7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d /org/apache/ant/ant-launcher/1.9.4/ant-launcher-1.9.4.jar
c9193ed600adc6c7943a6c6dc6bd952edcb5f10fb2cda594b7199766fdeef698 /org/apache/ant/ant-launcher/1.9.4/ant-launcher-1.9.4.pom
a93aa9c66665872b0e51360c15ae282971e36a8aa987b40ef4d82d9a5aa151c4 /org/apache/ant/ant-parent/1.9.4/ant-parent-1.9.4.pom
802feece72852dafcbd0a425a60367c72c5cb9b6ea5aae59481128569189daf9 /org/apache/apache/10/apache-10.pom
ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d /org/apache/apache/13/apache-13.pom
36c2f2f979ac67b450c0cb480e4e9baf6b40f3a681f22ba9692287d1139ad494 /org/apache/apache/15/apache-15.pom
9e9323a26ba8eb2394efef0c96d31b70df570808630dc147cab1e73541cc5194 /org/apache/apache/4/apache-4.pom
4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd /org/apache/apache/9/apache-9.pom
93f8dfcd20831a28d092427723f696bceb70b28e7fb89d7914f14d5ea492ce5a /org/apache/commons/commons-collections4/4.0/commons-collections4-4.0.jar
f23d3625d35b016f3e8b77fb3ebf5e543807081fce2492f45a79d00160789a78 /org/apache/commons/commons-collections4/4.0/commons-collections4-4.0.pom
5fca136503f86ecc6cb61fbd17b137d59e56b45c7a5494e6b8fd3cabd4697fbd /org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar
10137adb14e8520b2abcddc308003e432eb836c4d1f9a00f68601d63583b9fb8 /org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.pom
cb49812dc1bfb0ea4f20f398bcae1a88c6406e213e67f7524fb10d4f8ad9347b /org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar
82827f6019c0f71bd74fba886ab337ff6da291f63df9723379a209d6ad3b44f8 /org/apache/commons/commons-exec/1.3/commons-exec-1.3.pom
6b81d10754dadf184d386011486e6509c2cc0c3d33565ced4fb4402b9413d47d /org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar
e1875bf575999ebc62dec34304a0d108c30a4ff8101e8ea5c9a9332715277940 /org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.pom
b9e0306f393460105b8a3fa5105250c5291b1efaa99954ace0ec1c783109a02a /org/apache/commons/commons-parent/11/commons-parent-11.pom
fb8c5e55e30a7addb4ff210858a0e8d2494ed6757bbe19012da99d51586c3cbb /org/apache/commons/commons-parent/22/commons-parent-22.pom
467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba /org/apache/commons/commons-parent/25/commons-parent-25.pom
14733a68e8b120b69de60cd96d222146dcf32f03c1c6cc6a750b1269bafe86c7 /org/apache/commons/commons-parent/28/commons-parent-28.pom
e4d258af8b2ff4032148d415379def7870789a6003e80576f1504b10f26b4be8 /org/apache/commons/commons-parent/32/commons-parent-32.pom
53d0011352e2e5106f379dafccdac7754ec6f0f78243c0305e4969f5acddf8fb /org/apache/commons/commons-parent/33/commons-parent-33.pom
7098a1ab8336ecd4c9dc21cbbcac869f82c66f64b8ac4f7988d41b4fcb44e49a /org/apache/commons/commons-parent/35/commons-parent-35.pom
8bd632c00bdf80a7de36c22b60f12452c147d8eca2f00d79d66699ebe7daa02a /org/apache/commons/commons-parent/5/commons-parent-5.pom
01e97067a1f9bd0e0a34f2f32bbf43fe6e9b11910f3b0dfe77fd7fb418619105 /org/apache/commons/commons-parent/7/commons-parent-7.pom
752596ebdc7c9ae5d9a655de3bb06d078734679a9de23321dbf284ee44563c03 /org/apache/httpcomponents/httpclient/4.0.1/httpclient-4.0.1.jar
51b8c025a4a1700d861d17bc2332f2b5045a81bad5d55291d9b652bb782151b2 /org/apache/httpcomponents/httpclient/4.0.1/httpclient-4.0.1.pom
9d0e815461efc8fc9aa5de4dda9ae29d076430b2e93e268a31d7a47cc00a31cf /org/apache/httpcomponents/httpclient/4.2.2/httpclient-4.2.2.jar
2ee7f81822a156a897b10a934b2158fa44d574dc20488f2fb9eb4d058673cbe7 /org/apache/httpcomponents/httpclient/4.2.2/httpclient-4.2.2.pom
9844cc9b5440d65a88d28bcba9d771374d2dfdab898848cda164611091633013 /org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar
03f7d67d6547083a38413c0da921d194a6010236f8980c7585c0c8f3019c0aa8 /org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.pom
1a5cfc674477ce7fd1150e8ea841f18301da1a4bfc729a029e072e81f3f36515 /org/apache/httpcomponents/httpcomponents-client/4.0.1/httpcomponents-client-4.0.1.pom
aecd5527c274ea6ed63da7f71b69c6a61a64784ff6c7266e0d94fcbf391027e2 /org/apache/httpcomponents/httpcomponents-client/4.2.2/httpcomponents-client-4.2.2.pom
15c27734dbcedc6af2cf18fa72a8c6e248477144a3d936a0fc228aaa74a02b00 /org/apache/httpcomponents/httpcomponents-client/4.3.3/httpcomponents-client-4.3.3.pom
70d3b2bb5d199da825681559ff68aa5bdee201206c50af177bf7ca4d94226752 /org/apache/httpcomponents/httpcomponents-core/4.0.1/httpcomponents-core-4.0.1.pom
ad4346d6375faa11a4d8cb45130acc86fb7ede86451194066da0559e41d5789e /org/apache/httpcomponents/httpcomponents-core/4.2.2/httpcomponents-core-4.2.2.pom
aa3ec31c7dd2161cfe3a3975645ea8703db0a6d6adb7d5b1766b32764c5c1806 /org/apache/httpcomponents/httpcomponents-core/4.3.2/httpcomponents-core-4.3.2.pom
3b6bf92affa85d4169a91547ce3c7093ed993b41ad2df80469fc768ad01e6b6b /org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
d1f666e38907c9471c64a3cdf87e0b1b0469d503e51cc14661860f7f6bd70c6e /org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.pom
c32bbf016f1eec0581febb177c761c2f657d9635d110affdd8c63382425e50f0 /org/apache/httpcomponents/httpcore/4.2.2/httpcore-4.2.2.jar
c1695c0b0c3d7be7f02f558b56763b0024ecaae6b9f981e2e145c05e9fea0972 /org/apache/httpcomponents/httpcore/4.2.2/httpcore-4.2.2.pom
abd02320e2356f89d054dae4cf02306bef20a9cf7865b3ac94ec7552b4f1528b /org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar
dfe5335f45b9466af820368b95c543d7542fcfcbe5f5d379e91cf0432e2df489 /org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.pom
61434dbb2314cbb8d28025feb6ae53bbc45d1042daa34371d8911e1e7f570b36 /org/apache/httpcomponents/httpmime/4.3.3/httpmime-4.3.3.jar
30e52abf8461a7ab254f20ec2c28e01865721ad9fbdb3baf14f32251623a1f87 /org/apache/httpcomponents/httpmime/4.3.3/httpmime-4.3.3.pom
a35e70c72865add3f9416194e02d6f9967dbf0c77d253933f80fbf46ad4d2169 /org/apache/httpcomponents/project/4.0/project-4.0.pom
b5d9225adb8683c1d7c5514544382add004547c93694abb5bd52b87346886f42 /org/apache/httpcomponents/project/6/project-6.pom
3d6eba428555a558de046b5d76eacc1f5a54b4f5f20b84d636ed7aff18aa48c3 /org/apache/httpcomponents/project/7/project-7.pom
9ab50a08565c7c01082266d2464b7656e2448e40788375ff5c034da17042cc24 /org/apache/logging/log4j/log4j/2.0-beta9/log4j-2.0-beta9.pom
eb0ca9bdd938f80711152a758d6bc331a8b0d769199d457294dc67ed03f73498 /org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar
4e10aac66cfabc8a16f0045bca650e082a190caca85d1c28376a71b9b918b40d /org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.pom
dcde6033b205433d6e9855c93740f798951fa3a3f252035a768d9f356fde806d /org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar
f360def8ad0c62f5420a9b2ef8d6a51f87703e05c1df08494578a1d4024b05ad /org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.pom
4d223e01a6569d6655c1f4fce84969d45142cdbabdb118ea08c5c8c33ec632f6 /org/apache/maven/maven/3.0.4/maven-3.0.4.pom
4c2f8341518aeb9d488844e334c02fa66dd4bb091bfdeb965c8a848ac6ea5aa2 /org/apache/maven/maven/3.0-alpha-2/maven-3.0-alpha-2.pom
33ff4aabbd0d02e4dd8279cda8f366c69915302bc4bb97bc01814a985f5c0643 /org/apache/maven/maven-aether-provider/3.0.4/maven-aether-provider-3.0.4.jar
a5082fe0a870bd361b3ecd6ab3e4641cfe775a8da19d80d8b2e277e7861f831b /org/apache/maven/maven-aether-provider/3.0.4/maven-aether-provider-3.0.4.pom
3c199a96af9550872724f41c053d7839dfcc6512e7704fa16c675363c4146796 /org/apache/maven/maven-artifact/3.0.4/maven-artifact-3.0.4.jar
e39722dcdf98a6a245db3e0f54d0d4a5555c8c9361e3efbfed3a7be1158b9c6c /org/apache/maven/maven-artifact/3.0.4/maven-artifact-3.0.4.pom
85500348730f338599e5f454be4a9909a6d01e86effc1ed0650a71e544bc67d5 /org/apache/maven/maven-compat/3.0-alpha-2/maven-compat-3.0-alpha-2.jar
4196effcccdbe4ef8dc625e5dd8e13284971dd884dc80109cb1f44d76dd0d7e7 /org/apache/maven/maven-compat/3.0-alpha-2/maven-compat-3.0-alpha-2.pom
3dd795c0ad9742a0be65a2a5ec22428d59dd2a891a7565ae94f64661e3740528 /org/apache/maven/maven-core/3.0.4/maven-core-3.0.4.jar
61d1fc83ce71c4af6a5061d0c4884b0cad5a9bd4ef12bce0a628ece6db13a9a7 /org/apache/maven/maven-core/3.0.4/maven-core-3.0.4.pom
26b6825ea73ac4d7b1a6f5e62ac1c11b0fc272504da6dde9ba8f894cd847e1c1 /org/apache/maven/maven-model/3.0.4/maven-model-3.0.4.jar
264be3f212d59f9103d3b997c9d0197ff89489d06b7d195d80ee56356b6c662e /org/apache/maven/maven-model/3.0.4/maven-model-3.0.4.pom
b4f1d3ae53c290e1ae45694c5ce2d17bf8d577ff5ece0f9aa0cffe151a6ef4e7 /org/apache/maven/maven-model-builder/3.0.4/maven-model-builder-3.0.4.jar
ac605e66a84dd9ee63610d650b007e3c8fbb7feef73e94bdd899e60dd475a20f /org/apache/maven/maven-model-builder/3.0.4/maven-model-builder-3.0.4.pom
81fe14cb9779d36e0c610e1049e5b32a6b9974957f257921acf628b31c5486c8 /org/apache/maven/maven-parent/10/maven-parent-10.pom
fc45af8911ea307d1b57564eef1f78b69801e9c11a5619e7eb58d5d00ae9db8e /org/apache/maven/maven-parent/21/maven-parent-21.pom
3cb6712f827c80dc6b0b0b967776dba451c023a92b7741bba45d23ab7a83281a /org/apache/maven/maven-parent/8/maven-parent-8.pom
4e5ee7f7ab7e43f691788489e59f2da4a322e3e35f2a2d8b714ad929f624eead /org/apache/maven/maven-plugin-api/3.0.4/maven-plugin-api-3.0.4.jar
bd928e987661ac90495ca7cdcd5d2fd20cbed97fb9565e30d8425aadae26ee90 /org/apache/maven/maven-plugin-api/3.0.4/maven-plugin-api-3.0.4.pom
0b76d82011452170dddd21fb33da6bfc414ff6629fce6219fbf1d78ce1518e90 /org/apache/maven/maven-project/3.0-alpha-2/maven-project-3.0-alpha-2.jar
24477230086e456dff22c24dec30aab0a8ae321a2ce5645a85a8516f7dd829e3 /org/apache/maven/maven-project/3.0-alpha-2/maven-project-3.0-alpha-2.pom
f3905cb8c223c33f6121bc937b66a2f58653be766042fb6e924b9882c555d891 /org/apache/maven/maven-project-builder/3.0-alpha-2/maven-project-builder-3.0-alpha-2.jar
392f9bcc7eb6d9ab85b693cda0c3ba698fc770d32843491c8815b87f40fe02a8 /org/apache/maven/maven-project-builder/3.0-alpha-2/maven-project-builder-3.0-alpha-2.pom
a25c4db27cffda9e9229db168b1190d6a3e5439f3f67d6afec3df9470e0752d5 /org/apache/maven/maven-repository-metadata/3.0.4/maven-repository-metadata-3.0.4.jar
5fe2b1d87fd326c1a22aac3869da7935ad31760d978fdff9a073c3fbfd54e18d /org/apache/maven/maven-repository-metadata/3.0.4/maven-repository-metadata-3.0.4.pom
3e3df17f5df5e4ce1e7b7f2011c57d61d328e65678542ade2048f0d0fa295f09 /org/apache/maven/maven-settings/3.0.4/maven-settings-3.0.4.jar
beedffd7c7e49ad35ef945c3413f1819f04e43ea294a31804714c8cbb0f372b3 /org/apache/maven/maven-settings/3.0.4/maven-settings-3.0.4.pom
a38a54ec1e69a30ddfc14434e0aec2764fc268668abcc0e132d86692a5dce3e4 /org/apache/maven/maven-settings-builder/3.0.4/maven-settings-builder-3.0.4.jar
3e0b3f60267b6070a741b15db5b40fbd824c61db12a1f4f166ed658b9f62ece0 /org/apache/maven/maven-settings-builder/3.0.4/maven-settings-builder-3.0.4.pom
6c35daab503ff462f4f63317ae723bd37cae37460ea3576374a347583e7c4327 /org/apache/maven/wagon/wagon/1.0-beta-4/wagon-1.0-beta-4.pom
6a82569576cda4cae793800ed2985202de8a59e414d2140e217cf077709e7bbb /org/apache/maven/wagon/wagon-provider-api/1.0-beta-4/wagon-provider-api-1.0-beta-4.jar
1739331652c6e93dd3305a9c5b33f493c85782171e9e8a3e0c750b030dabadd1 /org/apache/maven/wagon/wagon-provider-api/1.0-beta-4/wagon-provider-api-1.0-beta-4.pom
56ab9c6c2d022a9b7079006ba500a996cd2c21411d53cac524933af20c5a4b99 /org/apache/xbean/xbean/3.4/xbean-3.4.pom
17e0efa187127034623197fb88c50c30d3baa62baa0f07d6ec693047ac92ec3b /org/apache/xbean/xbean-reflect/3.4/xbean-reflect-3.4.jar
01c97d4286dd3b5e5441faac3abb589f1fe123cea138bb4ae0995ffae14938df /org/apache/xbean/xbean-reflect/3.4/xbean-reflect-3.4.pom
c7964f00c3d3889c5223e8fcb7476610c59453c86bccc68ef493a56d171bf655 /org/aspectj/aspectjrt/1.8.2/aspectjrt-1.8.2.jar
ba5261a1f07260c3d8016623fdd27d662b9934266a75d4f57f165bfbaf9af1a8 /org/aspectj/aspectjrt/1.8.2/aspectjrt-1.8.2.pom
f07694998acb204782c72cc8067b237a04097a2170f07d440614883f14a67630 /org/codehaus/groovy/groovy-backports-compat23/2.4.4/groovy-backports-compat23-2.4.4.jar
2f93f476d35dd52828e13f32a4be68ab80a3b999713079feb98c67ae9e8d858f /org/codehaus/groovy/groovy-backports-compat23/2.4.4/groovy-backports-compat23-2.4.4.pom
e246e2a062b5d989fdefc521c9c56431ba5554ff8d2344edee9218a34a546a33 /org/codehaus/plexus/plexus/2.0.2/plexus-2.0.2.pom
2b59062030ab0a15c5d0977ba22421706368926488739a65f25793e715cc8a74 /org/codehaus/plexus/plexus/2.0.7/plexus-2.0.7.pom
259d528a29722cab6349d7e7d432e3fd4877c087ffcb04985a6612e97023bba8 /org/codehaus/plexus/plexus-classworlds/2.4/plexus-classworlds-2.4.jar
c0439c2b2d850488686143e2529f521b38f2abded6ac212add8f0c637eb912e9 /org/codehaus/plexus/plexus-classworlds/2.4/plexus-classworlds-2.4.pom
4df7a6a7be64b35bbccf60b5c115697f9ea3421d22674ae67135dde375fcca1f /org/codehaus/plexus/plexus-component-annotations/1.5.5/plexus-component-annotations-1.5.5.jar
815f3ec316b8c5fa701385fdf4009bfb51e07d780e8f6a6e2afe720c52d7e292 /org/codehaus/plexus/plexus-component-annotations/1.5.5/plexus-component-annotations-1.5.5.pom
ef5dbc7fa918b6dbba71d27e5b3d7a00df624bcfa2549a7297f36fe275f634d7 /org/codehaus/plexus/plexus-components/1.1.18/plexus-components-1.1.18.pom
00aa0be06a029e4b45032f682089d5052b014c028f9187f83c70adc073672c46 /org/codehaus/plexus/plexus-container-default/1.0-beta-3.0.5/plexus-container-default-1.0-beta-3.0.5.jar
3d90bbd9f534020621c77453dcffdad4e761e42911c2be9adaeec724f9972a9c /org/codehaus/plexus/plexus-container-default/1.0-beta-3.0.5/plexus-container-default-1.0-beta-3.0.5.pom
f53a82db260a2910a9823d6e72a927891daae33d8eb6884ab838a2a2768c6b86 /org/codehaus/plexus/plexus-containers/1.0-beta-3.0.5/plexus-containers-1.0-beta-3.0.5.pom
1bc264824ec876b0ca6f4f5838175c541c638cbc43326a268b9aee7d4778b5ef /org/codehaus/plexus/plexus-containers/1.5.5/plexus-containers-1.5.5.pom
7fc63378d3e84663619b9bedace9f9fe78b276c2be3c62ca2245449294c84176 /org/codehaus/plexus/plexus-interpolation/1.14/plexus-interpolation-1.14.jar
d08155c497df37b2c3d9b5b0dfdb02ec0525b2070b5be3739fffde942fcac9af /org/codehaus/plexus/plexus-interpolation/1.14/plexus-interpolation-1.14.pom
8b909f4ca9788647942f883d4e559bcc642123f7c6bcd3846983a2e465469c33 /org/codehaus/plexus/plexus-utils/2.0.6/plexus-utils-2.0.6.jar
fddad4fa62c82310aec43525e519cd59f27d04c7569fe21b1b03ca210887810c /org/codehaus/plexus/plexus-utils/2.0.6/plexus-utils-2.0.6.pom
35608df55aa672a195d6b01573a5630a315998b3bbd06310b20eb169113923aa /org/codehaus/plexus/plexus-utils/2.1/plexus-utils-2.1.jar
9f4ac6987113d09099bf43b846d2ec1d5e7a8091a6185f1f16d68e845f681243 /org/codehaus/plexus/plexus-utils/2.1/plexus-utils-2.1.pom
03cbe8dcaa909a6f72219abec105675c6df08898971c326cf7e64373bff5e769 /org/codehaus/woodstox/wstx-asl/3.2.6/wstx-asl-3.2.6.jar
784db534cc3c5051f88198e8251da9c8b13625e0eb365a347e1085387d8203b1 /org/codehaus/woodstox/wstx-asl/3.2.6/wstx-asl-3.2.6.pom
e4144cbc26da195c6b22a53691fd079f70b74aa5f55bd6089cd77ec99a0ee8fe /org/eclipse/core/contenttype/3.4.200-v20130326-1255/contenttype-3.4.200-v20130326-1255.pom
4dd6ec1376693bd8ac4e2ceacc7be70880920978f3fef31db4968e6ade001c87 /org/eclipse/core/contenttype/3.4.200-v20140207-1251/contenttype-3.4.200-v20140207-1251.jar
f82370a400c38f78f479df4e79c6e1563e4ec050049279601ca01d85186456a7 /org/eclipse/core/contenttype/3.4.200-v20140207-1251/contenttype-3.4.200-v20140207-1251.pom
52d8987073cf765e620afc7f44e3934a8e854d56c8feca25f6ffb9163871c53f /org/eclipse/core/contenttype/maven-metadata.xml
4a73a4a0ebf5ca5f7e9d5e8978b24cd72ebacd5b561de961517f4c976aa7e30f /org/eclipse/core/expressions/3.3.0-v20070606-0010/expressions-3.3.0-v20070606-0010.jar
fa0d8eb0460cf3d5a7201e9af86431f66473726b9883e461b579056d0f3725e8 /org/eclipse/core/expressions/3.3.0-v20070606-0010/expressions-3.3.0-v20070606-0010.pom
582a5012b8525775059ee59d931179f79bff4bebf41bdab4060341b25742c77a /org/eclipse/core/expressions/maven-metadata.xml
b418d15acf94545248f4bd55b4a9b62fc49246488758729d6b3ff52ae149df24 /org/eclipse/core/filesystem/1.1.0-v20070606/filesystem-1.1.0-v20070606.jar
08f7bd3493e934a6cfe6b30941661bfb7c61ac72181b9d72f6745c03f20cae0a /org/eclipse/core/filesystem/1.1.0-v20070606/filesystem-1.1.0-v20070606.pom
0fb7079593f1e2544828c9a56db2710ea223655eee911ae5fb69e2f6d49b36eb /org/eclipse/core/filesystem/maven-metadata.xml
b52babdb3c1e073175ac0be84cbc41764b0cd5e89ca0dd2ebe29cc3f8d40aa86 /org/eclipse/core/jobs/3.5.300-v20130429-1813/jobs-3.5.300-v20130429-1813.pom
ef971ecb154fba0cc06d913448640fb2e5ab3f9079c1c7854385d1c30d81a94f /org/eclipse/core/jobs/3.6.0-v20140424-0053/jobs-3.6.0-v20140424-0053.jar
851e8123acc70a823fe38f1ad5f95f953c815f8da2cceaa483dfa5604d3ecc38 /org/eclipse/core/jobs/3.6.0-v20140424-0053/jobs-3.6.0-v20140424-0053.pom
753ba9e22869180b1e959860d76a5a2bf9e1a2aa398375a138daa518313efce3 /org/eclipse/core/jobs/maven-metadata.xml
e46a6444a6d7c0fe70f196ce42d9700c4514b68bf55bae296b2e3c287883ffdc /org/eclipse/core/org.eclipse.core.commands/3.6.0/org.eclipse.core.commands-3.6.0.jar
49eccab170e7e1c6aa598f49019fc8310a3da4c87a3e2b9e463825f6e2ba086f /org/eclipse/core/org.eclipse.core.commands/3.6.0/org.eclipse.core.commands-3.6.0.pom
73f9a1a2403f7f9c44d11431c40be4641295f3620570bfef2168a66c5de68fee /org/eclipse/core/resources/3.2.1-R32x_v20060914/resources-3.2.1-R32x_v20060914.jar
592accd91b5c786a4fe082176cabe07034f7603981e4d723ebe39b6d7f620672 /org/eclipse/core/resources/3.2.1-R32x_v20060914/resources-3.2.1-R32x_v20060914.pom
363ad8af4d8fc7f208b6fa640e490c7ba84b2aa78c26809e569bb1b0737ce9cb /org/eclipse/core/runtime/3.10.0-v20140318-2214/runtime-3.10.0-v20140318-2214.jar
ef7f45930ccd7b088b0cab1c932a145c494a2672f48e4244e20a1be06d2d30f3 /org/eclipse/core/runtime/3.10.0-v20140318-2214/runtime-3.10.0-v20140318-2214.pom
9fa94682175edfa5ec863f636087d2875aab106b09507199d914988b60edd522 /org/eclipse/core/runtime/3.9.0-v20130326-1255/runtime-3.9.0-v20130326-1255.pom
ddf19054374a2617ba9c10d7a5ec8eeaeb8f62c2c6e430144e81da15718bb585 /org/eclipse/core/runtime/compatibility/3.1.200-v20070502/compatibility-3.1.200-v20070502.jar
6b3a348064b85a050a1b8f7bd96edd081e8152f7269141308c5f5f4fcc444362 /org/eclipse/core/runtime/compatibility/3.1.200-v20070502/compatibility-3.1.200-v20070502.pom
7d95f541e873e42a0c068dc0f38e819a32f0f386c5ea1ae745ef649a40acb628 /org/eclipse/core/runtime/compatibility/maven-metadata.xml
6bddb60e50592d8f7c9b616624b9b4413accfaf8480d320f7cab8638a46a0515 /org/eclipse/core/runtime/maven-metadata.xml
7b2ad6c43d922f3ba0d18d99879d1d56d6a994ba7b639d5d6276f1a167b6a7ac /org/eclipse/equinox/app/1.3.200-v20130910-1609/app-1.3.200-v20130910-1609.jar
17dbfaba6a138e6fc0eb361069470f00aaf70a94e2d3384f398dee4843eb8fe7 /org/eclipse/equinox/app/1.3.200-v20130910-1609/app-1.3.200-v20130910-1609.pom
83a2cde9ed188efcabebbd2db14128c531c5ba73f8abc599dcae83459a779109 /org/eclipse/equinox/app/maven-metadata.xml
6bc086aab7686a5a528d8c4ab2253d6cec7ead04b052576951e90cc561782257 /org/eclipse/equinox/common/3.6.200-v20130402-1505/common-3.6.200-v20130402-1505.jar
9234dbfd064411a849444abfeb8a10978672690d125beb4194f9e5b0f0a7ee5e /org/eclipse/equinox/common/3.6.200-v20130402-1505/common-3.6.200-v20130402-1505.pom
9274fc22b74d6dc42608049ea51aa046b8fc8fc60b2a7d6ff6d884d76e6ef3f6 /org/eclipse/equinox/common/maven-metadata.xml
32b046de57df2f4887fc5a2c343740d9d12c7fe17541e2cede73cfa4ccbc2436 /org/eclipse/equinox/org.eclipse.equinox.common/3.6.0/org.eclipse.equinox.common-3.6.0.jar
84f171f4c3ded1b29880003b3c42e8e5be780a11f19d6b7d1b6d0125b4a198d8 /org/eclipse/equinox/org.eclipse.equinox.common/3.6.0/org.eclipse.equinox.common-3.6.0.pom
dbaa0e5c2a44c3b314086fba9b6d91fd4a374032ccffc82373d3614bd9d385ea /org/eclipse/equinox/preferences/3.5.100-v20130422-1538/preferences-3.5.100-v20130422-1538.pom
6498d32ab6503b49a44e0a0bfe1c2ac28ffb7e8f88acbdb4dda89d73092d8ca7 /org/eclipse/equinox/preferences/3.5.200-v20140224-1527/preferences-3.5.200-v20140224-1527.jar
d68a303f399eeef919b681c43885481c46bf3cfe39f4ede369f7433087bbe14c /org/eclipse/equinox/preferences/3.5.200-v20140224-1527/preferences-3.5.200-v20140224-1527.pom
70a4c81e2def4d69b44dbc680dc0dce29f274f1dff22b98d1f1f34a0fb28514d /org/eclipse/equinox/preferences/maven-metadata.xml
a6833a81795978d4ad8d2e54597171e2a3447fd6983b8e902710aa1dc946fa24 /org/eclipse/equinox/registry/3.5.400-v20140428-1507/registry-3.5.400-v20140428-1507.jar
cb7c954965e6b2946c2f7be78c1e089b530e0444b1fefc2d8079a5681362bfa1 /org/eclipse/equinox/registry/3.5.400-v20140428-1507/registry-3.5.400-v20140428-1507.pom
d7cd093fdad45c7cc979f44f7166f259607b41cf44a8afe77561594cef4c39d3 /org/eclipse/equinox/registry/maven-metadata.xml
9cddda75f4a1b4469e73f44e7b61a3e897d0f657df4797f9106ffe88c4eeade0 /org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.jar
536c45e8804de01321c478cfb994377f81f1e32897636616fa21b877fd137c6f /org/eclipse/jdt/core/compiler/ecj/4.6.1/ecj-4.6.1.pom
2082ffb0bb8f276ca164a6363e394f902163a81b7df44ede13aed33d84fdf27e /org/eclipse/jdt/org.eclipse.jdt.core/3.12.0.v20160315-2126/org.eclipse.jdt.core-3.12.0.v20160315-2126.jar
ec467beffac7ffa86b5687a0935b8d3540e8795c9bc0c0d326a1c24cb9be7fe8 /org/eclipse/jdt/org.eclipse.jdt.core/3.12.0.v20160315-2126/org.eclipse.jdt.core-3.12.0.v20160315-2126.pom
d6aba7a1569952e082630de6907f460f476c20d97032cb9f7e4f3e14ddb928e7 /org/eclipse/jetty/jetty-parent/14/jetty-parent-14.pom
fa1d59411d4d2667d8f15638af7c0ac44539234c0982c27a2b65ba06c32a0b3e /org/eclipse/osgi/3.10.0-v20140606-1445/osgi-3.10.0-v20140606-1445.jar
1e10819cdb1fe55d44ac94d37f3b1030275199979a73d04b7b53e2d6000d5d2e /org/eclipse/osgi/3.10.0-v20140606-1445/osgi-3.10.0-v20140606-1445.pom
bddf4d130cb65fdfc1df7df1febde313fc2ff1ac83c8574ff97befd6c515cc30 /org/eclipse/osgi/3.9.1-v20130814-1242/osgi-3.9.1-v20130814-1242.pom
9fbddba8d8cd6322229030a26356ba447421562edebba078267490104ff61d83 /org/eclipse/osgi/maven-metadata.xml
1bacf311ac3d39cc53b03f8de7a4ccffc89c208938f0004a90c652383e927f18 /org/eclipse/text/org.eclipse.text/3.5.101/org.eclipse.text-3.5.101.jar
86545f7161948937a1e632b6bd493008c67c855966acfb7ddd4e710cd7a121ab /org/eclipse/text/org.eclipse.text/3.5.101/org.eclipse.text-3.5.101.pom
88b506fa09a810b19517a2d45cb8f5eaa76c22b18abfbdcf36cd07aebfd56cb0 /org/eclipse/update/configurator/3.2.100-v20070615/configurator-3.2.100-v20070615.jar
4645380254baefd0056e15cc9af6a273fb7d014b8be4ff395a5a61bfe8f4a89c /org/eclipse/update/configurator/3.2.100-v20070615/configurator-3.2.100-v20070615.pom
3c731988480eae3024b27d648aa0408a1cdc065fc523cf41a049fb97148fd30a /org/eclipse/update/configurator/maven-metadata.xml
b1f003f28c3ce1753ea0da22a6f0289197a2c369e7056b32e170af7904eff2c1 /org/fusesource/fusesource-pom/1.8/fusesource-pom-1.8.pom
9e82163ed2fc6257fe627132ce554726e796edee4e5efe9d9e523aee217d60b8 /org/fusesource/jansi/jansi/1.11/jansi-1.11.jar
b0975adc7450698033f3de4792dd6eba72a980c2b56d8e8d36d381385b37a5c9 /org/fusesource/jansi/jansi/1.11/jansi-1.11.pom
8ba9c49b55f979cf4e04d4871092eb50e834b388fca03a2274ccadff12cc9ce8 /org/fusesource/jansi/jansi-project/1.11/jansi-project-1.11.pom
66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9 /org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
fde386a7905173a1b103de6ab820727584b50d0e32282e2797787c20a64ffa93 /org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom
6d535f94efb663bdb682c9f27a50335394688009642ba7a9677504bc1be4129b /org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom
32ed093f39c46a8d99f801240069478eac93b35f07351c001f2cef4330e97b4a /org/jdom/jdom2/2.0.5/jdom2-2.0.5.jar
ebac276b5ad62e9d312fb6ce663d55fdebaba9badc918166e7d60b1ffd1bd475 /org/jdom/jdom2/2.0.5/jdom2-2.0.5.pom
212f6eaa0491dd7359dc33c3a72e82a23b096e1890d984b4d92395abc9a6bf7f /org/jvnet/localizer/localizer/1.12/localizer-1.12.jar
313b5700337e773a68eeab64ec6952c61b5e7a51839d46bcf77376887fe92f02 /org/jvnet/localizer/localizer/1.12/localizer-1.12.pom
e21488c2fe8db4b23a00c3cfdeab3b600e84c1647e08fb7bee442f5fc1f83990 /org/jvnet/localizer/localizer-parent/1.12/localizer-parent-1.12.pom
c118f8d84313980f79e1e7f7ae4b14b10c2f20c77ea4a1c29f6f0b02bc139077 /org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar
1adb09c3cf35e0f55d5ecd91e4364100364d8a8031cdfa64ae61eaa64f0d79d4 /org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.pom
833e721817f70d1445eec13d8ce5a86e12af70efac5014356302e2bbc68b3fe2 /org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar
65fb24fa8ee4a7efc554b15cfb447753c39e414ff00e9944d347e6f1176f0438 /org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.pom
a50aaa5a89304c23a9257295cbe803e6130526a4dfaea1784076adbacacfd68e /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar
e14afffd87719ba12034dd989d40a75540902a6286629fab1330b51c255ab792 /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-osx.jar
ade8deedceb0b60c630f3e78a7b052b7f8f02ff53d91849d1985d3146bf95590 /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-windows.jar
82eb11d59b06700b9ff3db4e0476de1cf86501ba7cd00bb279f40a7c23ad662b /org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1.pom
d312147c3999b868fd649887f45203a4195bc10fc563cee4c4f8d22761421f94 /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar
8831b2bd5a53dc343fd6fbed3c18f28ab33d3f28dbe62ebd4a3af81f25c0a5ab /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar
f2e1f2c6bd7511a7504f389b8b716f5d8dc2fdc71e29c89b52644314cf0a228e /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar
11eeed66c2d56892f3e2046121438153e516dd95d368bcf93c0714f9f2bfdd6f /org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209.pom
034456b132a336b72757325bb7aaf99e075681ee5650d2bea21717bd485de42f /org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar
cb7239de51893ee5abe90c2bc550422cb336140c0866e9d1c899399eeb8a3ba2 /org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.pom
9cf1643b0d805db942498cebf941d1c43df0a1322137291c258aec6109200858 /org/lwjgl/lwjgl/parent/2.9.1/parent-2.9.1.pom
9b3282d2065e070f5966c8b324bc8ffaa4a3d53c7d39ef7e0a3458b525bc167e /org/lwjgl/lwjgl/parent/2.9.4-nightly-20150209/parent-2.9.4-nightly-20150209.pom
21091d3a9c1349f640fdc421504a604c040ed89087ecc12afbe32353326ed4e5 /org/mortbay/jetty/jetty/6.1.26/jetty-6.1.26.jar
8169c421acc4931f9eb80b818b13a4553a8582e02d08dfc12a51e4f23b2726c6 /org/mortbay/jetty/jetty/6.1.26/jetty-6.1.26.pom
b24e31635c0e6c401ff84e28905b96d1a760144c15f1deae1a22d5b3356e1667 /org/mortbay/jetty/jetty-parent/10/jetty-parent-10.pom
0173d8dbfed2b8ab2a5b36b608a9c509ea0a3fbb4faca67ce7067680c895066a /org/mortbay/jetty/jetty-parent/7/jetty-parent-7.pom
9b974ce2b99f48254b76126337dc45b21226f383aaed616f59780adaf167c047 /org/mortbay/jetty/jetty-util/6.1.26/jetty-util-6.1.26.jar
1e3c13f07407a4b331e229da6bb782ae734f88b6a26a3fbeb165acabc5f6ef24 /org/mortbay/jetty/jetty-util/6.1.26/jetty-util-6.1.26.pom
a3d6e7608155600a73c763ccac74e6b321f8c23dc4747f90635fc2f7cfc1548a /org/mortbay/jetty/project/6.1.26/project-6.1.26.pom
068756096996fe00f604ac3b6672d6f663dc777ea4a83056e240d0456e77e472 /org/mortbay/jetty/servlet-api/2.5-20081211/servlet-api-2.5-20081211.jar
2d705bf03b0b653b0ba3a260b8fe94833e1266bb1e7eb9efc67821555141c9ee /org/mortbay/jetty/servlet-api/2.5-20081211/servlet-api-2.5-20081211.pom
71c4f78e437b8fdcd9cc0dfd2abea8c089eb677005a6a5cff320206cc52b46cc /org/ow2/asm/asm/5.0.3/asm-5.0.3.jar
7d34653ffe62be7714d2f1969660a17df9ec1b19d8250c4f03db1123c82ba6a0 /org/ow2/asm/asm/5.0.3/asm-5.0.3.pom
18c1e092230233c9d29e46f21943d769bdb48130cc279e4b0e663f423948c2da /org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar
e87ea4823ecf2dd856901da359270be904236be59c27e2781eb8d78c97e45b2a /org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.pom
2969356ac1e40fe4141948c563690238f5d79d76aec7fd873536867a331ede81 /org/ow2/asm/asm-debug-all/5.0.3/asm-debug-all-5.0.3.jar
9c99d7a555725bc2f8379977935cdba16d687d9c93b6e0725e196180d490c995 /org/ow2/asm/asm-debug-all/5.0.3/asm-debug-all-5.0.3.pom
2341a72bba5e38c1028a332c11607e1706c13fa600fee6fb546b9a1708418097 /org/ow2/asm/asm-debug-all/5.0.4/asm-debug-all-5.0.4.jar
62efbf37e5068a8708541ae0a4da3d1140f4d711d30e4366445cb96ce13cc79e /org/ow2/asm/asm-debug-all/5.0.4/asm-debug-all-5.0.4.pom
f7ac3f642c36c406543bb56ae3db3a53f263f71bd857b04709986e2d5798c8c4 /org/ow2/asm/asm-debug-all/5.1/asm-debug-all-5.1.jar
0a46e33f6b80bd21ac41eec33fca2e43d79253fb46a32d64ba3867ee22451fff /org/ow2/asm/asm-debug-all/5.1/asm-debug-all-5.1.pom
254b82bec9da4f8efbc8b1f93ab2b87f7465227a82b36cf3d05d9e77a0e8dd2e /org/ow2/asm/asm-debug-all/5.2/asm-debug-all-5.2.jar
491f13bd60757a7cfe76e767766b061d557010394f52cec2fb067707de702caa /org/ow2/asm/asm-debug-all/5.2/asm-debug-all-5.2.pom
b4845405fee9fe4f5f665dfe19badcf32581e3eea51b99a45e9f76a0a830c09d /org/ow2/asm/asm-debug-all/5.2/asm-debug-all-5.2-sources.jar
c2edabf4128a534df4b8b4b0b9b562e94f242ba95ac24dc61485432b8a188e32 /org/ow2/asm/asm-parent/5.0.3/asm-parent-5.0.3.pom
fdf05b9df226573b331a7e5df01135e527dcc07c71626445732bd04379aa4a72 /org/ow2/asm/asm-parent/5.0.4/asm-parent-5.0.4.pom
85ec8258fafc283f61647e6a11b404890821c11db6fcf550779ecf7a14151007 /org/ow2/asm/asm-parent/5.1/asm-parent-5.1.pom
cbfacd5dd812db16dc910994007fe58d9402a25507f81a1c2218e15c2c1bedfa /org/ow2/asm/asm-parent/5.2/asm-parent-5.2.pom
347a7a9400f9964e87c91d3980e48eebdc8d024bc3b36f7f22189c662853a51c /org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar
65819ca7c5a218ff49f8ebe72f3b39219c81f137d017acc1aec15b1054cf5236 /org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.pom
51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb /org/ow2/ow2/1.3/ow2-1.3.pom
fcb8d5745f776567f1cce332282750b1653568324621ecef03288c8a25919d0e /org/projectlombok/lombok/1.16.4/lombok-1.16.4.pom
e0a471be03e1e6b02bf019480cec7a3ac9801702bf7bf62f15d077ad4df8dd5d /org/projectlombok/lombok/1.16.6/lombok-1.16.6.jar
32ac0a2363ccc0c5086b62cfc05e28a355b74e155efef6b426f5498a0dfc9e4c /org/projectlombok/lombok/1.16.6/lombok-1.16.6.pom
19495ce701fd9ba3c499c137e3ad5364acee8f87a01ef99e912f995a23fd4cb1 /org/scala-lang/modules/scala-parser-combinators_2.11/1.0.1/scala-parser-combinators_2.11-1.0.1.jar
4da632931d9182b1033ddc01a240a18ce9d5704534f52faa515d43119fa6d49f /org/scala-lang/modules/scala-parser-combinators_2.11/1.0.1/scala-parser-combinators_2.11-1.0.1.pom
4a7c757d4d87dd37382bd777ad611b5875748aef148277cf25bb39eebb496d07 /org/scala-lang/modules/scala-swing_2.11/1.0.1/scala-swing_2.11-1.0.1.jar
5201b071fbf92d388940ec1d12cba89baec25dc7b402b1e26110e1f4261b0f2b /org/scala-lang/modules/scala-swing_2.11/1.0.1/scala-swing_2.11-1.0.1.pom
13c0d8d442bde14b73af3ed60e8d53452f9e1ad62ffbe3d944cb918df652db6f /org/scala-lang/modules/scala-xml_2.11/1.0.2/scala-xml_2.11-1.0.2.jar
44b8a07ac6ae1cbc11bba1c03eb90bcf4a707c562eb51e9d56028914a99ab112 /org/scala-lang/modules/scala-xml_2.11/1.0.2/scala-xml_2.11-1.0.2.pom
8dd0a4941f4564117cc991734ca36aa53dff6bb0be329f39eab46d8819f60d1a /org/scala-lang/plugins/scala-continuations-library_2.11/1.0.2/scala-continuations-library_2.11-1.0.2.jar
e8e084c66182fbb88dae252a0c3dba24f8735609d8264feaed1be69915724e85 /org/scala-lang/plugins/scala-continuations-library_2.11/1.0.2/scala-continuations-library_2.11-1.0.2.pom
79329971a31ede7b6823f21a6ab765506b4093d9276debdc9dbe17b996884f2b /org/scala-lang/plugins/scala-continuations-plugin_2.11.1/1.0.2/scala-continuations-plugin_2.11.1-1.0.2.jar
d6b98448db39957d4a5ab49d1d9355889c1b7ef1e4e371e77889da1f66f59c60 /org/scala-lang/plugins/scala-continuations-plugin_2.11.1/1.0.2/scala-continuations-plugin_2.11.1-1.0.2.pom
fa33c031c291ef618e33398aa193ddf4d4c6859d805c9fb3cd4b7c4fbc9acbc6 /org/scala-lang/scala-actors/2.11.0/scala-actors-2.11.0.jar
42665fa39eeb8960adb74dd51fdb239c34e45eacd4b74dc88074d518b7ecfc26 /org/scala-lang/scala-actors/2.11.0/scala-actors-2.11.0.pom
b89d0beb76df20c7b2c2bee59ba53b802cc48566bc3e89ac96ce6361c5c2ee38 /org/scala-lang/scala-actors-migration_2.11/1.1.0/scala-actors-migration_2.11-1.1.0.jar
cd1a673205be12880e73c9c11234d809a901c024a256f4f4c7ae59b0a7aecc75 /org/scala-lang/scala-actors-migration_2.11/1.1.0/scala-actors-migration_2.11-1.1.0.pom
3aa616f5c56d2052fc5e3231f3e8cf1736f876caff0142a66096fc5b4dc87ae5 /org/scala-lang/scala-compiler/2.11.1/scala-compiler-2.11.1.jar
abe89207b0bfcbcf164c820cbba2c962ab5e9f3a0d0f37d81bde4f6c293a874b /org/scala-lang/scala-compiler/2.11.1/scala-compiler-2.11.1.pom
088bcb80f71b6e6a2a31d2fe7288c1fd64f19663ce281b924cdfab3fb105f4f3 /org/scala-lang/scala-library/2.11.1/scala-library-2.11.1.jar
3268a48dc36c664e7f4bd5d88b366bf098a13f7b6e8b87611e3a4413b72860d4 /org/scala-lang/scala-library/2.11.1/scala-library-2.11.1.pom
41938d1e89670979dd783102777a8b879999f4fb00a5b811b51c105b02a9d4f8 /org/scala-lang/scala-reflect/2.11.1/scala-reflect-2.11.1.jar
8b58df7e9e5f2f4f7d2f0dc24353f356abe965337e48504cec36a344e6294757 /org/scala-lang/scala-reflect/2.11.1/scala-reflect-2.11.1.pom
719fe091fd3fe4c6a7b8f69c8714935138b85a2b6145068a1ccfdb57d2e500d1 /org/sonatype/aether/aether/1.13.1/aether-1.13.1.pom
ae8dc80232771f8913febfa410c5719e9ba8ded81fb99788e214fd676dbbe13f /org/sonatype/aether/aether-api/1.13.1/aether-api-1.13.1.jar
9a58a1ddbbbe5b635674a958ac9d95d4ffaba7a40b9f800cde2cdf4986c3ef2a /org/sonatype/aether/aether-api/1.13.1/aether-api-1.13.1.pom
865511994805827e88f327944a089142bb7f3d88cde271ba3dceb732cb137a93 /org/sonatype/aether/aether-impl/1.13.1/aether-impl-1.13.1.jar
5d85a54716b6c6fc043895b129c3c76a2b9ca922c3bd79158ef08b7960aaf330 /org/sonatype/aether/aether-impl/1.13.1/aether-impl-1.13.1.pom
d5de4e299be5a79feb1dbe8ff3814034c6e44314b4c00b92ffa8d97576ded5b3 /org/sonatype/aether/aether-spi/1.13.1/aether-spi-1.13.1.jar
3d0c466fe8af3983356991ca7ff01a802920e04f946675d920420e154c5edec2 /org/sonatype/aether/aether-spi/1.13.1/aether-spi-1.13.1.pom
687799a0ce988bee9e8eb9ae0ba870300adc0114248ad4a4327bdb625d27e010 /org/sonatype/aether/aether-util/1.13.1/aether-util-1.13.1.jar
abd5e7869aa58f720d8c7301004334449351ad297aeb6ba2ebabf9b38503267b /org/sonatype/aether/aether-util/1.13.1/aether-util-1.13.1.pom
c14fb9c32b59cc03251f609416db7c0cff01f811edcccb4f6a865d6e7046bd0b /org/sonatype/forge/forge-parent/10/forge-parent-10.pom
03263b68791fb11e7464ffcc2c3de7eaeae235de8c94827ce6407e0454d2aae9 /org/sonatype/forge/forge-parent/3/forge-parent-3.pom
1838d132479005b4b7459b798e9d9915515090c288082fdcd86db0b10983a24c /org/sonatype/forge/forge-parent/4/forge-parent-4.pom
e56188aa8ce51278006aa90bc7e0f304a81e2f1219f462e7d21f262535cd2795 /org/sonatype/forge/forge-parent/5/forge-parent-5.pom
1678d4120a585d8a630131aeec4c524d928398583b7eab616ee7d5a87f520d3d /org/sonatype/oss/oss-parent/5/oss-parent-5.pom
b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 /org/sonatype/oss/oss-parent/7/oss-parent-7.pom
fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a /org/sonatype/oss/oss-parent/9/oss-parent-9.pom
5a15fdba22669e0fdd06e10dcce6320879e1f7398fbc910cd0677b50672a78c4 /org/sonatype/plexus/plexus-cipher/1.4/plexus-cipher-1.4.jar
a63a2e23988cca7fac6c93886d6f0506fd26d88d7e8cc0cb89b9c6e0d6c994ad /org/sonatype/plexus/plexus-cipher/1.4/plexus-cipher-1.4.pom
3b0559bb8432f28937efe6ca193ef54a8506d0075d73fd7406b9b116c6a11063 /org/sonatype/plexus/plexus-sec-dispatcher/1.3/plexus-sec-dispatcher-1.3.jar
d5e650c50ef6958c028ed024b59af04cf3d38e1453a77d542b6b484bc0f4ca0b /org/sonatype/plexus/plexus-sec-dispatcher/1.3/plexus-sec-dispatcher-1.3.pom
a966df5e36d54a9d9690db81c459806252b924da949a42b538eba5683d6267db /org/sonatype/sisu/inject/containers/2.3.0/containers-2.3.0.pom
cfc3507491767609fb2da36dcf32ebb0055b8bd32a2af182c021df9ecce26a76 /org/sonatype/sisu/inject/guava-parent/0.9.9/guava-parent-0.9.9.pom
852f10c4ba2210c29f75d330dc81f406ab8db5cb46430c5ba4082f9c13df180d /org/sonatype/sisu/inject/guice-bean/2.3.0/guice-bean-2.3.0.pom
6c1be769d69337f1a8cc2d7e756f94b8bdc02a76c3087545aad1e374ac4bd0ce /org/sonatype/sisu/inject/guice-parent/3.1.0/guice-parent-3.1.0.pom
9188fe7eb026bf4c35309f685ea7cf14cb2ebd7c7d49572486f5a97d4b312a03 /org/sonatype/sisu/inject/guice-plexus/2.3.0/guice-plexus-2.3.0.pom
9897e80ff6c08fc45b5b5ebd81d9e943a1087bdf0ad50cda457d616abbdaacd9 /org/sonatype/sisu/sisu-guava/0.9.9/sisu-guava-0.9.9.jar
2c007ed1e50e0edc62f8e3cdf725e1f61068206bc955aec48f3eb13a3467c6e5 /org/sonatype/sisu/sisu-guava/0.9.9/sisu-guava-0.9.9.pom
4b76079f35407e5682aac1ecbe67afd5f430ae619044a9d6a413666a45750c25 /org/sonatype/sisu/sisu-guice/3.1.0/sisu-guice-3.1.0-no_aop.jar
28a7c38bd751e9e2a9f8d13ddf876266f90f9d6e29c9178b524828afbc5e45f4 /org/sonatype/sisu/sisu-guice/3.1.0/sisu-guice-3.1.0.pom
4b112cc2452aee6930dff95512f05041e4c66a2df0a828e95f8439c23a8759e9 /org/sonatype/sisu/sisu-inject/2.3.0/sisu-inject-2.3.0.pom
75819b29737c2bee1bfbda1011d455c7036738e0ef32ffbf85ba1d8fa157ceb2 /org/sonatype/sisu/sisu-inject-bean/2.3.0/sisu-inject-bean-2.3.0.jar
f41fc69095282c2c332cf3d9f27a2f3b2d87cd22fcb6511df59fffd90a977ec0 /org/sonatype/sisu/sisu-inject-bean/2.3.0/sisu-inject-bean-2.3.0.pom
bf9083fb846993689409b2bdbc735048e53bac6cc32707cde7ef84817b6e9365 /org/sonatype/sisu/sisu-inject-plexus/2.3.0/sisu-inject-plexus-2.3.0.jar
34feae95889f78e7d4260167736e6af444296fbc5f3794b8c1b90eb6332c4714 /org/sonatype/sisu/sisu-inject-plexus/2.3.0/sisu-inject-plexus-2.3.0.pom
aef1fd28efd25bd778aa3d3770c6f9e606ca2354149e985f1d63fc7c6a366bd2 /org/sonatype/sisu/sisu-parent/2.3.0/sisu-parent-2.3.0.pom
02161ae46462da669b1d7be3f9b64687c6347f84d04c890fa467eff6def0ae10 /org/sonatype/spice/model-builder/1.3/model-builder-1.3.jar
0d2cc363cdfc6c102203adb6a5c138c195eaf1198527a09e6a17aa0227a66bcd /org/sonatype/spice/model-builder/1.3/model-builder-1.3.pom
683c012c6bf5e1e31b232b3755c027ccd829692a09c8216652b414b09d4ae623 /org/sonatype/spice/spice-parent/10/spice-parent-10.pom
21a19b26dbe5c38ddb5114cf4eadbf5ccb411bc6b128fdd5949b1ccb12f3683e /org/sonatype/spice/spice-parent/12/spice-parent-12.pom
258f43b5e805687302a5bb400856b972a573ec42a44f949641354a84b9243758 /org/sonatype/spice/spice-parent/16/spice-parent-16.pom
27901e5d4d60d3502571d5e6358fc89e3fcf874138b69d495d139bcc3e169404 /oshi-project/oshi-core/1.1/oshi-core-1.1.jar
e7e154dd64e5bd87e6ae2652ab52ab88eb53d05606466faee382d11f59d0ab71 /oshi-project/oshi-core/1.1/oshi-core-1.1.pom
d1968436fc216c901fb9b82c7e878b50fd1d30091676da95b2edd3a9c0ccf92e /stax/stax-api/1.0.1/stax-api-1.0.1.jar
87b13ae136a2bb9299271a0dfe8c351f76661b654ed8fde035c2cabb198cf259 /stax/stax-api/1.0.1/stax-api-1.0.1.pom
ad68a86cfd0255a2bc0525ce11ec49640caea7e34ff91eb89c3193dcccd77f05 /trove/trove/1.0.2/trove-1.0.2.jar
83f2682bd3ded1fe417b7e98e7ac86510cd747378eae7e3a5d1d35c7c7f0d2ea /trove/trove/1.0.2/trove-1.0.2.pom

View File

@@ -1,69 +0,0 @@
import java.util.jar.JarEntry
import java.util.jar.JarFile
import java.util.jar.JarOutputStream
initscript {
repositories {
maven { url 'http://jitpack.io' }
}
dependencies {
classpath 'com.github.johni0702:gradle-reproducible-builds-plugin:a524ada'
classpath 'com.github.johni0702:gradle-ecj-plugin:795736c'
}
}
def convertRepoToHttp = { repo ->
if (repo instanceof MavenArtifactRepository && repo.url.toString().startsWith('https://')) {
URL url = repo.url.toURL()
repo.url = new URL("http", url.getHost(), url.getPort(), url.getFile()).toURI()
}
}
allprojects {
buildscript {
repositories.all convertRepoToHttp
}
repositories { mavenCentral() } // for ecj
repositories.all convertRepoToHttp
apply plugin: de.johni0702.gradle.ReproducibleBuildsPlugin, to: project
apply plugin: xink.gradle.ecj.EcjPlugin, to: project
apply plugin: 'maven', to: project
ecj {
warn = ['none']
}
repositories {
maven {
url(project.file('gradle/reprod').exists() ? 'gradle/reprod/deps/repo' : '../repo')
}
}
task createPom {
doLast {
pom {
project {
groupId 'reprod'
artifactId project.file('.').name
version '0'
}
whenConfigured {
dependencies.removeAll { it.artifactId == 'mixin-asm-debug-all' }
}
}.writeTo("pom.xml")
}
}
if (!project.file('gradle/reprod').exists()) {
build.dependsOn createPom
}
reproducibleBuilds {
if (project.file('.').name == 'forgegradle') {
project.tasks.all {
if (it.name == 'jar') {
println 'Manually repacking archive after jar task'
repackAfter it
}
}
}
}
}

View File

@@ -1,37 +0,0 @@
From a1b7d25752424f267f5e9d299babc0403dbf7752 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Tue, 8 Aug 2017 19:44:44 +0200
Subject: [PATCH] Add build.gradle
---
build.gradle | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
create mode 100644 build.gradle
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..22fa679
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,18 @@
+apply plugin: 'java'
+
+sourceCompatibility = 1.8
+
+sourceSets {
+ main {
+ java {
+ srcDirs = ['src']
+ }
+ }
+}
+
+jar {
+ manifest {
+ attributes 'Main-Class': 'org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler'
+ }
+}
+
--
2.5.5

View File

@@ -1,75 +0,0 @@
From 7127699cb761a518cce8872b0b78694e357f21fe Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Mon, 28 Aug 2017 17:50:38 +0200
Subject: [PATCH] Replace https urls with http for proxy-witness
---
.../java/net/minecraftforge/gradle/common/BasePlugin.java | 13 ++++++++++---
.../java/net/minecraftforge/gradle/common/Constants.java | 4 ++--
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java b/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java
index df369f1..e3e50c0 100644
--- a/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java
+++ b/src/main/java/net/minecraftforge/gradle/common/BasePlugin.java
@@ -350,6 +350,13 @@ public abstract class BasePlugin<K extends BaseExtension> implements Plugin<Proj
deps.add(CONFIG_FFI_DEPS, deps.localGroovy());
}
+ private static String http(String url) {
+ if (url.startsWith("https://")) {
+ url = "http" + url.substring("https".length());
+ }
+ return url;
+ }
+
@SuppressWarnings("serial")
private void makeCommonTasks()
{
@@ -358,7 +365,7 @@ public abstract class BasePlugin<K extends BaseExtension> implements Plugin<Proj
@Override
public String call()
{
- return mcManifest.get(getExtension().getVersion()).url;
+ return http(mcManifest.get(getExtension().getVersion()).url);
}
});
getVersionJson.setFile(delayedFile(JSON_VERSION));
@@ -435,7 +442,7 @@ public abstract class BasePlugin<K extends BaseExtension> implements Plugin<Proj
@Override
public String call()
{
- return mcVersionJson.getClientUrl();
+ return http(mcVersionJson.getClientUrl());
}
});
@@ -449,7 +456,7 @@ public abstract class BasePlugin<K extends BaseExtension> implements Plugin<Proj
@Override
public String call()
{
- return mcVersionJson.getServerUrl();
+ return http(mcVersionJson.getServerUrl());
}
});
diff --git a/src/main/java/net/minecraftforge/gradle/common/Constants.java b/src/main/java/net/minecraftforge/gradle/common/Constants.java
index b42b1c2..a0753e0 100644
--- a/src/main/java/net/minecraftforge/gradle/common/Constants.java
+++ b/src/main/java/net/minecraftforge/gradle/common/Constants.java
@@ -115,10 +115,10 @@ public class Constants
// urls
- public static final String URL_MC_MANIFEST = "https://launchermeta.mojang.com/mc/game/version_manifest.json";
+ public static final String URL_MC_MANIFEST = "http://launchermeta.mojang.com/mc/game/version_manifest.json";
public static final String URL_FF = "http://files.minecraftforge.net/fernflower-fix-1.0.zip";
public static final String URL_ASSETS = "http://resources.download.minecraft.net";
- public static final String URL_LIBRARY = "https://libraries.minecraft.net/"; // Mojang's Cloudflare front end
+ public static final String URL_LIBRARY = "http://libraries.minecraft.net/"; // Mojang's Cloudflare front end
//public static final String URL_LIBRARY = "https://minecraft-libraries.s3.amazonaws.com/"; // Mojang's AWS server, as Cloudflare is having issues, TODO: Switch back to above when their servers are fixed.
public static final String URL_FORGE_MAVEN = "http://files.minecraftforge.net/maven";
public static final List<String> URLS_MCP_JSON = Arrays.asList(
--
2.5.5

View File

@@ -1,36 +0,0 @@
From 2309fc9515d4010c5d9db89008660e3e60ea529b Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Sat, 26 Aug 2017 17:40:48 +0200
Subject: [PATCH] Replace SNAPSHOT deps with manually built ones
---
build.gradle | 49 +++----------------------------------------------
1 file changed, 3 insertions(+), 46 deletions(-)
diff --git a/build.gradle b/build.gradle
index bfadecd..774a015 100644
--- a/build.gradle
+++ b/build.gradle
@@ -67,7 +67,7 @@ dependencies {
compile 'com.nothome:javaxdelta:2.0.1' // GDIFF implementation for BinPatches
compile 'com.google.code.gson:gson:2.2.4' // Used instead of Argo for buuilding changelog.
compile 'com.github.tony19:named-regexp:0.2.3' // 1.7 Named regexp features
- compile 'net.minecraftforge:fernflower:2.0-SNAPSHOT' // Fernflower Forge edition
+ compile 'reprod:forgeflower:0' // Fernflower Forge edition
shade 'net.md-5:SpecialSource:1.7.4' // deobf and reobs
// compile 'net.md-5:SpecialSource:1.7.4' // when md5 publishes
@@ -78,8 +78,8 @@ dependencies {
// mcp stuff
shade 'de.oceanlabs.mcp:RetroGuard:3.6.6'
- shade 'de.oceanlabs.mcp:mcinjector:3.4-SNAPSHOT'
- shade 'net.minecraftforge.srg2source:Srg2Source:4.0-SNAPSHOT'
+ shade 'reprod:mcinjector:0'
+ shade 'reprod:srg2source:0'
//Stuff used in the GradleStart classes
compileOnly 'com.mojang:authlib:1.5.16'
--
2.5.5

View File

@@ -1,126 +0,0 @@
From 85e6315018dd8ff9f613b1f0c4d00c5b0c6c37d6 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Sat, 26 Aug 2017 17:27:06 +0200
Subject: [PATCH 1/2] Remove non-essential parts and shade manually
---
build.gradle | 92 +-----------------------------------------------------------
1 file changed, 1 insertion(+), 91 deletions(-)
diff --git a/build.gradle b/build.gradle
index 2e5f949..b6c63bb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,15 +1,5 @@
-buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath 'eu.appsatori:gradle-fatjar-plugin:0.2-rc1'
- }
-}
-
apply plugin: 'java'
apply plugin: 'eclipse'
-apply plugin: 'fatjar'
apply plugin: 'maven'
group = 'de.oceanlabs.mcp'
@@ -22,93 +12,12 @@ repositories {
}
jar {
manifest.attributes('Main-Class': 'de.oceanlabs.mcp.mcinjector.MCInjector')
}
-fatJar {
- classifier 'fatjar'
- manifest.attributes('Main-Class': 'de.oceanlabs.mcp.mcinjector.MCInjector')
-}
-
-artifacts {
- archives jar
- archives fatJar
-}
dependencies {
compile 'org.ow2.asm:asm-debug-all:5.0.4'
compile 'net.sf.jopt-simple:jopt-simple:4.5'
compile 'com.google.code.gson:gson:2.2.4'
}
-configurations { deployJars }
-uploadArchives {
- repositories {
- add project.repositories.mavenLocal()
- }
- repositories.mavenDeployer {
- configuration = configurations.deployJars
- if (project.hasProperty("filesmaven")) {
- logger.info('Publishing to files server')
- repository(url: project.filesmaven.url) {
- authentication(userName: project.filesmaven.username, privateKey: project.filesmaven.key)
- }
- } else {
- logger.info('Publishing to repo folder')
- repository(url: 'file://localhost/' + project.file('repo').getAbsolutePath())
- }
-
- pom {
- groupId = project.group
- version = project.version
- artifactId = project.archivesBaseName
- }
- pom.project {
- name project.archivesBaseName
- packaging 'jar'
- description 'Java class metadata injector'
- url 'https://github.com/ModCoderPack/MCInjector'
-
- scm {
- url 'https://github.com/ModCoderPack/MCInjector'
- connection 'scm:git:git://github.com/ModCoderPack/MCInjector.git'
- developerConnection 'scm:git:git@github.com:ModCoderPack/MCInjector.git'
- }
-
- issueManagement {
- system 'github'
- url 'https://github.com/ModCoderPack/MCInjector/issues'
- }
-
- licenses {
- license {
- name ''
- url ''
- distribution 'repo'
- }
- }
-
- developers {
- developer {
- id 'Fesh0r'
- name 'Fesh0r'
- roles { role 'developer' }
- }
- developer {
- id 'Searge'
- name 'Searge'
- roles { role 'developer' }
- }
- developer {
- id 'cpw'
- name 'cpw'
- roles { role 'developer' }
- }
- developer {
- id 'LexManos'
- name 'Lex Manos'
- roles { role 'developer' }
- }
- }
- }
- }
-}
--
2.5.5

View File

@@ -1,54 +0,0 @@
From c245b961e83176a1731a7eaf1f1f3ffbefa1afb7 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Tue, 8 Aug 2017 19:08:56 +0200
Subject: [PATCH 2/7] Remove/replace all buildscript dependencies
---
build.gradle | 24 +-----------------------
1 file changed, 1 insertion(+), 23 deletions(-)
diff --git a/build.gradle b/build.gradle
index e0c46ea..165dbe4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,13 +5,11 @@
}
dependencies {
- classpath 'nl.javadude.gradle.plugins:license-gradle-plugin:0.11.0'
classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3'
}
}
// Apply plugin
apply plugin: 'java'
-apply plugin: 'license'
apply plugin: 'checkstyle'
apply plugin: 'maven'
apply plugin: 'eclipse'
@@ -170,23 +165,6 @@ tasks.withType(AbstractArchiveTask) {
from 'LICENSE.txt'
}
-// License header formatting
-license {
- ext {
- name = project.name
- organization = project.organization
- url = project.url
- }
- include '**/*.java'
- header file("HEADER.txt")
- sourceSets = project.sourceSets
- ignoreFailures false
- strictCheck true
- mapping {
- java = 'SLASHSTAR_STYLE'
- }
-}
-
checkstyle {
configProperties = [
"name" : project.name,
--
2.5.5

View File

@@ -1,25 +0,0 @@
From 0f250141ba6515dbeffeb0722bf29976850bb323 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Tue, 8 Aug 2017 19:13:17 +0200
Subject: [PATCH 3/7] Fix for Gradle 3
---
build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index 165dbe4..0f189ec 100644
--- a/build.gradle
+++ b/build.gradle
@@ -92,7 +92,7 @@ dependencies {
// Task to read ASM library and rename packages
task renamedASM {
- outputs.file files(configurations.asm.files.withIndex().collect { file, i -> def dep = configurations.asm.dependencies[i]
+ outputs.files files(configurations.asm.files.withIndex().collect { file, i -> def dep = configurations.asm.dependencies[i]
new File(new File(renamedPackageRoot, "org/spongepowered/mixin-" + dep.name + "/" + dep.version), "mixin-" + file.name).path
})
ant {
--
2.5.5

View File

@@ -1,42 +0,0 @@
From eb4fa04cf82067b20caa7222c154f8b6f7ab95ac Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Tue, 8 Aug 2017 19:13:45 +0200
Subject: [PATCH 4/7] Disable checkstyle
---
build.gradle | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/build.gradle b/build.gradle
index 0f189ec..f8598a3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,6 @@ buildscript {
// Apply plugin
apply plugin: 'java'
-apply plugin: 'checkstyle'
apply plugin: 'maven'
apply plugin: 'eclipse'
apply plugin: 'idea'
@@ -165,17 +164,6 @@ tasks.withType(AbstractArchiveTask) {
from 'LICENSE.txt'
}
-checkstyle {
- configProperties = [
- "name" : project.name,
- "organization": project.organization,
- "url" : project.url,
- "year" : project.inceptionYear
- ]
- configFile = file("checkstyle.xml")
- toolVersion = '6.19'
-}
-
// Source compiler configuration
tasks.withType(JavaCompile) {
options.compilerArgs += ['-Xlint:all', '-Xlint:-path']
--
2.5.5

View File

@@ -1,25 +0,0 @@
From c66ba83e4b27f6f094c2dcdaaac095d3ca69b41c Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Tue, 8 Aug 2017 19:35:08 +0200
Subject: [PATCH 5/7] Replace fernflower SNAPSHOT depencency
---
build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/build.gradle b/build.gradle
index f8598a3..e9a965b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -143,7 +143,7 @@ dependencies {
// Fernflower decompiler
fernflowerCompile configurations.compile
- fernflowerCompile 'org.jetbrains.java.decompiler:fernflower:sponge-SNAPSHOT'
+ fernflowerCompile 'reprod:fernflower:0'
// LegacyLauncher service
launchwrapperCompile configurations.compile
--
2.5.5

View File

@@ -1,56 +0,0 @@
From 6422d5985faeff394237a499e5529b765dd46b7e Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Tue, 8 Aug 2017 21:40:59 +0200
Subject: [PATCH 6/7] Use TreeMap in ReferenceMapper for reproducibility
---
.../java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java b/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java
index 2a368e7..082b5dd 100644
--- a/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java
+++ b/src/main/java/org/spongepowered/asm/mixin/refmap/ReferenceMapper.java
@@ -29,7 +29,6 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Serializable;
-import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
@@ -71,13 +70,13 @@ public final class ReferenceMapper implements Serializable {
* by the AP. Each entry is keyed by the owning mixin, with the value map
* containing the actual remappings for each owner
*/
- private final Map<String, Map<String, String>> mappings = Maps.newHashMap();
+ private final Map<String, Map<String, String>> mappings = Maps.newTreeMap();
/**
* All mapping sets, keyed by environment type, eg. "notch", "searge". The
* format of each map within this map is the same as for {@link #mappings}
*/
- private final Map<String, Map<String, Map<String, String>>> data = Maps.newHashMap();
+ private final Map<String, Map<String, Map<String, String>>> data = Maps.newTreeMap();
/**
* True if this refmap cannot be written. Only true for the
@@ -191,13 +190,13 @@ public final class ReferenceMapper implements Serializable {
if (context != null) {
mappings = this.data.get(context);
if (mappings == null) {
- mappings = Maps.newHashMap();
+ mappings = Maps.newTreeMap();
this.data.put(context, mappings);
}
}
Map<String, String> classMappings = mappings.get(className);
if (classMappings == null) {
- classMappings = new HashMap<String, String>();
+ classMappings = Maps.newTreeMap();
mappings.put(className, classMappings);
}
return classMappings.put(reference, newReference);
--
2.5.5

View File

@@ -1,26 +0,0 @@
From c3d6d12f47bae3c12c597e59d9a69989fdaa9550 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Fri, 25 Aug 2017 19:27:13 +0200
Subject: [PATCH] Do not include java version and user name in jar
---
build.gradle | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/build.gradle b/build.gradle
index debc97b..ae53e1b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -241,8 +241,7 @@ jar {
// JAR manifest configuration
manifest.mainAttributes(
- "Built-By": System.properties['user.name'],
- "Created-By": System.properties['java.vm.version'] + " (" + System.properties['java.vm.vendor'] + ")",
+ "Built-By": 'ReplayMod reprod',
"Implementation-Title": name,
"Implementation-Version": version + "+" + ciSystem + "-b" + buildNumber + ".git-" + commit,
"Implementation-Vendor": url,
--
2.13.2

View File

@@ -1,26 +0,0 @@
From 6de53f46b4b14c7667e7cff8010bde040ae7967b Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Fri, 25 Aug 2017 18:34:39 +0200
Subject: [PATCH] Do not include java version and user name in jar
---
build.gradle | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/build.gradle b/build.gradle
index db80dfa..2f5e041 100644
--- a/build.gradle
+++ b/build.gradle
@@ -59,8 +59,7 @@ processResources {
}
jar.manifest.mainAttributes (
- "Built-By": System.properties['user.name'],
- "Created-By": System.properties['java.vm.version'] + " (" + System.properties['java.vm.vendor'] + ")",
+ "Built-By": 'ReplayMod reprod',
"Implementation-Title": name,
"Implementation-Version": version
)
--
2.13.2

View File

@@ -1,53 +0,0 @@
From 6b7ad7fd8c22384e62585a962e1bd74d6d003582 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Sat, 2 Sep 2017 15:10:35 +0200
Subject: [PATCH] Disable license plugin
---
build.gradle | 18 ------------------
1 file changed, 18 deletions(-)
diff --git a/build.gradle b/build.gradle
index 60ad57d..57aa5e4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,13 +5,11 @@ buildscript {
}
}
dependencies {
- classpath 'nl.javadude.gradle.plugins:license-gradle-plugin:0.11.0'
classpath "com.gradle.publish:plugin-publish-plugin:0.9.1"
}
}
apply plugin: 'groovy'
-apply plugin: 'license'
apply plugin: 'maven'
apply plugin: 'eclipse'
apply plugin: "com.gradle.plugin-publish"
@@ -42,22 +40,6 @@ processResources {
from 'LICENSE.txt'
}
-license {
- ext {
- name = project.name
- organization = project.organization
- url = project.url
- }
- include '**/*.groovy'
- header file("HEADER.txt")
- sourceSets = project.sourceSets
- ignoreFailures false
- strictCheck true
- mapping {
- java = 'SLASHSTAR_STYLE'
- }
-}
-
jar.manifest.mainAttributes (
"Built-By": 'ReplayMod reprod',
"Implementation-Title": name,
--
2.9.5

View File

@@ -1,44 +0,0 @@
From 493dbd8ed387d661eef3e33ee614c79d7487f1bd Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Mon, 7 Aug 2017 20:41:05 +0200
Subject: [PATCH 1/5] Replace buildscript dependencies with manually built ones
---
build.gradle | 19 ++-----------------
1 file changed, 2 insertions(+), 17 deletions(-)
diff --git a/build.gradle b/build.gradle
index ee24828..42d0607 100755
--- a/build.gradle
+++ b/build.gradle
@@ -1,24 +1,17 @@
import groovy.json.JsonOutput
buildscript {
repositories {
mavenCentral()
- maven {
- name = "forge"
- url = "http://files.minecraftforge.net/maven"
- }
- maven {
- name = "sponge"
- url = "https://repo.spongepowered.org/maven"
- }
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
+ maven { url 'gradle/reprod/deps/repo' }
}
dependencies {
- classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
- classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT'
+ classpath 'reprod:forgegradle:0'
+ classpath 'reprod:mixingradle:0'
}
}
--
2.5.5

View File

@@ -1,25 +0,0 @@
From 9e4e7ac3f8ee5508939cf71e731189e4c0e1c7b5 Mon Sep 17 00:00:00 2001
From: Jonas Herzig <me@johni0702.de>
Date: Tue, 8 Aug 2017 20:06:39 +0200
Subject: [PATCH 2/5] Replace mixin dep with manually built one
---
build.gradle | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/build.gradle b/build.gradle
index 42d0607..bfa3914 100755
--- a/build.gradle
+++ b/build.gradle
@@ -44,7 +44,7 @@ configurations {
dependencies {
compile 'org.projectlombok:lombok:1.16.4'
- compile 'org.spongepowered:mixin:0.7.5-SNAPSHOT'
+ compile 'reprod:mixin:0'
shade 'com.googlecode.mp4parser:isoparser:1.1.7'
shade 'org.apache.commons:commons-exec:1.3'
shade 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0'
--
2.5.5

View File

@@ -1,21 +0,0 @@
# Collects build artifacts that aren't present in the online cache
# into a subfolder that can be merged with the online cache
# This script isn't expected to function on OSX.
set -e
set -x
# Step one: copy all artifacts into subfolder under new name
rm -rf artifactCache
mkdir artifactCache
cd artifactCache
for f in $(find ../deps/repo -type f); do
cp $f $(sha256sum $f | cut -d' ' -f1)
done
# Step two: remove all files that are already in the cache
for f in *; do
if wget -q --spider "https://www.johni0702.de/replaymod/artifact/$f"; then
rm $f
fi
done

View File

@@ -1,147 +0,0 @@
#!/usr/bin/env bash
set -e
set -x
PROXY_PORT="25678"
PROXY_SETTINGS="-Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=$PROXY_PORT -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=$PROXY_PORT"
pushd gradle/reprod
SHA256SUM="sha256sum"
command -v "$SHA256SUM" > /dev/null 2>&1 || SHA256SUM="shasum -a 256" # OSX
sha256val () {
$SHA256SUM $1 | cut -d' ' -f1
}
setup_dep () {
dep=$1
url=$2
commit=$3
jar=$4
jarhash=$5
pomhash=$6
depjar="deps/repo/reprod/$dep/0/$dep-0.jar"
deppom="deps/repo/reprod/$dep/0/$dep-0.pom"
[ -f "$depjar" ] && [ "$(sha256val "$depjar")" == "$jarhash" ] && [ -f "$deppom" ] && [ "$(sha256val "$deppom")" == "$pomhash" ] && return
[ -f "$depjar" ] && [ "*" == "$jarhash" ] && return
rm -rf "$depjar" "$deppom"
mkdir -p "deps/repo/reprod/$dep/0"
if [ "*" != "$jarhash" ] && [ "$OFFLINE" != "1" ]; then
# Try to fetch the pre-built artifact
if wget -O "deps/dl.jar" "https://www.johni0702.de/replaymod/artifact/$jarhash" && wget -O "deps/dl.pom" "https://www.johni0702.de/replaymod/artifact/$pomhash"; then
# Verify downloaded jar/pom files
if [ "$(sha256val "deps/dl.jar")" == "$jarhash" ] && [ "$(sha256val "deps/dl.pom")" == "$pomhash" ]; then
# Got valid pre-built artifact, use it
mv "deps/dl.jar" "$depjar"
mv "deps/dl.pom" "$deppom"
return
fi
fi
fi
if [ ! -d "deps/$dep" ] || [ "$(git -C "deps/$dep" rev-parse $commit^{commit})" != "$commit" ]; then
rm -rf "deps/$dep"
mkdir -p "deps/$dep"
pushd "deps/$dep"
git clone "$url" .
git fetch origin $commit
git checkout "$commit"
popd
fi
pushd "deps/$dep"
git reset --hard "$commit"
git submodule update --init --recursive
patches=$(find ../../patches/$dep/ -name *.patch | sort)
[ "$patches" != "" ] && echo "$patches" | xargs git am
git reset --soft "$commit" # Because forgegradle includes the commit hash in the jar
rm -rf gradle/wrapper gradlew
[ ! -d gradle ] && mkdir gradle
cp -r ../../../wrapper gradle/
cp ../../../wrapper/gradle-wrapper.properties gradle/wrapper/
cp ../../../../gradlew .
chmod +x gradlew
if [ "$dep" == "proxy-witness" ]; then
./gradlew $PROXY_SETTINGS build -x test -x javadoc
else
./gradlew $PROXY_SETTINGS -I ../../init.gradle build -x test -x javadoc
fi
actual_hash=$(sha256val "$jar")
if [ "*" != "$jarhash" ] && [ "$actual_hash" != "$jarhash" ]; then
echo "Failed to verify checksum of build artifact of dependency: $dep"
echo "Expected: $jarhash"
echo "But was: $actual_hash"
exit 1
fi
actual_hash=$(sha256val "pom.xml")
if [ "*" != "$jarhash" ] && [ "$actual_hash" != "$pomhash" ]; then
echo "Failed to verify checksum of build artifact pom of dependency: $dep"
echo "Expected: $pomhash"
echo "But was: $actual_hash"
exit 1
fi
# Subshell to allow for expansion of *
cp "$(echo $jar)" "../../$depjar"
[ "$dep" == "proxy-witness" ] || cp "pom.xml" "../../$deppom"
popd
}
# Setup http(s) proxy
setup_dep "proxy-witness" "https://github.com/johni0702/proxy-witness" "17ebb2e22f812faed9a28bae6bf1d8b28f798d56" "build/libs/proxy-witness.jar" "*" "*"
java -Dproxywitness.httpUris=http://export.mcpbot.bspk.rs/versions.json -jar deps/repo/reprod/proxy-witness/0/proxy-witness-0.jar "$PROXY_PORT" checksums.txt > proxy.log 2>&1 &
proxy_pid=$!
trap "kill $proxy_pid" EXIT
# Required for mixin
setup_dep "fernflower" "https://github.com/fesh0r/fernflower.git" "adbf29f8ce902cd164fc0c41491030268ecc8265" "build/libs/fernflower.jar" "d2042d3121118a7175fc902d0e49f4ad37d00467e7ea535574974142eff64184" "901b8a76ceb15db97d4dd19c5e8fcb0fc226ae602ef38ea906eb5258be9b929a"
# Required for forgegradle
setup_dep "forgeflower" "https://github.com/MinecraftForge/FernFlowerLegacy.git" "114aebe82cf40075c5c4f916c409b8aebf8096d5" "build/libs/fernflower-2.0-SNAPSHOT.jar" "c8b4a4a13a1158008aed46da2c805184078324718697f14a67f1778168579956" "fbda3f30d54624fe4c59a69e145b644d8642afc0dd4eb0d732ccdaa0ebd5d8a3"
setup_dep "mcinjector" "https://github.com/ModCoderPack/MCInjector.git" "7258466461baf7dc4f313b06b0d589407e4e1fba" "build/libs/mcinjector-3.4-SNAPSHOT.jar" "98b685ea0d3ae9fad8b8a7e7b885512f7fe0b61becf27d9c74b91a626d107efc" "3c08655c11e6509bfc62ff87d0770cefa0ecbd8dccece9e083c9b7b89779a8c5"
setup_dep "srg2source" "https://github.com/MinecraftForge/Srg2Source.git" "ea4ea624672e8b75fb2a78f0fb9105db13d5a4a6" "build/libs/Srg2Source-4.0-SNAPSHOT.jar" "727445a7b946535217be658726c537acf1921f0a9e2ac0ea717dff9b36dc529f" "4ebd7b738f368ee5c25a1028a167257e7012cef7c72c8b5b06149286992c631e"
# Required for RM
setup_dep "mixingradle" "https://github.com/SpongePowered/MixinGradle.git" "52217aa8ca221dcd0b9fb657b037e663db808f38" "build/libs/mixingradle-0.4-SNAPSHOT.jar" "8b3508867128a5d564631635dff898a36f9aca8db54b7bb3af6f4924e3f4bead" "42cbf81136d4e26c06d3234427665b50d18768cc1f210512204ca1d5e3a42b5c"
setup_dep "forgegradle" "https://github.com/MinecraftForge/ForgeGradle.git" "d13a6c892f51937567b3d01d85bea4f3d128e71d" "build/libs/ForgeGradle-2.2-SNAPSHOT.jar" "355a8bd6f49f3d11c40d58da9bb388e05b634ddfac43ab222bf2326aa40f0be4" "45966ee785c42e34c36be3e73046aca1a581a919fb02a9028970d19d35488b18"
setup_dep "mixin" "https://github.com/SpongePowered/Mixin.git" "404f5da0b6b18980b4e44c7f1cfeddcd47fe4aa6" "build/libs/mixin-0.7.5-SNAPSHOT.jar" "7d181a5e7c317c00c07da14e7770e4356b0f201414cd2a836e987be9fa133d43" "11000383a5051f25a70c2bff3a3167b6859ae4f9838a0ab45560e9f9c9d9def7"
rm -rf tmp
mkdir tmp
pushd tmp
cp ../../../build.gradle build.gradle
git init
git add build.gradle
git commit -m "Add build.gradle"
git am ../patches/replaymod/*.patch
popd
popd # Back to root
./gradlew -Preprod $PROXY_SETTINGS -I gradle/reprod/init.gradle "$@"
if [ "$SIGNED_JAR" == "1" ]; then
echo "Trying fetch signature for resulting jar file.."
# Note: This requires there to be one and only one jar file (ignoring source artifacts)
jar="build/libs/$(ls build/libs | grep -v sources)"
jar_hash=$(sha256val "$jar")
pushd gradle/reprod/tmp
mkdir sign_tmp
pushd sign_tmp
# Signatures are generated using:
# jarsigner -sigfile johni -signedjar signed.jar unsigned.jar replaymod
# jar xf signed.jar META-INF/MANIFEST.MF META-INF/JOHNI.SF META-INF/JOHNI.RSA
# tar cJf signature.tar.xz META-INF
wget -O - "https://www.johni0702.de/replaymod/signature/$jar_hash" | tar xJ
jar uMf "../../../../$jar" META-INF/
popd
fi

Binary file not shown.

View File

@@ -1,6 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-3.5.1-all.zip
distributionSha256Sum=69d99ade952de3727b65a88f3188ee72231ff4e28c2d00aacfc96a42c6d6f303

121
gradlew vendored
View File

@@ -1,4 +1,20 @@
#!/usr/bin/env bash
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
@@ -6,47 +22,6 @@
##
##############################################################################
if [ "$REPRODUCIBLE_BUILD" == "1" ] && [ -f ./gradle/reprod/setup.sh ] && [ "$1" != "-Preprod" ]; then
./gradle/reprod/setup.sh "$@"
exit
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
@@ -65,6 +40,46 @@ cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -90,7 +105,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -155,11 +170,19 @@ if $cygwin ; then
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
APP_ARGS=$(save "$@")
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

28
gradlew.bat vendored
View File

@@ -1,3 +1,19 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem http://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -8,14 +24,14 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
@@ -49,7 +65,6 @@ goto fail
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
@@ -60,11 +75,6 @@ set _SKIP=2
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line

2
jGui

Submodule jGui updated: b5fdbb85e1...b0e068383c

1
libs/ReplayStudio Submodule

Submodule libs/ReplayStudio added at ca00f8101b

288
root.gradle.kts Executable file
View File

@@ -0,0 +1,288 @@
import groovy.json.JsonOutput
import java.io.ByteArrayOutputStream
import org.gradle.kotlin.dsl.support.serviceOf
import org.gradle.process.ExecOperations
plugins {
id("gg.essential.multi-version.root")
id("gg.essential.loom") version "1.15.48" apply false
kotlin("jvm") version "2.3.20" apply false
id("com.github.hierynomus.license") version "0.15.0"
}
val latestVersion = file("version.txt").readLines().first()
var releaseCommit = providers.exec {
commandLine("git", "blame", "-p", "-l", "version.txt")
}.standardOutput.asText.map { it.trim().split("/n").first().split(" ").first() }.get()
if (latestVersion == "2.1.0") { // First version since change from tag-based
releaseCommit = "35ac26e91689ac9bdf12dbb9902c452464a75108" // git rev-parse 1.12.2-2.1.0
}
val currentCommit = providers.exec {
commandLine("git", "rev-parse", "HEAD")
}.standardOutput.asText.map { it.trim().split("/n").first() }.get()
if (releaseCommit == currentCommit) {
version = latestVersion
} else {
val diff = providers.exec {
commandLine("git", "log", "--format=oneline", "$releaseCommit..$currentCommit")
}.standardOutput.asText.map { it.trim().split("/n").size }.get()
version = "$latestVersion-$diff-g${currentCommit.substring(0, 7)}"
}
val dirty = providers.exec {
commandLine("git", "describe", "--always", "--dirty=*")
}.standardOutput.asText.map { it.trim().endsWith("*") }.get()
if (dirty) {
version = "$version-dirty"
}
group = "com.replaymod"
val bundleJar by tasks.registering(Copy::class) {
into("$buildDir/libs")
}
subprojects {
buildscript {
repositories {
maven("https://jitpack.io")
}
}
if (name == "jGui" || name == "ReplayStudio") {
return@subprojects
}
val (major, minor, patch) = name.split("-")[0].split(".") + listOf("0")
val mcVersion = major.toInt() * 10000 + minor.toInt() * 100 + patch.toInt()
val fabric = mcVersion >= 1_14_00 && !name.endsWith("-forge")
extra.set("loom.platform", if (fabric) "fabric" else "forge")
afterEvaluate {
val projectBundleJar = project.tasks.findByName("bundleJar")
if (projectBundleJar != null && projectBundleJar.hasProperty("archivePath") && project.name != "core") {
bundleJar.configure {
dependsOn(projectBundleJar)
from(projectBundleJar.withGroovyBuilder { getProperty("archivePath") })
}
}
}
}
fun ExecOperations.command(vararg cmd: String): List<String> {
val stdout = ByteArrayOutputStream()
exec {
commandLine(*cmd)
standardOutput = stdout
}
return stdout.toString().trim().split("\n")
}
fun generateVersionsJson(execOps: ExecOperations): Map<String, Any> {
fun command(vararg cmd: String): List<String> =
execOps.command(*cmd)
val versionComparator = compareBy<String>(
{ (it.split(".").getOrNull(0) ?: "0").toInt() },
{ (it.split(".").getOrNull(1) ?: "0").toInt() },
{ (it.split(".").getOrNull(2) ?: "0").toInt() }
)
// Find all tag-style releases by listing all tags
val tagVersions = command("git", "for-each-ref", "--sort=taggerdate", "--format=%(refname:short)", "refs/tags")
// Find all commit-style releases
// List all commits
val releaseCommits =
command("git", "log", "--format=%H", "--date-order", "-E",
"--grep", "Pre-release [0-9]+ of [0-9]+\\.[0-9]+\\.[0-9]+",
"--grep", "Release [0-9]+\\.[0-9]+\\.[0-9]+")
// Find version string and MC versions for each commit hash
val commitVersions = releaseCommits.map { commit ->
val version = command("git", "show", "$commit:version.txt").first()
val mcVersions = command("git", "ls-tree", "-d", "--name-only", "$commit:versions")
// In the past (early days of preprocessor) we used to have an internal "core" project
.filter { it != "core" }
// Internal project used to automatically remap from Forge 1.12.2 to Fabric 1.14.4
.filter { it != "1.14.4-forge" }
// We dropped 1.8 with the switch to archloom but still kept its source in case someone
// volunteers to make it build again
.filterNot { it == "1.8" && versionComparator.compare(version, "2.6.16") >= 0 }
// We dropped 1.7.10 with the Gradle 7 update but still kept its source in case someone
// volunteers to ~~update FG 1.2 to Gradle 7~~ make it work with archloom.
.filterNot { it == "1.7.10" && versionComparator.compare(version, "2.6.0") >= 0 }
val versions = mcVersions.map { "$it-$version" }.toMutableList()
when (version) {
"2.6.7" -> versions.add("1.19.1-2.6.7") // forgot to add the .gitkeep file before merging
}
versions
}.flatten()
val versions = commitVersions + tagVersions.reversed()
val mcVersions = versions
.map {it.substring(0, it.indexOf("-"))}
.distinct()
.sortedWith(versionComparator)
val promos = mutableMapOf<String, String>()
val root = mutableMapOf<String, Any>(
"homepage" to "https://www.replaymod.com/download/",
"promos" to promos
)
mcVersions.forEach { mcVersion ->
var mcVersionRoot = mutableMapOf<String, String>()
var latest: String? = null
var recommended: String? = null
versions.forEach {
val (thisMcVersion, modVersion, preVersion) = it.split("-") + listOf(null, null)
if (thisMcVersion == mcVersion) {
mcVersionRoot[it] = "See https://www.replaymod.com/changelog.txt"
if (latest == null) latest = it
if (preVersion == null) {
if (recommended == null) recommended = it
}
}
}
root[mcVersion] = mcVersionRoot
promos[mcVersion + "-latest"] = latest!!
if (recommended != null) {
promos[mcVersion + "-recommended"] = recommended!!
}
}
return root
}
val writeVersionsJson by tasks.registering {
val execOps = project.serviceOf<ExecOperations>()
doLast {
val versionsRoot = generateVersionsJson(execOps)
val versionsJson = JsonOutput.prettyPrint(JsonOutput.toJson(versionsRoot))
File("versions.json").writeText(versionsJson)
}
}
val doRelease by tasks.registering {
val execOps = project.serviceOf<ExecOperations>()
doLast {
fun command(vararg cmd: String): List<String> =
execOps.command(*cmd)
// Parse version
val version = project.extra["releaseVersion"] as String
if (command("git", "describe", "--always", "--dirty=*").first().endsWith("*")) {
throw InvalidUserDataException("Git working tree is dirty. Make sure to commit all changes.")
}
val (modVersion, preVersion) = if ("-b" in version) {
version.split("-b")
} else {
listOf(version, null)
}
// Merge release branch into stable but do not yet commit (we need to update the version.txt first)
command("git", "checkout", "stable")
command("git", "merge", "--no-ff", "--no-commit", "release-$version")
// Update version.txt
file("version.txt").writeText("$version\n")
command("git", "add", "version.txt")
// Finallize the merge. The message is what is later used to identify releses for building the version.json tree
val commitMessage = if (preVersion != null)
"Pre-release $preVersion of $modVersion"
else
"Release $modVersion"
command("git", "commit", "-m", commitMessage)
// Generate versions.json content
val versionsRoot = generateVersionsJson(execOps)
val versionsJson = JsonOutput.prettyPrint(JsonOutput.toJson(versionsRoot))
// Switch to master branch to update versions.json
command("git", "checkout", "master")
// Write versions.json
File("versions.json").writeText(versionsJson)
// Commit changes
command("git", "add", "versions.json")
command("git", "commit", "-m", "Update versions.json for $version")
// Return to previous branch
command("git", "checkout", "-")
}
}
defaultTasks("bundleJar")
preprocess {
strictExtraMappings.set(true)
val mc26_01_00 = createNode("26.1", 26_01_00, "yarn")
val mc12111 = createNode("1.21.11", 12111, "yarn")
val mc12110 = createNode("1.21.10", 12110, "yarn")
val mc12107 = createNode("1.21.7", 12107, "yarn")
val mc12105 = createNode("1.21.5", 12105, "yarn")
val mc12104 = createNode("1.21.4", 12104, "yarn")
val mc12102 = createNode("1.21.2", 12102, "yarn")
val mc12100 = createNode("1.21", 12100, "yarn")
val mc12006 = createNode("1.20.6", 12006, "yarn")
val mc12004 = createNode("1.20.4", 12004, "yarn")
val mc12002 = createNode("1.20.2", 12002, "yarn")
val mc12001 = createNode("1.20.1", 12001, "yarn")
val mc11904 = createNode("1.19.4", 11904, "yarn")
val mc11903 = createNode("1.19.3", 11903, "yarn")
val mc11902 = createNode("1.19.2", 11902, "yarn")
val mc11901 = createNode("1.19.1", 11901, "yarn")
val mc11900 = createNode("1.19", 11900, "yarn")
val mc11802 = createNode("1.18.2", 11802, "yarn")
val mc11801 = createNode("1.18.1", 11801, "yarn")
val mc11701 = createNode("1.17.1", 11701, "yarn")
val mc11604 = createNode("1.16.4", 11604, "yarn")
val mc11601 = createNode("1.16.1", 11601, "yarn")
val mc11502 = createNode("1.15.2", 11502, "yarn")
val mc11404 = createNode("1.14.4", 11404, "yarn")
val mc11404Forge = createNode("1.14.4-forge", 11404, "srg")
val mc11202 = createNode("1.12.2", 11202, "srg")
val mc11201 = createNode("1.12.1", 11201, "srg")
val mc11200 = createNode("1.12", 11200, "srg")
val mc11102 = createNode("1.11.2", 11102, "srg")
val mc11100 = createNode("1.11", 11100, "srg")
val mc11002 = createNode("1.10.2", 11002, "srg")
val mc10904 = createNode("1.9.4", 10904, "srg")
val mc10809 = createNode("1.8.9", 10809, "srg")
val mc10800 = createNode("1.8", 10800, "srg")
val mc10710 = createNode("1.7.10", 10710, "srg")
mc26_01_00.link(mc12111, file("versions/mapping-fabric-26.1-1.21.11.txt"))
mc12111.link(mc12110, file("versions/mapping-fabric-1.21.11-1.21.10.txt"))
mc12110.link(mc12107, file("versions/mapping-fabric-1.21.10-1.21.7.txt"))
mc12107.link(mc12105)
mc12105.link(mc12104, file("versions/mapping-fabric-1.21.5-1.21.4.txt"))
mc12104.link(mc12102)
mc12102.link(mc12100)
mc12100.link(mc12006)
mc12006.link(mc12004)
mc12004.link(mc12002, file("versions/mapping-fabric-1.20.4-1.20.2.txt"))
mc12002.link(mc12001)
mc12001.link(mc11904, file("versions/mapping-fabric-1.20.1-1.19.4.txt"))
mc11904.link(mc11903, file("versions/mapping-fabric-1.19.4-1.19.3.txt"))
mc11903.link(mc11902, file("versions/mapping-fabric-1.19.3-1.19.2.txt"))
mc11902.link(mc11901)
mc11901.link(mc11900)
mc11900.link(mc11802)
mc11802.link(mc11801)
mc11801.link(mc11701, file("versions/mapping-fabric-1.18.1-1.17.1.txt"))
mc11701.link(mc11604, file("versions/mapping-fabric-1.17.1-1.16.4.txt"))
mc11604.link(mc11601)
mc11601.link(mc11502)
mc11502.link(mc11404, file("versions/mapping-fabric-1.15.2-1.14.4.txt"))
mc11404.link(mc11404Forge)
mc11404Forge.link(mc11202, file("versions/mapping-forge-1.14.4-1.12.2.txt"))
mc11202.link(mc11201)
mc11201.link(mc11200)
mc11200.link(mc11102)
mc11102.link(mc11100)
mc11100.link(mc11002)
mc11002.link(mc10904)
mc10904.link(mc10809, file("versions/mapping-forge-1.9.4-1.8.9.txt"))
mc10809.link(mc10800, file("versions/mapping-forge-1.8.9-1.8.txt"))
mc10800.link(mc10710, file("versions/mapping-forge-1.8-1.7.10.txt"))
}

View File

@@ -1,5 +0,0 @@
if (System.getenv('REPRODUCIBLE_BUILD') == '1') {
rootProject.buildFileName = 'gradle/reprod/tmp/build.gradle'
} else {
include 'ReplayStudio'
}

112
settings.gradle.kts Normal file
View File

@@ -0,0 +1,112 @@
pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
mavenCentral()
google()
maven("https://jitpack.io")
maven("https://maven.fabricmc.net")
maven("https://maven.architectury.dev/")
maven("https://maven.minecraftforge.net")
maven("https://repo.essential.gg/repository/maven-public")
}
plugins {
id("gg.essential.multi-version.root") version "0.7.0-alpha.4"
id("com.gradleup.shadow") version "9.4.1"
}
}
val jGuiVersions = listOf(
// "1.7.10",
// "1.8",
"1.8.9",
"1.9.4",
"1.12",
"1.14.4-forge",
"1.14.4",
"1.15.2",
"1.16.1",
"1.16.4",
"1.17.1",
"1.18.1",
"1.18.2",
"1.19",
"1.19.1",
"1.19.2",
"1.19.3",
"1.19.4",
"1.20.1",
"1.20.2",
"1.20.4",
"1.20.6",
"1.21",
"1.21.2",
"1.21.4",
"1.21.5",
"1.21.7",
"1.21.10",
"1.21.11",
"26.1",
)
val replayModVersions = listOf(
// "1.7.10",
// "1.8",
"1.8.9",
"1.9.4",
"1.10.2",
"1.11",
"1.11.2",
"1.12",
"1.12.1",
"1.12.2",
"1.14.4-forge",
"1.14.4",
"1.15.2",
"1.16.1",
"1.16.4",
"1.17.1",
"1.18.1",
"1.18.2",
"1.19",
"1.19.1",
"1.19.2",
"1.19.3",
"1.19.4",
"1.20.1",
"1.20.2",
"1.20.4",
"1.20.6",
"1.21",
"1.21.2",
"1.21.4",
"1.21.5",
"1.21.7",
"1.21.10",
"1.21.11",
"26.1",
)
rootProject.buildFileName = "root.gradle.kts"
includeBuild("libs/ReplayStudio")
include(":jGui")
project(":jGui").apply {
projectDir = file("jGui")
buildFileName = "root.gradle.kts"
}
jGuiVersions.forEach { version ->
include(":jGui:$version")
project(":jGui:$version").apply {
projectDir = file("jGui/versions/$version")
buildFileName = "../../build.gradle.kts"
}
}
replayModVersions.forEach { version ->
include(":$version")
project(":$version").apply {
projectDir = file("versions/$version")
buildFileName = "../../build.gradle.kts"
}
}

View File

@@ -299,7 +299,7 @@ public abstract class AbstractTask implements Task {
return;
}
clickNow(button.xPosition + 5, button.yPosition + 5);
clickNow(button.x + 5, button.y + 5);
} catch (IllegalAccessException | NoSuchFieldException e) {
future.setException(e);
}

View File

@@ -36,6 +36,11 @@ public class ReplayModIntegrationTest {
// Make sure the game window doesn't have to remain in focus during the test
mc.gameSettings.pauseOnLostFocus = false;
// Vanilla uses our keys
mc.gameSettings.keyBindAdvancements.setKeyCode(0);
mc.gameSettings.keyBindLoadToolbar.setKeyCode(0);
mc.gameSettings.keyBindSaveToolbar.setKeyCode(0);
runTasks(
new SkipLogin(),
new DownloadOpenEye(),

View File

@@ -10,6 +10,10 @@ import java.nio.file.NoSuchFileException;
public class DownloadOpenEye extends AbstractTask {
@Override
protected void init() {
if ("1".equals(System.getenv("RM_INTEGRATION_TEST_NO_OPENEYE"))) {
runLater(() -> future.set(null));
return;
}
expectGui(OpenEyeExtra.OfferGui.class, offerGui -> {
click(offerGui.yesButton);
expectGuiClosed(20 * 1000, () -> {

View File

@@ -34,7 +34,7 @@ public class SpectatePlayer extends AbstractTask {
future.setException(new TimeoutException("Camera hasn't stopped spectating."));
return;
}
if (mc.getRenderViewEntity() == mc.thePlayer) {
if (mc.getRenderViewEntity() == mc.player) {
future.set(null);
}
}

View File

@@ -1,39 +1,37 @@
package com.replaymod.compat;
import com.replaymod.compat.bettersprinting.DisableBetterSprinting;
import com.replaymod.compat.optifine.DisableFastRender;
import com.replaymod.compat.oranges17animations.HideInvisibleEntities;
import com.replaymod.compat.shaders.ShaderBeginRender;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus;
import com.replaymod.core.Module;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Mod(modid = ReplayModCompat.MOD_ID,
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
clientSideOnly = true,
useMetadata = true)
public class ReplayModCompat {
public static final String MOD_ID = "replaymod-compat";
//#if MC<11400
//$$ import com.replaymod.compat.oranges17animations.HideInvisibleEntities;
//#endif
public static Logger LOGGER;
//#if MC<11400
//$$ import com.replaymod.compat.bettersprinting.DisableBetterSprinting;
//#endif
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
LOGGER = event.getModLog();
}
//#if MC>=10800
import com.replaymod.compat.shaders.ShaderBeginRender;
//#endif
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
EventBus bus = MinecraftForge.EVENT_BUS;
bus.register(new ShaderBeginRender());
bus.register(new DisableFastRender());
bus.register(new HideInvisibleEntities());
DisableBetterSprinting.register();
public class ReplayModCompat implements Module {
public static Logger LOGGER = LogManager.getLogger();
@Override
public void initClient() {
//#if MC>=10800
new ShaderBeginRender().register();
//#endif
new DisableFastRender().register();
//#if MC<11400
//$$ new HideInvisibleEntities().register();
//#endif
//#if MC<11400
//$$ DisableBetterSprinting.register();
//#endif
}
}

View File

@@ -1,108 +1 @@
package com.replaymod.compat.bettersprinting;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.events.ReplayChatMessageEvent;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.PlayerControllerMP;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorldEventListener;
import net.minecraft.world.World;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion;
import net.minecraftforge.fml.common.versioning.Restriction;
import net.minecraftforge.fml.common.versioning.VersionRange;
import javax.annotation.Nullable;
import java.util.Collections;
import static com.replaymod.compat.ReplayModCompat.LOGGER;
/**
* Old Better Sprinting versions replace the vanilla player with their own, overridden instance (replacing the camera entity).
*
* See: https://github.com/chylex/Better-Sprinting/blob/1.8/src/main/java/chylex/bettersprinting/client/player/impl/LogicImplOverride.java
*/
public class DisableBetterSprinting {
private static final VersionRange OLD_VERSION = VersionRange.newRange(null,
Collections.singletonList(new Restriction(null, false, new DefaultArtifactVersion("2.0.0"), false)));
private static final String LOGIC_CLASS_NAME = "chylex.bettersprinting.client.player.impl.LogicImplOverride";
private static final String CONTROLLER_OVERRIDE_CLASS_NAME = LOGIC_CLASS_NAME + "$PlayerControllerMPOverride";
public static void register() {
Loader.instance().getModList().stream()
.filter(mod -> mod.getModId().equalsIgnoreCase("bettersprinting"))
.findFirst()
.map(ModContainer::getProcessedVersion).filter(OLD_VERSION::containsVersion)
.ifPresent($_ -> MinecraftForge.EVENT_BUS.register(new DisableBetterSprinting()));
}
private DisableBetterSprinting() {
LOGGER.info("BetterSprinting workaround enabled");
}
private final Minecraft mc = Minecraft.getMinecraft();
private PlayerControllerMP originalController;
private BetterSprintingWorldAccess worldAccessHook = new BetterSprintingWorldAccess();
@SubscribeEvent(priority = EventPriority.HIGH)
public void beforeGuiOpenEvent(GuiOpenEvent event) {
if (ReplayModReplay.instance.getReplayHandler() != null && mc.theWorld != null) {
// During replay, get ready to revert BetterSprinting's overwritten playerController
originalController = mc.playerController;
mc.theWorld.addEventListener(worldAccessHook);
}
}
@SubscribeEvent(priority = EventPriority.LOW)
public void afterGuiOpenEvent(GuiOpenEvent event) {
if (ReplayModReplay.instance.getReplayHandler() != null && mc.theWorld != null) {
mc.theWorld.addEventListener(worldAccessHook);
}
}
@SubscribeEvent
public void onReplayChatMessage(ReplayChatMessageEvent event) {
// Suppress this message if it's the Better Sprinting warning message
for (StackTraceElement elem : Thread.currentThread().getStackTrace()) {
if (LOGIC_CLASS_NAME.equals(elem.getClassName())) {
LOGGER.info("BetterSprinting warning message suppressed.");
event.setCanceled(true);
return;
}
}
}
private class BetterSprintingWorldAccess implements IWorldEventListener {
@Override
public void onEntityRemoved(Entity entityIn) {
if (mc.playerController != null && mc.playerController.getClass().getName().equals(CONTROLLER_OVERRIDE_CLASS_NAME)) {
// Someone has secretly swapped out the player controller and is about to substitute their own player entity.
// This is the right time to destroy their plan.
LOGGER.info("Preventing player controller {} from being replaced by BetterSprinting with {}.", originalController, mc.playerController);
mc.playerController = originalController;
}
}
@Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {}
@Override public void notifyLightSet(BlockPos pos) {}
@Override public void markBlockRangeForRenderUpdate(int x1, int y1, int z1, int x2, int y2, int z2) {}
@Override public void playSoundToAllNearExcept(@Nullable EntityPlayer player, SoundEvent soundIn, SoundCategory category, double x, double y, double z, float volume, float pitch) {}
@Override public void playRecord(SoundEvent soundIn, BlockPos pos) {}
@Override public void spawnParticle(int p_180442_1_, boolean p_180442_2_, double p_180442_3_, double p_180442_5_, double p_180442_7_, double p_180442_9_, double p_180442_11_, double p_180442_13_, int... p_180442_15_) {}
@Override public void func_190570_a(int p_190570_1_, boolean p_190570_2_, boolean p_190570_3_, double p_190570_4_, double p_190570_6_, double p_190570_8_, double p_190570_10_, double p_190570_12_, double p_190570_14_, int... p_190570_16_) {}
@Override public void onEntityAdded(Entity entityIn) {}
@Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {}
@Override public void playEvent(EntityPlayer player, int type, BlockPos blockPosIn, int data) {}
@Override public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {}
}
}
// 1.12.2 and below

View File

@@ -1,35 +1 @@
package com.replaymod.compat.mapwriter.mixin;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraftforge.fml.common.Loader;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
/**
* Approximately this for <1.12: https://github.com/Vectron/mapwriter/commit/68234520c7a3a0ae8201a085d7e66369900586ac
*/
@Mixin(Minecraft.class)
public abstract class MixinMinecraft {
@Shadow
private ServerData currentServerData;
@Inject(method = "getCurrentServerData", cancellable = true, at = @At("HEAD"))
private void replayModCompat_fixBug96(CallbackInfoReturnable<ServerData> ci) {
if (currentServerData == null
&& (Loader.isModLoaded("mapwriter") || Loader.isModLoaded("MapWriter"))
&& ReplayModReplay.instance.getReplayHandler() != null) {
for (StackTraceElement elem : Thread.currentThread().getStackTrace()) {
if ("mapwriter.util.Utils".equals(elem.getClassName()) && "getWorldName".equals(elem.getMethodName())) {
ci.setReturnValue(new ServerData(null, "replay", false));
return;
}
}
}
}
}
// 1.12.2 and below

View File

@@ -1,34 +1,34 @@
package com.replaymod.compat.optifine;
import com.replaymod.render.events.ReplayRenderEvent;
import net.minecraft.client.Minecraft;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.events.ReplayRenderCallback;
import net.minecraft.client.MinecraftClient;
public class DisableFastRender {
public class DisableFastRender extends EventRegistrations {
private final Minecraft mc = Minecraft.getMinecraft();
private final MinecraftClient mc = MinecraftClient.getInstance();
private boolean wasFastRender = false;
@SubscribeEvent
public void onRenderBegin(ReplayRenderEvent.Pre event) {
if (!FMLClientHandler.instance().hasOptifine()) return;
{ on(ReplayRenderCallback.Pre.EVENT, renderer -> onRenderBegin()); }
private void onRenderBegin() {
if (!MCVer.hasOptifine()) return;
try {
wasFastRender = (boolean) OptifineReflection.gameSettings_ofFastRender.get(mc.gameSettings);
OptifineReflection.gameSettings_ofFastRender.set(mc.gameSettings, false);
wasFastRender = (boolean) OptifineReflection.gameSettings_ofFastRender.get(mc.options);
OptifineReflection.gameSettings_ofFastRender.set(mc.options, false);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@SubscribeEvent
public void onRenderEnd(ReplayRenderEvent.Post event){
if (!FMLClientHandler.instance().hasOptifine()) return;
{ on(ReplayRenderCallback.Post.EVENT, renderer -> onRenderEnd()); }
private void onRenderEnd() {
if (!MCVer.hasOptifine()) return;
try {
OptifineReflection.gameSettings_ofFastRender.set(mc.gameSettings, wasFastRender);
OptifineReflection.gameSettings_ofFastRender.set(mc.options, wasFastRender);
} catch (IllegalAccessException e) {
e.printStackTrace();
}

View File

@@ -1,8 +1,9 @@
package com.replaymod.compat.optifine;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.client.options.GameOptions;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class OptifineReflection {
@@ -14,7 +15,7 @@ public class OptifineReflection {
// this throws an ignored ClassNotFoundException if Optifine isn't installed
Class.forName("Config");
gameSettings_ofFastRender = GameSettings.class.getDeclaredField("ofFastRender");
gameSettings_ofFastRender = GameOptions.class.getDeclaredField("ofFastRender");
gameSettings_ofFastRender.setAccessible(true);
} catch (ClassNotFoundException ignore) {
// no optifine installed
@@ -24,4 +25,20 @@ public class OptifineReflection {
}
}
public static void reloadLang() {
try {
Class<?> langClass;
try {
langClass = Class.forName("Lang"); // Pre Optifine 1.12.2 E1
} catch (ClassNotFoundException ignore) {
langClass = Class.forName("net.optifine.Lang"); // Post Optifine 1.12.2 E1
}
langClass.getDeclaredMethod("resourcesReloaded").invoke(null);
} catch (ClassNotFoundException ignore) {
// no optifine installed
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
}
}

View File

@@ -1,28 +1 @@
package com.replaymod.compat.oranges17animations;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
/**
* Orange seems to have copied vast parts of the RendererLivingEntity into their ArmorAnimation class which cancels the RenderLivingEvent.Pre and calls its own code instead.
* This breaks our mixin which assures that, even though the camera is in spectator mode, it cannot see invisible entities.
*
* To fix this issue, we simply cancel the RenderLivingEvent.Pre before it gets to ArmorAnimation if the entity is invisible.
*/
public class HideInvisibleEntities {
private final Minecraft mc = Minecraft.getMinecraft();
private final boolean modLoaded = Loader.isModLoaded("animations");
@SubscribeEvent(priority = EventPriority.HIGH)
public void preRenderLiving(RenderLivingEvent.Pre event) {
if (modLoaded) {
if (mc.thePlayer instanceof CameraEntity && event.getEntity().isInvisible()) {
event.setCanceled(true);
}
}
}
}
// 1.12.2 and below

View File

@@ -1,39 +1,44 @@
//#if MC>=10800
package com.replaymod.compat.shaders;
import com.replaymod.core.events.PreRenderCallback;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.MinecraftClient;
import java.lang.reflect.InvocationTargetException;
public class ShaderBeginRender {
public class ShaderBeginRender extends EventRegistrations {
private final Minecraft mc = Minecraft.getMinecraft();
private final MinecraftClient mc = MinecraftClient.getInstance();
/**
* Invokes Shaders#beginRender when rendering a video,
* as this would usually get called by EntityRenderer#renderWorld,
* which we're not calling during rendering.
*/
@SubscribeEvent
public void onRenderTickStart(TickEvent.RenderTickEvent event) {
if (event.phase != TickEvent.Phase.START) return;
{ on(PreRenderCallback.EVENT, this::onRenderTickStart); }
private void onRenderTickStart() {
if (ShaderReflection.shaders_beginRender == null) return;
if (ShaderReflection.config_isShaders == null) return;
try {
// check if video is being rendered
if (((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler() == null)
if (((EntityRendererHandler.IEntityRenderer) mc.gameRenderer).replayModRender_getHandler() == null)
return;
// check if Shaders are enabled
if (!(boolean) (ShaderReflection.config_isShaders.invoke(null))) return;
ShaderReflection.shaders_beginRender.invoke(null, mc, mc.timer.elapsedPartialTicks, 0);
ShaderReflection.shaders_beginRender.invoke(null, mc,
//#if MC>=11400
mc.gameRenderer.getCamera(),
//#endif
mc.getTickDelta(), 0);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
//#endif

View File

@@ -1,6 +1,11 @@
//#if MC>=10800
package com.replaymod.compat.shaders;
import net.minecraft.client.Minecraft;
import net.minecraft.client.MinecraftClient;
//#if MC>=11400
import net.minecraft.client.render.Camera;
//#endif
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -24,16 +29,23 @@ public class ShaderReflection {
static {
try {
shaders_frameTimeCounter = Class.forName("shadersmod.client.Shaders")
.getDeclaredField("frameTimeCounter");
Class<?> shadersClass;
try {
shadersClass = Class.forName("shadersmod.client.Shaders"); // Pre Optifine 1.12.2 E1
} catch (ClassNotFoundException ignore) {
shadersClass = Class.forName("net.optifine.shaders.Shaders"); // Post Optifine 1.12.2 E1
}
shaders_frameTimeCounter = shadersClass.getDeclaredField("frameTimeCounter");
shaders_frameTimeCounter.setAccessible(true);
shaders_isShadowPass = Class.forName("shadersmod.client.Shaders")
.getDeclaredField("isShadowPass");
shaders_isShadowPass = shadersClass.getDeclaredField("isShadowPass");
shaders_isShadowPass.setAccessible(true);
shaders_beginRender = Class.forName("shadersmod.client.Shaders")
.getDeclaredMethod("beginRender", Minecraft.class, float.class, long.class);
shaders_beginRender = shadersClass.getDeclaredMethod("beginRender", MinecraftClient.class,
//#if MC>=11400
Camera.class,
//#endif
float.class, long.class);
shaders_beginRender.setAccessible(true);
renderGlobal_chunksToUpdateForced = Class.forName("net.minecraft.client.renderer.RenderGlobal")
@@ -51,3 +63,4 @@ public class ShaderReflection {
}
}
}
//#endif

View File

@@ -0,0 +1,32 @@
//#if MC>=11500
package com.replaymod.compat.shaders.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Pseudo
@Mixin(targets = "net/optifine/render/ChunkVisibility", remap = false)
public abstract class MixinChunkVisibility {
@Shadow
private static int counter;
/**
* OF doesn't properly reset the counter when exiting a world.
* It'll only be reset when getMaxChunkY is called which only happens for
* SP worlds (i.e. not in a replay or MP).
* As a result, it may end up in a non-0 state, which will cause isFinished
* to unconditionally return false, therefore unconditionally setting
* needsTerrainUpdate to true on each call to WorldRenderer.setupTerrain,
* therefore unnecessarily consuming resources and live-locking when
* rendering the shader pass.
*/
@Inject(method = "reset", at = @At("HEAD"), remap = false)
private static void replayModCompat_fixImproperReset(CallbackInfo ci) {
MixinChunkVisibility.counter = 0;
}
}
//#endif

View File

@@ -1,18 +1,27 @@
//#if MC>=10800
package com.replaymod.compat.shaders.mixin;
import com.replaymod.compat.shaders.ShaderReflection;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.render.GameRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(EntityRenderer.class)
@Mixin(GameRenderer.class)
public abstract class MixinShaderEntityRenderer {
@Inject(method = "renderWorldPass", at = @At("HEAD"))
//#if MC>=11400
@Inject(method = "renderWorld", at = @At("HEAD"))
//#else
//#if MC>=11400
//$$ @Inject(method = "updateCameraAndRender(FJ)V", at = @At("HEAD"))
//#else
//$$ @Inject(method = "renderWorldPass", at = @At("HEAD"))
//#endif
//#endif
private void replayModCompat_updateShaderFrameTimeCounter(CallbackInfo ignore) {
if (ReplayModReplay.instance.getReplayHandler() == null) return;
if (ShaderReflection.shaders_frameTimeCounter == null) return;
@@ -26,3 +35,4 @@ public abstract class MixinShaderEntityRenderer {
}
}
}
//#endif

View File

@@ -1,28 +1,71 @@
//#if MC>=10800 && MC<11800
package com.replaymod.compat.shaders.mixin;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.chunk.RenderChunk;
import net.minecraft.client.MinecraftClient;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(RenderChunk.class)
//#if MC>=11500
import org.spongepowered.asm.mixin.Shadow;
//#endif
//#if MC>=11500
@Mixin(net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk.class)
//#else
//$$ @Mixin(net.minecraft.client.render.chunk.ChunkRenderer.class)
//#endif
public abstract class MixinShaderRenderChunk {
private final Minecraft mc = Minecraft.getMinecraft();
private final MinecraftClient mc = MinecraftClient.getInstance();
//#if MC>=11500
@Shadow private int rebuildFrame;
@Shadow public abstract boolean shouldBuild();
/**
* So, for some reason OF though it'd be a good idea to drop the `shouldBuild` check from the chunk traversal in
* the setupTerrain method (see the innermost if of the "iteration" profiler section).
* Hint: It's not a good idea. It'll cause chunks to be queued for building which should not be built. And because
* they don't know any better, they'll even re-queue themselves (which looks like a race condition in vanilla
* MC) causing a live-lock when we try to force-build all chunks (or at least it would cause a lockup if it
* wasn't for the vanilla race condition which slowly causes some of the rebuild tasks to get lost over time,
* eventually, potentially all of them).
* This is the most convenient place to re-introduce the check (setRebuildFrame would normally be called right after
* shouldBuild, if it returns true).
*/
@Inject(method = "setRebuildFrame", at = @At("HEAD"), cancellable = true)
private void replayModCompat_OFHaveYouConsideredWhetherThisChunkShouldEvenBeBuilt(int rebuildFrame, CallbackInfoReturnable<Boolean> ci) {
if (this.rebuildFrame == rebuildFrame) {
// want to keep the fast path
ci.setReturnValue(false);
} else if (!this.shouldBuild()) {
// this is the check which OF removed
// So, I think I figured out the reason why optifine applies this change: It's so chunks which are outside
// the server view distance are still rendered if they've previously compiled. The bug still stands but
// fixing it breaks OF's broken feature, so to reduce the impact of our fix, we only apply it during
// rendering where it affects us the most.
if (((EntityRendererHandler.IEntityRenderer) mc.gameRenderer).replayModRender_getHandler() == null) return;
ci.setReturnValue(false);
}
}
//#endif
/**
* Changes the RenderChunk#isPlayerUpdate method that Optifine adds
* to always return true while rendering so no chunks are being added
* to a separate rendering queue
*/
@Inject(method = "isPlayerUpdate", at = @At("HEAD"), cancellable = true)
@Inject(method = "isPlayerUpdate", at = @At("HEAD"), cancellable = true, remap = false)
private void replayModCompat_disableIsPlayerUpdate(CallbackInfoReturnable<Boolean> ci) {
if (((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler() == null) return;
if (((EntityRendererHandler.IEntityRenderer) mc.gameRenderer).replayModRender_getHandler() == null) return;
ci.setReturnValue(true);
}
}
//#endif

View File

@@ -1,40 +0,0 @@
package com.replaymod.compat.shaders.mixin;
import com.replaymod.compat.shaders.ShaderReflection;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(RenderGlobal.class)
public abstract class MixinShaderRenderGlobal {
private final Minecraft mc = Minecraft.getMinecraft();
@Shadow
public boolean displayListEntitiesDirty;
@Inject(method = "setupTerrain", at = @At("HEAD"), cancellable = true)
public void replayModCompat_setupTerrain(Entity viewEntity, double partialTicks, ICamera camera,
int frameCount, boolean playerSpectator, CallbackInfo ci) {
if (((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler() == null) return;
if (ShaderReflection.shaders_isShadowPass == null) return;
// when called by the shadow pass, displayListEntitiesDirty can't be set to false, as no chunk updates
// are being processed. As it's being set to true by ChunkLoadingRenderGlobal#updateChunks, we have to
// set it to false manually to exit the loop imposed by MixinRenderGlobal#replayModRender_setupTerrain.
try {
if ((boolean) ShaderReflection.shaders_isShadowPass.get(null) == true) {
displayListEntitiesDirty = false;
}
} catch (IllegalAccessException ignore) {}
}
}

View File

@@ -0,0 +1 @@
// 1.7.10 and below

View File

@@ -1,20 +1,52 @@
package com.replaymod.compat.shaders.mixin;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraft.client.render.GameRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11600
import net.minecraft.client.render.Camera;
import net.minecraft.client.util.math.MatrixStack;
//#endif
//#if MC>=11400
import com.replaymod.core.events.PreRenderHandCallback;
//#else
//$$ import com.replaymod.core.versions.MCVer;
//$$ import net.minecraftforge.client.ForgeHooksClient;
//#endif
@Pseudo
@Mixin(targets = "shadersmod/client/ShadersRender", remap = false)
@Mixin(targets = {
"shadersmod/client/ShadersRender", // Pre Optifine 1.12.2 E1
"net/optifine/shaders/ShadersRender" // Post Optifine 1.12.2 E1
}, remap = false)
public abstract class MixinShadersRender {
@Inject(method = "renderHand0", at = @At("HEAD"), cancellable = true)
private static void replayModCompat_disableRenderHand0(EntityRenderer er, float partialTicks, int renderPass, CallbackInfo ci) {
if (ForgeHooksClient.renderFirstPersonHand(er.mc.renderGlobal, partialTicks, renderPass)) {
@Inject(method = { "renderHand0", "renderHand1" }, at = @At("HEAD"), cancellable = true, remap = false)
private static void replayModCompat_disableRenderHand0(
GameRenderer er,
//#if MC>=11600
MatrixStack stack,
Camera camera,
//#endif
float partialTicks,
//#if MC<11600
//$$ int renderPass,
//#endif
CallbackInfo ci) {
//#if MC>=11400
if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) {
//#else
//#if MC>=11400
//$$ if (ForgeHooksClient.renderFirstPersonHand(MCVer.getMinecraft().renderGlobal, partialTicks)) {
//#else
//$$ if (ForgeHooksClient.renderFirstPersonHand(MCVer.getMinecraft().renderGlobal, partialTicks, renderPass)) {
//#endif
//#endif
ci.cancel();
}
}

View File

@@ -0,0 +1,18 @@
//#if FABRIC>=1
package com.replaymod.core;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
// Required for ReplayModMMLauncher.
//
// Chain-loading mixin configurations only works when the first class that is loaded doesn't have any mixins which
// target it. The first class would ordinarily be MC's Main but there are valid use cases for targeting it, see
// e.g. https://github.com/ReplayMod/ReplayMod/issues/327
// So, instead of relying on the bad assumption that Main doesn't have any mixins, we'll instead register this
// dummy pre-launch entry point which is practically guaranteed to not have any mixins and gets called before Main.
public class DummyChainLoadEntryPoint implements PreLaunchEntrypoint {
@Override
public void onPreLaunch() {
}
}
//#endif

View File

@@ -2,107 +2,221 @@ package com.replaymod.core;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.lwjgl.input.Keyboard;
import com.replaymod.core.events.PreRenderCallback;
import com.replaymod.core.mixin.KeyBindingAccessor;
import de.johni0702.minecraft.gui.function.KeyInput;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import com.replaymod.core.events.KeyBindingEventCallback;
import com.replaymod.core.events.KeyEventCallback;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.util.crash.CrashReport;
import net.minecraft.util.crash.CrashReportSection;
import net.minecraft.util.crash.CrashException;
//#if FABRIC>=1
import com.replaymod.core.versions.LangResourcePack;
//#if MC>=11600
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
//#else
//$$ import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
//#endif
import net.minecraft.client.util.InputUtil;
import net.minecraft.util.Identifier;
import static com.replaymod.core.ReplayMod.MOD_ID;
import static de.johni0702.minecraft.gui.versions.MCVer.identifier;
//#else
//$$ import net.minecraftforge.fml.client.registry.ClientRegistry;
//#endif
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
public class KeyBindingRegistry {
private Map<String, KeyBinding> keyBindings = new HashMap<String, KeyBinding>();
private Multimap<KeyBinding, Runnable> keyBindingHandlers = ArrayListMultimap.create();
private Multimap<KeyBinding, Runnable> repeatedKeyBindingHandlers = ArrayListMultimap.create();
private Multimap<Integer, Runnable> rawHandlers = ArrayListMultimap.create();
public class KeyBindingRegistry extends EventRegistrations {
//#if MC>=12109
//$$ private static final KeyBinding.Category CATEGORY = KeyBinding.Category.create(identifier(MOD_ID, "general"));
//#else
private static final String CATEGORY = "replaymod.title";
//#if FABRIC>=1 && MC<11600
//$$ static { net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.addCategory(CATEGORY); }
//#endif
//#endif
public void registerKeyBinding(String name, int keyCode, Runnable whenPressed) {
keyBindingHandlers.put(registerKeyBinding(name, keyCode), whenPressed);
private final Map<String, Binding> bindings = new HashMap<>();
private Set<KeyBinding> onlyInReplay = new HashSet<>();
private Multimap<Integer, Function<KeyInput, Boolean>> rawHandlers = ArrayListMultimap.create();
public Binding registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
Binding binding = registerKeyBinding(name, keyCode, onlyInRepay);
binding.handlers.add(whenPressed);
return binding;
}
public void registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed) {
repeatedKeyBindingHandlers.put(registerKeyBinding(name, keyCode), whenPressed);
public Binding registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
Binding binding = registerKeyBinding(name, keyCode, onlyInRepay);
binding.repeatedHandlers.add(whenPressed);
return binding;
}
private KeyBinding registerKeyBinding(String name, int keyCode) {
KeyBinding keyBinding = keyBindings.get(name);
if (keyBinding == null) {
keyBinding = new KeyBinding(name, keyCode, "replaymod.title");
keyBindings.put(name, keyBinding);
ClientRegistry.registerKeyBinding(keyBinding);
private Binding registerKeyBinding(String name, int keyCode, boolean onlyInRepay) {
Binding binding = bindings.get(name);
if (binding == null) {
//#if FABRIC>=1
if (keyCode == 0) {
keyCode = -1;
}
Identifier id = identifier(MOD_ID, name.substring(LangResourcePack.LEGACY_KEY_PREFIX.length()));
//#if MC>=11600
String key = String.format("key.%s.%s", id.getNamespace(), id.getPath());
KeyBinding keyBinding = new KeyBinding(key, InputUtil.Type.KEYSYM, keyCode, CATEGORY);
KeyBindingHelper.registerKeyBinding(keyBinding);
//#else
//$$ FabricKeyBinding fabricKeyBinding = FabricKeyBinding.Builder.create(id, InputUtil.Type.KEYSYM, keyCode, CATEGORY).build();
//$$ net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.register(fabricKeyBinding);
//$$ KeyBinding keyBinding = fabricKeyBinding;
//#endif
//#else
//$$ KeyBinding keyBinding = new KeyBinding(name, keyCode, CATEGORY);
//$$ ClientRegistry.registerKeyBinding(keyBinding);
//#endif
binding = new Binding(name, keyBinding);
bindings.put(name, binding);
if (onlyInRepay) {
this.onlyInReplay.add(keyBinding);
}
} else if (!onlyInRepay) {
this.onlyInReplay.remove(binding.keyBinding);
}
return keyBinding;
return binding;
}
public void registerRaw(int keyCode, Runnable whenPressed) {
public void registerRaw(int keyCode, Function<KeyInput, Boolean> whenPressed) {
rawHandlers.put(keyCode, whenPressed);
}
public Map<String, KeyBinding> getKeyBindings() {
return Collections.unmodifiableMap(keyBindings);
public Map<String, Binding> getBindings() {
return Collections.unmodifiableMap(bindings);
}
@SubscribeEvent
public void onKeyInput(InputEvent.KeyInputEvent event) {
handleKeyBindings();
handleRaw();
public Set<KeyBinding> getOnlyInReplay() {
return Collections.unmodifiableSet(onlyInReplay);
}
@SubscribeEvent
public void onTick(TickEvent.RenderTickEvent event) {
if (event.phase != TickEvent.Phase.START) return;
handleRepeatedKeyBindings();
}
{ on(PreRenderCallback.EVENT, this::handleRepeatedKeyBindings); }
public void handleRepeatedKeyBindings() {
for (Map.Entry<KeyBinding, Collection<Runnable>> entry : repeatedKeyBindingHandlers.asMap().entrySet()) {
if (entry.getKey().isKeyDown()) {
invokeKeyBindingHandlers(entry.getKey(), entry.getValue());
for (Binding binding : bindings.values()) {
if (binding.keyBinding.isPressed()) {
invokeKeyBindingHandlers(binding, binding.repeatedHandlers);
}
}
}
public void handleKeyBindings() {
for (Map.Entry<KeyBinding, Collection<Runnable>> entry : keyBindingHandlers.asMap().entrySet()) {
while (entry.getKey().isPressed()) {
invokeKeyBindingHandlers(entry.getKey(), entry.getValue());
{ on(KeyBindingEventCallback.EVENT, this::handleKeyBindings); }
private void handleKeyBindings() {
for (Binding binding : bindings.values()) {
while (binding.keyBinding.wasPressed()) {
invokeKeyBindingHandlers(binding, binding.handlers);
invokeKeyBindingHandlers(binding, binding.repeatedHandlers);
}
}
}
private void invokeKeyBindingHandlers(KeyBinding keyBinding, Collection<Runnable> handlers) {
private void invokeKeyBindingHandlers(Binding binding, Collection<Runnable> handlers) {
for (final Runnable runnable : handlers) {
try {
runnable.run();
} catch (Throwable cause) {
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Key Binding");
CrashReportCategory category = crashReport.makeCategory("Key Binding");
category.addCrashSection("Key Binding", keyBinding);
category.setDetail("Handler", runnable::toString);
throw new ReportedException(crashReport);
CrashReport crashReport = CrashReport.create(cause, "Handling Key Binding");
CrashReportSection category = crashReport.addElement("Key Binding");
category.add("Key Binding", () -> binding.name);
category.add("Handler", runnable::toString);
throw new CrashException(crashReport);
}
}
}
public void handleRaw() {
int keyCode = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
for (final Runnable runnable : rawHandlers.get(keyCode)) {
{ on(KeyEventCallback.EVENT, this::handleRaw); }
private boolean handleRaw(KeyInput keyInput, int action) {
if (action != KeyEventCallback.ACTION_PRESS) return false;
for (final Function<KeyInput, Boolean> handler : rawHandlers.get(keyInput.key)) {
try {
runnable.run();
if (handler.apply(keyInput)) {
return true;
}
} catch (Throwable cause) {
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Raw Key Binding");
CrashReportCategory category = crashReport.makeCategory("Key Binding");
category.addCrashSection("Key Code", keyCode);
category.setDetail("Handler", runnable::toString);
throw new ReportedException(crashReport);
CrashReport crashReport = CrashReport.create(cause, "Handling Raw Key Binding");
CrashReportSection category = crashReport.addElement("Key Binding");
category.add("Key Code", () -> "" + keyInput.key);
category.add("Handler", handler::toString);
throw new CrashException(crashReport);
}
}
return false;
}
public class Binding {
public final String name;
public final KeyBinding keyBinding;
private final List<Runnable> handlers = new ArrayList<>();
private final List<Runnable> repeatedHandlers = new ArrayList<>();
private boolean autoActivation;
private Consumer<Boolean> autoActivationUpdate;
public Binding(String name, KeyBinding keyBinding) {
this.name = name;
this.keyBinding = keyBinding;
}
public String getBoundKey() {
try {
return keyBinding.getBoundKeyLocalizedText().getString();
} catch (ArrayIndexOutOfBoundsException e) {
// Apparently windows likes to press strange keys, see https://www.replaymod.com/forum/thread/55
return "Unknown";
}
}
public boolean isBound() {
//#if MC>=11400
return !keyBinding.isUnbound();
//#else
//$$ return keyBinding.getKeyCode() != 0;
//#endif
}
public void trigger() {
KeyBindingAccessor acc = (KeyBindingAccessor) keyBinding;
acc.setPressTime(acc.getPressTime() + 1);
handleKeyBindings();
}
public void registerAutoActivationSupport(boolean active, Consumer<Boolean> update) {
this.autoActivation = active;
this.autoActivationUpdate = update;
}
public boolean supportsAutoActivation() {
return autoActivationUpdate != null;
}
public boolean isAutoActivating() {
return supportsAutoActivation() && autoActivation;
}
public void setAutoActivating(boolean active) {
if (this.autoActivation == active) {
return;
}
this.autoActivation = active;
this.autoActivationUpdate.accept(active);
}
}
}

71
src/main/java/com/replaymod/core/LoadingPlugin.java Executable file → Normal file
View File

@@ -1,70 +1 @@
package com.replaymod.core;
import net.minecraftforge.fml.relauncher.CoreModManager;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
import org.apache.logging.log4j.LogManager;
import org.spongepowered.asm.launch.MixinBootstrap;
import org.spongepowered.asm.mixin.Mixins;
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.CodeSource;
import java.util.Map;
public class LoadingPlugin implements IFMLLoadingPlugin {
public LoadingPlugin() {
MixinBootstrap.init();
Mixins.addConfiguration("mixins.recording.replaymod.json");
Mixins.addConfiguration("mixins.render.replaymod.json");
Mixins.addConfiguration("mixins.replay.replaymod.json");
Mixins.addConfiguration("mixins.compat.mapwriter.replaymod.json");
Mixins.addConfiguration("mixins.compat.shaders.replaymod.json");
Mixins.addConfiguration("mixins.extras.playeroverview.replaymod.json");
CodeSource codeSource = getClass().getProtectionDomain().getCodeSource();
if (codeSource != null) {
URL location = codeSource.getLocation();
try {
File file = new File(location.toURI());
if (file.isFile()) {
// This forces forge to reexamine the jar file for FML mods
// Should eventually be handled by Mixin itself, maybe?
CoreModManager.getIgnoredMods().remove(file.getName());
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
} else {
LogManager.getLogger().warn("No CodeSource, if this is not a development environment we might run into problems!");
LogManager.getLogger().warn(getClass().getProtectionDomain());
}
}
@Override
public String[] getASMTransformerClass() {
return new String[]{
};
}
@Override
public String getModContainerClass() {
return null;
}
@Override
public String getSetupClass() {
return null;
}
@Override
public void injectData(Map<String, Object> data) {
}
@Override
public String getAccessTransformerClass() {
return null;
}
}
// 1.12.2 and below

View File

@@ -0,0 +1,14 @@
//#if FABRIC>=1
package com.replaymod.core;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
public class MixinExtrasInit implements PreLaunchEntrypoint {
@Override
public void onPreLaunch() {
//#if MC>=11604
com.llamalad7.mixinextras.MixinExtrasBootstrap.init();
//#endif
}
}
//#endif

View File

@@ -0,0 +1,10 @@
package com.replaymod.core;
public interface Module {
// FMLCommonSetupEvent for 1.13+, FMLInitializationEvent below
default void initCommon() {}
// FMLClientSetupEvent for 1.13+, FMLInitializationEvent (if client) below
default void initClient() {}
// FMLClientSetupEvent for 1.13+, FMLInitializationEvent below
default void registerKeyBindings(KeyBindingRegistry registry) {}
}

427
src/main/java/com/replaymod/core/ReplayMod.java Executable file → Normal file
View File

@@ -1,85 +1,116 @@
package com.replaymod.core;
import com.google.common.io.Files;
import com.google.common.util.concurrent.ListenableFutureTask;
import com.replaymod.compat.ReplayModCompat;
import com.replaymod.core.files.ReplayFilesService;
import com.replaymod.core.files.ReplayFoldersService;
import com.replaymod.core.gui.GuiBackgroundProcesses;
import com.replaymod.core.gui.GuiReplaySettings;
import com.replaymod.core.gui.RestoreReplayGui;
import com.replaymod.core.handler.MainMenuHandler;
import com.replaymod.core.utils.OpenGLUtils;
import com.replaymod.core.versions.MCVer;
import com.replaymod.core.versions.scheduler.Scheduler;
import com.replaymod.core.versions.scheduler.SchedulerImpl;
import com.replaymod.editor.ReplayModEditor;
import com.replaymod.extras.ReplayModExtras;
import com.replaymod.recording.ReplayModRecording;
import com.replaymod.render.ReplayModRender;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replaystudio.lib.viaversion.api.protocol.version.ProtocolVersion;
import com.replaymod.replaystudio.studio.ReplayStudio;
import com.replaymod.replaystudio.util.I18n;
import de.johni0702.minecraft.gui.container.GuiScreen;
import lombok.Getter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.*;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventBus;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.apache.commons.io.FileUtils;
import com.replaymod.simplepathing.ReplayModSimplePathing;
import net.minecraft.client.MinecraftClient;
import net.minecraft.resource.DirectoryResourcePack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Style;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
@Mod(modid = ReplayMod.MOD_ID,
useMetadata = true,
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
clientSideOnly = true,
updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json",
guiFactory = "com.replaymod.core.gui.GuiFactory")
public class ReplayMod {
import static de.johni0702.minecraft.gui.versions.MCVer.identifier;
public static ModContainer getContainer() {
return Loader.instance().getIndexedModList().get(MOD_ID);
}
//#if MC>=12006
//$$ import net.minecraft.resource.ResourcePackInfo;
//$$ import net.minecraft.resource.ResourcePackSource;
//$$ import net.minecraft.text.Text;
//$$ import java.util.Optional;
//#endif
@Getter(lazy = true)
private static final String minecraftVersion = parseMinecraftVersion();
private static String parseMinecraftVersion() {
CrashReport crashReport = new CrashReport("", new Throwable());
@SuppressWarnings("unchecked")
List<CrashReportCategory.Entry> list = crashReport.getCategory().children;
for (CrashReportCategory.Entry entry : list) {
if ("Minecraft Version".equals(entry.getKey())) {
return entry.getValue();
}
}
return "Unknown";
}
//#if MC>=11900
//#else
import net.minecraft.client.options.Option;
//#endif
public class ReplayMod implements Module, Scheduler {
public static final String MOD_ID = "replaymod";
public static final ResourceLocation TEXTURE = new ResourceLocation("replaymod", "replay_gui.png");
public static final Identifier TEXTURE = identifier("replaymod", "replay_gui.png");
public static final int TEXTURE_SIZE = 256;
public static final Identifier LOGO_FAVICON = identifier("replaymod", "favicon_logo.png");
private static final Minecraft mc = Minecraft.getMinecraft();
@Deprecated
public static Configuration config;
private static final MinecraftClient mc = MCVer.getMinecraft();
private final ReplayModBackend backend;
private final SchedulerImpl scheduler = new SchedulerImpl();
private final KeyBindingRegistry keyBindingRegistry = new KeyBindingRegistry();
private final SettingsRegistry settingsRegistry = new SettingsRegistry();
{
settingsRegistry.register(Setting.class);
}
// The instance of your mod that Forge uses.
@Instance(MOD_ID)
{ instance = this; }
public static ReplayMod instance;
private final List<Module> modules = new ArrayList<>();
private final GuiBackgroundProcesses backgroundProcesses = new GuiBackgroundProcesses();
public final ReplayFoldersService folders = new ReplayFoldersService(settingsRegistry);
public final ReplayFilesService files = new ReplayFilesService(folders);
/**
* Whether the current MC version is supported by the embedded ReplayStudio version.
* If this is not the case (i.e. if this is variable true), any feature of the RM which depends on the ReplayStudio
* lib will be disabled.
*
* Only supported on Fabric builds, i.e. will always be false / crash the game with Forge/pre-1.14 builds.
* (specifically the code below and MCVer#getProtocolVersion make this assumption)
*/
private boolean minimalMode;
public ReplayMod(ReplayModBackend backend) {
this.backend = backend;
I18n.setI18n(net.minecraft.client.resource.language.I18n::translate);
// Check Minecraft protocol version for compatibility
if (!ProtocolVersion.isRegistered(MCVer.getProtocolVersion()) && !Boolean.parseBoolean(System.getProperty("replaymod.skipversioncheck", "false"))) {
minimalMode = true;
}
// Register all RM modules
modules.add(this);
modules.add(new ReplayModRecording(this));
ReplayModReplay replayModule = new ReplayModReplay(this);
modules.add(replayModule);
modules.add(new ReplayModRender(this));
modules.add(new ReplayModSimplePathing(this));
modules.add(new ReplayModEditor(this));
modules.add(new ReplayModExtras(this));
modules.add(new ReplayModCompat());
settingsRegistry.register();
}
public KeyBindingRegistry getKeyBindingRegistry() {
return keyBindingRegistry;
}
@@ -88,126 +119,133 @@ public class ReplayMod {
return settingsRegistry;
}
public File getReplayFolder() throws IOException {
String path = getSettingsRegistry().get(Setting.RECORDING_PATH);
File folder = new File(path.startsWith("./") ? getMinecraft().mcDataDir : null, path);
FileUtils.forceMkdir(folder);
return folder;
}
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
// Initialize the static OpenGL info field from the minecraft main thread
// Unfortunately lwjgl uses static methods so we have to make use of magic init calls as well
OpenGLUtils.init();
I18n.setI18n(net.minecraft.client.resources.I18n::format);
config = new Configuration(event.getSuggestedConfigurationFile());
config.load();
settingsRegistry.setConfiguration(config);
}
@EventHandler
public void init(FMLInitializationEvent event) {
getSettingsRegistry().register(Setting.class);
new MainMenuHandler().register();
MinecraftForge.EVENT_BUS.register(keyBindingRegistry);
getKeyBindingRegistry().registerKeyBinding("replaymod.input.settings", 0, () -> {
new GuiReplaySettings(null, settingsRegistry).display();
});
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) throws IOException {
settingsRegistry.save(); // Save default values to disk
if(!FMLClientHandler.instance().hasOptifine())
GameSettings.Options.RENDER_DISTANCE.setValueMax(64f);
testIfMoeshAndExitMinecraft();
runLater(() -> {
// Cleanup deleted corrupted replays
try {
File[] files = getReplayFolder().listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory() && file.getName().endsWith(".mcpr.del")) {
if (file.lastModified() + 2 * 24 * 60 * 60 * 1000 < System.currentTimeMillis()) {
FileUtils.deleteDirectory(file);
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
public static final DirectoryResourcePack jGuiResourcePack = createJGuiResourcePack();
public static final String JGUI_RESOURCE_PACK_NAME = "replaymod_jgui";
private static DirectoryResourcePack createJGuiResourcePack() {
File folder = new File("../jGui/src/main/resources");
if (!folder.exists()) {
folder = new File("../../../jGui/src/main/resources");
if (!folder.exists()) {
return null;
}
// Restore corrupted replays
try {
File[] files = getReplayFolder().listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory() && file.getName().endsWith(".mcpr.tmp")) {
File origFile = new File(file.getParentFile(), Files.getNameWithoutExtension(file.getName()));
new RestoreReplayGui(GuiScreen.wrap(mc.currentScreen), origFile).display();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
});
}
/**
* Set when the currently running code has been scheduled by runLater.
* If this is the case, subsequent calls to runLater have to be delayed until all scheduled tasks have been
* processed, otherwise a livelock may occur.
*/
private boolean inRunLater = false;
public void runLater(Runnable runnable) {
if (mc.isCallingFromMinecraftThread() && inRunLater) {
EventBus bus = MinecraftForge.EVENT_BUS;
bus.register(new Object() {
@SubscribeEvent
public void onRenderTick(TickEvent.RenderTickEvent event) {
if (event.phase == TickEvent.Phase.START) {
runLater(runnable);
bus.unregister(this);
}
}
});
return;
}
synchronized (mc.scheduledTasks) {
mc.scheduledTasks.add(ListenableFutureTask.create(() -> {
inRunLater = true;
//#if MC>=12006
//$$ return new DirectoryResourcePack(new ResourcePackInfo(JGUI_RESOURCE_PACK_NAME, Text.literal("jGui"), ResourcePackSource.NONE, Optional.empty()), folder.toPath()) {
//#elseif MC>=11903
//$$ return new DirectoryResourcePack(JGUI_RESOURCE_PACK_NAME, folder.toPath(), true) {
//#else
return new DirectoryResourcePack(folder) {
//#endif
@Override
//#if MC>=11400
public String getName() {
//#else
//$$ public String getPackName() {
//#endif
return JGUI_RESOURCE_PACK_NAME;
}
//#if MC>=11903
//$$ @Override
//$$ public net.minecraft.resource.InputSupplier<InputStream> openRoot(String... segments) {
//$$ if (segments.length == 1 && segments[0].equals("pack.mcmeta")) {
//$$ return () -> new ByteArrayInputStream(generatePackMeta());
//$$ }
//$$ return super.openRoot(segments);
//$$ }
//#else
@Override
protected InputStream openFile(String resourceName) throws IOException {
try {
runnable.run();
} finally {
inRunLater = false;
return super.openFile(resourceName);
} catch (IOException e) {
if ("pack.mcmeta".equals(resourceName)) {
return new ByteArrayInputStream(generatePackMeta());
}
throw e;
}
}, null));
}
//#endif
private byte[] generatePackMeta() {
//#if MC>=11400
int version = 4;
//#else
//$$ int version = 1;
//#endif
return ("{\"pack\": {\"description\": \"dummy pack for jGui resources in dev-env\", \"pack_format\": "
+ version + "}}").getBytes(StandardCharsets.UTF_8);
}
};
}
void initModules() {
modules.forEach(Module::initCommon);
modules.forEach(Module::initClient);
modules.forEach(m -> m.registerKeyBindings(keyBindingRegistry));
}
@Override
public void registerKeyBindings(KeyBindingRegistry registry) {
registry.registerKeyBinding("replaymod.input.settings", 0, () -> {
new GuiReplaySettings(null, settingsRegistry).display();
}, false);
}
@Override
public void initClient() {
backgroundProcesses.register();
keyBindingRegistry.register();
// 1.7.10 crashes when render distance > 16
// Post 1.19 this has become non-trivial to do, install Sodium+Bobby or OptiFine if you need it
//#if MC>=10800 && MC<11900
if (!MCVer.hasOptifine()) {
Option.RENDER_DISTANCE.setMax(64f);
}
//#endif
runPostStartup(() -> files.initialScan(this));
}
@Override
public void runSync(Runnable runnable) throws InterruptedException, ExecutionException, TimeoutException {
scheduler.runSync(runnable);
}
@Override
public void runPostStartup(Runnable runnable) {
scheduler.runPostStartup(runnable);
}
@Override
public void runLaterWithoutLock(Runnable runnable) {
scheduler.runLaterWithoutLock(runnable);
}
@Override
public void runLater(Runnable runnable) {
scheduler.runLater(runnable);
}
@Override
public void runTasks() {
scheduler.runTasks();
}
public String getVersion() {
return getContainer().getVersion();
return backend.getVersion();
}
private void testIfMoeshAndExitMinecraft() {
if("currentPlayer".equals("Moesh")) {
System.exit(-1);
}
public String getMinecraftVersion() {
return backend.getMinecraftVersion();
}
public Minecraft getMinecraft() {
public boolean isModLoaded(String id) {
return backend.isModLoaded(id);
}
public MinecraftClient getMinecraft() {
return mc;
}
@@ -220,18 +258,55 @@ public class ReplayMod {
}
private void printToChat(boolean warning, String message, Object... args) {
if (!mc.isOnThread()) {
runLater(() -> printToChat(warning, message, args));
return;
}
if (getSettingsRegistry().get(Setting.NOTIFICATIONS)) {
// Some nostalgia: "§8[§6Replay Mod§8]§r Your message goes here"
Style coloredDarkGray = new Style().setColor(TextFormatting.DARK_GRAY);
Style coloredGold = new Style().setColor(TextFormatting.GOLD);
ITextComponent text = new TextComponentString("[").setStyle(coloredDarkGray)
.appendSibling(new TextComponentTranslation("replaymod.title").setStyle(coloredGold))
.appendSibling(new TextComponentString("] "))
.appendSibling(new TextComponentTranslation(message, args).setStyle(new Style()
.setColor(warning ? TextFormatting.RED : TextFormatting.DARK_GREEN)));
//#if MC>=10904
//#if MC>=11600
Style coloredDarkGray = Style.EMPTY.withColor(Formatting.DARK_GRAY);
Style coloredGold = Style.EMPTY.withColor(Formatting.GOLD);
Style alert = Style.EMPTY.withColor(warning ? Formatting.RED : Formatting.DARK_GREEN);
//#else
//$$ Style coloredDarkGray = new Style().setColor(Formatting.DARK_GRAY);
//$$ Style coloredGold = new Style().setColor(Formatting.GOLD);
//$$ Style alert = new Style().setColor(warning ? Formatting.RED : Formatting.DARK_GREEN);
//#endif
Text text = new LiteralText("[").setStyle(coloredDarkGray)
.append(new TranslatableText("replaymod.title").setStyle(coloredGold))
.append(new LiteralText("] "))
.append(new TranslatableText(message, args).setStyle(alert));
//#else
//$$ ChatStyle coloredDarkGray = new ChatStyle().setColor(EnumChatFormatting.DARK_GRAY);
//$$ ChatStyle coloredGold = new ChatStyle().setColor(EnumChatFormatting.GOLD);
//$$ IChatComponent text = new ChatComponentText("[").setChatStyle(coloredDarkGray)
//$$ .appendSibling(new ChatComponentTranslation("replaymod.title").setChatStyle(coloredGold))
//$$ .appendSibling(new ChatComponentText("] "))
//$$ .appendSibling(new ChatComponentTranslation(message, args).setChatStyle(new ChatStyle()
//$$ .setColor(warning ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GREEN)));
//#endif
// Send message to chat GUI
// The ingame GUI is initialized at startup, therefore this is possible before the client is connected
mc.ingameGUI.getChatGUI().printChatMessage(text);
mc.inGameHud.getChatHud().addMessage(text);
}
}
public GuiBackgroundProcesses getBackgroundProcesses() {
return backgroundProcesses;
}
// This method is static because it depends solely on the environment, not on the actual RM instance.
public static boolean isMinimalMode() {
return ReplayMod.instance.minimalMode;
}
public static boolean isCompatible(int fileFormatVersion, int protocolVersion) {
if (isMinimalMode()) {
return protocolVersion == MCVer.getProtocolVersion();
} else {
return new ReplayStudio().isCompatible(fileFormatVersion, protocolVersion, MCVer.getProtocolVersion());
}
}
}

View File

@@ -0,0 +1,34 @@
package com.replaymod.core;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.SharedConstants;
import static com.replaymod.core.ReplayMod.MOD_ID;
public class ReplayModBackend implements ClientModInitializer {
private final ReplayMod mod = new ReplayMod(this);
@Override
public void onInitializeClient() {
mod.initModules();
}
public String getVersion() {
return FabricLoader.getInstance().getModContainer(MOD_ID)
.orElseThrow(IllegalStateException::new)
.getMetadata().getVersion().toString();
}
public String getMinecraftVersion() {
//#if MC>=12106
//$$ return SharedConstants.getGameVersion().comp_4025();
//#else
return SharedConstants.getGameVersion().getName();
//#endif
}
public boolean isModLoaded(String id) {
return FabricLoader.getInstance().isModLoaded(id.toLowerCase());
}
}

View File

@@ -0,0 +1,31 @@
//#if FABRIC>=1
package com.replaymod.core;
import org.spongepowered.asm.mixin.Mixins;
// We need to wait for MM to call us, otherwise we might initialize our mixins before it calls optifabric which would
// result in OF classes not existing while our mixins get resolved.
public class ReplayModMMLauncher implements Runnable {
private static boolean ran;
@Override
public void run() {
// If this is MM2, then we're currently getting called because of our entrypoint declaration.
// For backwards compatibility with MM1, we also declare our early_riser via custom metadata and MM2 supports
// that as well and will therefore call us twice.
if (ran) {
return;
}
ran = true;
Mixins.addConfiguration("mixins.compat.mapwriter.replaymod.json");
Mixins.addConfiguration("mixins.compat.shaders.replaymod.json");
Mixins.addConfiguration("mixins.core.replaymod.json");
Mixins.addConfiguration("mixins.extras.playeroverview.replaymod.json");
Mixins.addConfiguration("mixins.recording.replaymod.json");
Mixins.addConfiguration("mixins.render.blend.replaymod.json");
Mixins.addConfiguration("mixins.render.replaymod.json");
Mixins.addConfiguration("mixins.replay.replaymod.json");
}
}
//#endif

View File

@@ -0,0 +1,96 @@
package com.replaymod.core;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import java.io.IOException;
import java.util.List;
import java.util.Set;
//#if FABRIC
import net.fabricmc.loader.api.FabricLoader;
//#endif
//#if MC>=11400
import java.io.InputStream;
//#else
//$$ import net.minecraft.launchwrapper.Launch;
//#endif
//#if MC>=11200
import org.objectweb.asm.tree.ClassNode;
//#else
//$$ import org.spongepowered.asm.lib.tree.ClassNode;
//#endif
public class ReplayModMixinConfigPlugin implements IMixinConfigPlugin {
static boolean hasClass(String name) throws IOException {
//#if MC>=11400
InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(name.replace('.', '/') + ".class");
if (stream != null) stream.close();
return stream != null;
//#else
//$$ return Launch.classLoader.getClassBytes(name) != null;
//#endif
}
private final Logger logger = LogManager.getLogger("replaymod/mixin");
private final boolean hasOF = hasClass("optifine.OptiFineForgeTweaker") || hasClass("me.modmuss50.optifabric.mod.Optifabric");
//#if FABRIC
private final boolean hasIris = FabricLoader.getInstance().isModLoaded("iris");
//#endif
{
logger.debug("hasOF: " + hasOF);
}
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
if (hasOF) {
//#if MC>=11500
// OF renames the lambda method name and I see no way we can target it now, so we give up on that patch
if (mixinClassName.endsWith("MixinTileEntityEndPortalRenderer")) return false;
//#endif
}
if (mixinClassName.endsWith("_OF")) return hasOF;
if (mixinClassName.endsWith("_NoOF")) return !hasOF;
//#if FABRIC
if (mixinClassName.endsWith("_Iris")) return hasIris;
//#endif
return true;
}
@Override
public void onLoad(String mixinPackage) {
}
@Override
public String getRefMapperConfig() {
return null;
}
@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
}
@Override
public List<String> getMixins() {
return null;
}
@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
public ReplayModMixinConfigPlugin() throws IOException {
}
}

View File

@@ -0,0 +1,62 @@
//#if FABRIC>=1
package com.replaymod.core;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import java.io.IOException;
import java.util.List;
import java.util.Set;
// See ReplayModMMLauncher. This is the fallback if MM is not installed.
public class ReplayModNonMMLauncher implements IMixinConfigPlugin {
private final Logger logger = LogManager.getLogger("replaymod/nonmm");
@Override
public void onLoad(String mixinPackage) {
}
@Override
public String getRefMapperConfig() {
return null;
}
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
return false;
}
@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
}
@Override
public List<String> getMixins() {
try {
if (ReplayModMixinConfigPlugin.hasClass("com.chocohead.mm.Plugin")) {
logger.debug("Detected MM, they should call us...");
} else {
logger.debug("Did not detect MM, initializing ourselves...");
new ReplayModMMLauncher().run();
}
return null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
}
//#endif

View File

@@ -3,6 +3,7 @@ package com.replaymod.core;
public final class Setting<T> extends SettingsRegistry.SettingKeys<T> {
public static final Setting<Boolean> NOTIFICATIONS = make("notifications", "notifications", true);
public static final Setting<String> RECORDING_PATH = advanced("recordingPath", null, "./replay_recordings/");
public static final Setting<String> CACHE_PATH = advanced("cachePath", null, "./.replay_cache/");
private static <T> Setting<T> make(String key, String displayName, T defaultValue) {
return new Setting<>("core", key, displayName, defaultValue);

View File

@@ -1,28 +1,17 @@
package com.replaymod.core;
import com.replaymod.core.events.SettingsChangedEvent;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
import com.replaymod.core.events.SettingsChangedCallback;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class SettingsRegistry {
private static final Object NULL_OBJECT = new Object();
private Map<SettingKey<?>, Object> settings = new ConcurrentHashMap<>();
private Configuration configuration;
private final Map<SettingKey<?>, Object> settings = Collections.synchronizedMap(new LinkedHashMap<>());
final SettingsRegistryBackend backend = new SettingsRegistryBackend(settings);
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
List<SettingKey<?>> keys = new ArrayList<>(settings.keySet());
settings.clear();
for (SettingKey key : keys) {
register(key);
}
public void register() {
backend.register();
}
public void register(Class<?> settingsClass) {
@@ -39,23 +28,8 @@ public class SettingsRegistry {
}
public void register(SettingKey<?> key) {
Object value;
if (configuration != null) {
if (key.getDefault() instanceof Boolean) {
value = configuration.get(key.getCategory(), key.getKey(), (Boolean) key.getDefault()).getBoolean();
} else if (key.getDefault() instanceof Integer) {
value = configuration.get(key.getCategory(), key.getKey(), (Integer) key.getDefault()).getInt();
} else if (key.getDefault() instanceof Double) {
value = configuration.get(key.getCategory(), key.getKey(), (Double) key.getDefault()).getDouble();
} else if (key.getDefault() instanceof String) {
value = configuration.get(key.getCategory(), key.getKey(), (String) key.getDefault()).getString();
} else {
throw new IllegalArgumentException("Default type " + key.getDefault().getClass() + " not supported.");
}
} else {
value = NULL_OBJECT;
}
settings.put(key, value);
settings.put(key, key.getDefault());
backend.register(key);
}
public Set<SettingKey<?>> getSettings() {
@@ -71,23 +45,13 @@ public class SettingsRegistry {
}
public <T> void set(SettingKey<T> key, T value) {
if (key.getDefault() instanceof Boolean) {
configuration.get(key.getCategory(), key.getKey(), (Boolean) key.getDefault()).set((Boolean) value);
} else if (key.getDefault() instanceof Integer) {
configuration.get(key.getCategory(), key.getKey(), (Integer) key.getDefault()).set((Integer) value);
} else if (key.getDefault() instanceof Double) {
configuration.get(key.getCategory(), key.getKey(), (Double) key.getDefault()).set((Double) value);
} else if (key.getDefault() instanceof String) {
configuration.get(key.getCategory(), key.getKey(), (String) key.getDefault()).set((String) value);
} else {
throw new IllegalArgumentException("Default type " + key.getDefault().getClass() + " not supported.");
}
backend.update(key, value);
settings.put(key, value);
MinecraftForge.EVENT_BUS.post(new SettingsChangedEvent(this, key));
SettingsChangedCallback.EVENT.invoker().onSettingsChanged(this, key);
}
public void save() {
configuration.save();
backend.save();
}
public interface SettingKey<T> {
@@ -126,7 +90,7 @@ public class SettingsRegistry {
@Override
public String getDisplayString() {
return displayString == null ? null : I18n.format(displayString);
return displayString;
}
@Override

View File

@@ -0,0 +1,189 @@
package com.replaymod.core;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.replaymod.core.events.SettingsChangedCallback;
import net.minecraft.client.MinecraftClient;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
import java.util.Map;
import static com.replaymod.core.utils.Utils.ensureDirectoryExists;
import static com.replaymod.core.versions.MCVer.getMinecraft;
class SettingsRegistryBackend {
private static final Logger LOGGER = LogManager.getLogger();
private final Map<SettingsRegistry.SettingKey<?>, Object> settings;
private final Path configFile = getMinecraft().runDirectory.toPath().resolve("config/replaymod.json");
SettingsRegistryBackend(Map<SettingsRegistry.SettingKey<?>, Object> settings) {
this.settings = settings;
}
public void register() {
load(true);
try {
registerWatcher();
} catch (IOException e) {
LOGGER.warn("Failed to setup file watcher for {}, live-reloading is disabled. Cause: {}", configFile, e);
}
}
private void load(boolean createIfMissingOrBroken) {
String config;
if (Files.exists(configFile)) {
try {
config = new String(Files.readAllBytes(configFile), StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
return;
}
} else {
if (createIfMissingOrBroken) {
save();
}
return;
}
Gson gson = new Gson();
JsonObject root = gson.fromJson(config, JsonObject.class);
if (root == null) {
LOGGER.error("Config file {} appears corrupted: {}", configFile, config);
if (createIfMissingOrBroken) {
save();
}
return;
}
for (Map.Entry<SettingsRegistry.SettingKey<?>, Object> entry : settings.entrySet()) {
SettingsRegistry.SettingKey<?> key = entry.getKey();
JsonElement category = root.get(key.getCategory());
if (category != null && category.isJsonObject()) {
JsonElement valueElem = category.getAsJsonObject().get(key.getKey());
if (valueElem == null || !valueElem.isJsonPrimitive()) continue;
JsonPrimitive value = valueElem.getAsJsonPrimitive();
if (key.getDefault() instanceof Boolean && value.isBoolean()) {
entry.setValue(value.getAsBoolean());
}
if (key.getDefault() instanceof Integer && value.isNumber()) {
entry.setValue(value.getAsNumber().intValue());
}
if (key.getDefault() instanceof Double && value.isNumber()) {
entry.setValue(value.getAsNumber().doubleValue());
}
if (key.getDefault() instanceof String && value.isString()) {
String valueStr = value.getAsString();
if (entry instanceof SettingsRegistry.MultipleChoiceSettingKey) {
@SuppressWarnings("unchecked")
List<String> choices = ((SettingsRegistry.MultipleChoiceSettingKey<String>) entry).getChoices();
if (choices.stream().noneMatch(valueStr::equals)) {
continue;
}
}
entry.setValue(valueStr);
}
}
}
}
private void registerWatcher() throws IOException {
WatchService watchService = configFile.getFileSystem().newWatchService();
configFile.getParent().register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY);
Thread thread = new Thread(() -> {
while (true) {
WatchKey nextKey;
try {
nextKey = watchService.take();
} catch (InterruptedException e) {
return;
}
for (WatchEvent<?> event : nextKey.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
if (kind == StandardWatchEventKinds.OVERFLOW) {
continue;
}
Path fileName = ((Path) event.context());
if (fileName.equals(configFile.getFileName())) {
MinecraftClient.getInstance().send(this::reload);
}
}
if (!nextKey.reset()) {
return;
}
}
});
thread.setName("replaymod-config-watcher");
thread.setDaemon(true);
thread.start();
}
private void reload() {
load(false);
SettingsRegistry settingsRegistry = ReplayMod.instance.getSettingsRegistry();
for (SettingsRegistry.SettingKey<?> key : settings.keySet()) {
SettingsChangedCallback.EVENT.invoker().onSettingsChanged(settingsRegistry, key);
}
}
@SuppressWarnings("unused")
public void register(SettingsRegistry.SettingKey<?> key) {
}
@SuppressWarnings("unused")
public <T> void update(SettingsRegistry.SettingKey<T> key, T value) {
}
public void save() {
JsonObject root = new JsonObject();
for (Map.Entry<SettingsRegistry.SettingKey<?>, Object> entry : settings.entrySet()) {
SettingsRegistry.SettingKey<?> key = entry.getKey();
JsonObject category = root.getAsJsonObject(key.getCategory());
if (category == null) {
category = new JsonObject();
root.add(key.getCategory(), category);
}
Object value = entry.getValue();
if (value instanceof Boolean) {
category.addProperty(key.getKey(), (Boolean) value);
}
if (value instanceof Number) {
category.addProperty(key.getKey(), (Number) value);
}
if (value instanceof String) {
category.addProperty(key.getKey(), (String) value);
if (key instanceof SettingsRegistry.MultipleChoiceSettingKey) {
@SuppressWarnings("unchecked")
List<String> choices = ((SettingsRegistry.MultipleChoiceSettingKey<String>) key).getChoices();
JsonArray array = new JsonArray();
for (String choice : choices) {
array.add(choice);
}
category.add(key.getKey() + "_valid_values", array);
}
}
}
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String config = gson.toJson(root);
try {
ensureDirectoryExists(configFile.getParent());
Files.write(configFile, config.getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1 @@
// 1.7.10 and below

View File

@@ -0,0 +1 @@
// 1.7.10 and below

View File

@@ -0,0 +1,15 @@
package com.replaymod.core.events;
import de.johni0702.minecraft.gui.utils.Event;
public interface KeyBindingEventCallback {
Event<KeyBindingEventCallback> EVENT = Event.create((listeners) ->
() -> {
for (KeyBindingEventCallback listener : listeners) {
listener.onKeybindingEvent();
}
}
);
void onKeybindingEvent();
}

View File

@@ -0,0 +1,27 @@
package com.replaymod.core.events;
import de.johni0702.minecraft.gui.function.KeyInput;
import de.johni0702.minecraft.gui.utils.Event;
public interface KeyEventCallback {
Event<KeyEventCallback> EVENT = Event.create((listeners) ->
(keyInput, action) -> {
for (KeyEventCallback listener : listeners) {
if (listener.onKeyEvent(keyInput, action)) {
return true;
}
}
return false;
}
);
//#if MC>=11400
int ACTION_RELEASE = org.lwjgl.glfw.GLFW.GLFW_RELEASE;
int ACTION_PRESS = org.lwjgl.glfw.GLFW.GLFW_PRESS;
//#else
//$$ int ACTION_RELEASE = 0;
//$$ int ACTION_PRESS = 1;
//#endif
boolean onKeyEvent(KeyInput keyInput, int action);
}

View File

@@ -0,0 +1,15 @@
package com.replaymod.core.events;
import de.johni0702.minecraft.gui.utils.Event;
public interface PostRenderCallback {
Event<PostRenderCallback> EVENT = Event.create((listeners) ->
() -> {
for (PostRenderCallback listener : listeners) {
listener.postRender();
}
}
);
void postRender();
}

View File

@@ -0,0 +1,16 @@
package com.replaymod.core.events;
import de.johni0702.minecraft.gui.utils.Event;
import net.minecraft.client.util.math.MatrixStack;
public interface PostRenderWorldCallback {
Event<PostRenderWorldCallback> EVENT = Event.create((listeners) ->
(MatrixStack matrixStack) -> {
for (PostRenderWorldCallback listener : listeners) {
listener.postRenderWorld(matrixStack);
}
}
);
void postRenderWorld(MatrixStack matrixStack);
}

View File

@@ -0,0 +1,15 @@
package com.replaymod.core.events;
import de.johni0702.minecraft.gui.utils.Event;
public interface PreRenderCallback {
Event<PreRenderCallback> EVENT = Event.create((listeners) ->
() -> {
for (PreRenderCallback listener : listeners) {
listener.preRender();
}
}
);
void preRender();
}

View File

@@ -0,0 +1,18 @@
package com.replaymod.core.events;
import de.johni0702.minecraft.gui.utils.Event;
public interface PreRenderHandCallback {
Event<PreRenderHandCallback> EVENT = Event.create((listeners) ->
() -> {
for (PreRenderHandCallback listener : listeners) {
if (listener.preRenderHand()) {
return true;
}
}
return false;
}
);
boolean preRenderHand();
}

View File

@@ -0,0 +1,16 @@
package com.replaymod.core.events;
import com.replaymod.core.SettingsRegistry;
import de.johni0702.minecraft.gui.utils.Event;
public interface SettingsChangedCallback {
Event<SettingsChangedCallback> EVENT = Event.create((listeners) ->
(registry, key) -> {
for (SettingsChangedCallback listener : listeners) {
listener.onSettingsChanged(registry, key);
}
}
);
void onSettingsChanged(SettingsRegistry registry, SettingsRegistry.SettingKey<?> key);
}

View File

@@ -1,15 +0,0 @@
package com.replaymod.core.events;
import com.replaymod.core.SettingsRegistry;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.minecraftforge.fml.common.eventhandler.Event;
@RequiredArgsConstructor
public class SettingsChangedEvent extends Event {
@Getter
private final SettingsRegistry settingsRegistry;
@Getter
private final SettingsRegistry.SettingKey<?> key;
}

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