* ClientProxy.hasClientPlayerAdvancement should be faster

* Updated README
This commit is contained in:
Nicolas BARBOTIN 2018-02-03 15:42:30 +01:00
parent 38cd84208e
commit a27164056a
2 changed files with 32 additions and 18 deletions

View File

@ -16,6 +16,7 @@ This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The tex
* minePad management: check GuiContainer.draggedStack for minePad
* Change mod name to WD2
* Put a limit on screen resolution
* YT button (also add it to the redstone controller gui)
### Config elements
* Site blacklist
@ -25,6 +26,7 @@ This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The tex
* Browser language
* Screen load/unload distance (max distance = 60.0)
* Disable ownership thief item
* Disable hard recipes
### Delayed things
* Plugin API

View File

@ -84,7 +84,11 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi
private MinePadRenderer minePadRenderer;
private JSQueryDispatcher jsDispatcher;
private LaserPointerRenderer laserPointerRenderer;
private Field advancementToProgress;
//Client-side advancement hack
private final Field advancementToProgressField = findAdvancementToProgressField();
private ClientAdvancementManager lastAdvMgr;
private Map advancementToProgress;
//Laser pointer
private TileEntityScreen pointedScreen;
@ -214,29 +218,35 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi
@Override
@Nonnull
public HasAdvancement hasClientPlayerAdvancement(@Nonnull ResourceLocation rl) {
if(advancementToProgress != null && mc.player != null && mc.player.connection != null) {
if(advancementToProgressField != null && mc.player != null && mc.player.connection != null) {
ClientAdvancementManager cam = mc.player.connection.getAdvancementManager();
Advancement adv = cam.getAdvancementList().getAdvancement(rl);
Map map;
if(adv == null)
return HasAdvancement.DONT_KNOW;
try {
map = (Map) advancementToProgress.get(cam);
} catch(Throwable t) {
t.printStackTrace();
advancementToProgress = null;
return HasAdvancement.DONT_KNOW;
if(lastAdvMgr != cam) {
lastAdvMgr = cam;
try {
advancementToProgress = (Map) advancementToProgressField.get(cam);
} catch(Throwable t) {
Log.warningEx("Could not get ClientAdvancementManager.advancementToProgress field", t);
advancementToProgress = null;
return HasAdvancement.DONT_KNOW;
}
}
Object progress = map.get(adv);
if(advancementToProgress == null)
return HasAdvancement.DONT_KNOW;
Object progress = advancementToProgress.get(adv);
if(progress == null)
return HasAdvancement.NO;
if(!(progress instanceof AdvancementProgress)) {
Log.warning("The ClientAdvancementManager.advancementToProgress map does not contain AdvancementProgress instances");
advancementToProgress = null; //It's wrong
advancementToProgress = null; //Invalidate this: it's wrong
return HasAdvancement.DONT_KNOW;
}
@ -633,20 +643,22 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi
return false;
}
private void findAdvancementToProgressField() {
private static Field findAdvancementToProgressField() {
Field[] fields = ClientAdvancementManager.class.getDeclaredFields();
Optional<Field> result = Arrays.stream(fields).filter(f -> f.getType() == Map.class).findAny();
Arrays.stream(fields).filter(f -> f.getType() == Map.class).findAny().ifPresent(f -> {
if(result.isPresent()) {
try {
f.setAccessible(true);
advancementToProgress = f;
Field ret = result.get();
ret.setAccessible(true);
return ret;
} catch(Throwable t) {
t.printStackTrace();
}
});
}
if(advancementToProgress == null)
Log.warning("ClientAdvancementManager.advancementToProgress field could not be found");
Log.warning("ClientAdvancementManager.advancementToProgress field could not be found");
return null;
}
}