diff --git a/src/main/java/org/ultramine/commands/OfflinePlayer.java b/src/main/java/org/ultramine/commands/OfflinePlayer.java index ed1a0fc..d0b36e6 100644 --- a/src/main/java/org/ultramine/commands/OfflinePlayer.java +++ b/src/main/java/org/ultramine/commands/OfflinePlayer.java @@ -1,10 +1,11 @@ package org.ultramine.commands; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + import org.ultramine.server.data.player.PlayerData; import org.ultramine.server.util.BasicTypeFormatter; -import com.google.common.base.Function; - import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.ServerConfigurationManager; @@ -32,14 +33,23 @@ return mgr.getPlayerByUsername(data.getProfile().getName()); } - public void loadPlayer(Function callback) + public void loadPlayer(Consumer callback) { EntityPlayerMP exists = getIfOnline(); if(exists != null) - callback.apply(exists); + callback.accept(exists); else mgr.getDataLoader().loadOffline(data.getProfile(), callback); - + } + + public CompletableFuture loadPlayer() + { + EntityPlayerMP exists = getIfOnline(); + if(exists != null) + return CompletableFuture.completedFuture(exists); + CompletableFuture ret = new CompletableFuture<>(); + mgr.getDataLoader().loadOffline(data.getProfile(), player -> ret.complete(player)); + return ret; } //Totally unsafe... diff --git a/src/main/java/org/ultramine/commands/basic/OpenInvCommands.java b/src/main/java/org/ultramine/commands/basic/OpenInvCommands.java index 33941cd..771c875 100644 --- a/src/main/java/org/ultramine/commands/basic/OpenInvCommands.java +++ b/src/main/java/org/ultramine/commands/basic/OpenInvCommands.java @@ -16,8 +16,6 @@ import org.ultramine.commands.CommandContext; import org.ultramine.commands.OfflinePlayer; -import com.google.common.base.Function; - public class OpenInvCommands { @Command( @@ -30,17 +28,11 @@ { final EntityPlayerMP sender = ctx.getSenderAsPlayer(); final OfflinePlayer offline = ctx.get("player").asOfflinePlayer(); - offline.loadPlayer(new Function() - { - @Override - public Void apply(EntityPlayerMP player) - { - if(player.isDead) - ctx.sendMessage("command.openinv.fail.dead"); - else - sender.displayGUIChest(new PlayerWrappedInventory(ctx.getServer(), player.inventory, player instanceof FakePlayer ? offline : null)); - return null; - } + offline.loadPlayer(player -> { + if(player.isDead) + ctx.sendMessage("command.openinv.fail.dead"); + else + sender.displayGUIChest(new PlayerWrappedInventory(ctx.getServer(), player.inventory, player instanceof FakePlayer ? offline : null)); }); } @@ -54,20 +46,14 @@ { final EntityPlayerMP sender = ctx.getSenderAsPlayer(); final OfflinePlayer offline = ctx.get("player").asOfflinePlayer(); - offline.loadPlayer(new Function() - { - @Override - public Void apply(EntityPlayerMP player) - { - InventoryEnderChest inv = player.getInventoryEnderChest(); - WrappedTileEntityEnderChest tile = new WrappedTileEntityEnderChest(sender, player, player instanceof FakePlayer ? offline : null); - inv.func_146031_a(tile); - if(player instanceof FakePlayer) - inv.func_110134_a(tile); - - sender.displayGUIChest(inv); - return null; - } + offline.loadPlayer(player -> { + InventoryEnderChest inv = player.getInventoryEnderChest(); + WrappedTileEntityEnderChest tile = new WrappedTileEntityEnderChest(sender, player, player instanceof FakePlayer ? offline : null); + inv.func_146031_a(tile); + if(player instanceof FakePlayer) + inv.func_110134_a(tile); + + sender.displayGUIChest(inv); }); } diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index b42f67c..d61fe6a 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.function.Consumer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -18,7 +19,6 @@ import org.ultramine.server.util.TwoStepsExecutor; import org.ultramine.server.util.WarpLocation; -import com.google.common.base.Function; import com.mojang.authlib.GameProfile; import cpw.mods.fml.common.FMLCommonHandler; @@ -201,36 +201,24 @@ final boolean loadData = !playerDataCache.containsKey(player.getGameProfile().getId()); final StatisticsFile loadedStats = mgr.func_152602_a(player); final TIntSet isolatedDataDims = mgr.getServerInstance().getMultiWorld().getIsolatedDataDims(); - executor.execute(new Function() - { - @Override - public LoadedDataStruct apply(Void input) //async + executor.execute(() -> { + NBTTagCompound nbt = getDataProvider().loadPlayer(profile); + if(nbt != null) { - NBTTagCompound nbt = getDataProvider().loadPlayer(profile); - if(nbt != null) - { - int dim = nbt.getInteger("Dimension"); - if(dim != 0 && isolatedDataDims.contains(dim)) - nbt = getDataProvider().loadPlayer(dim, profile); - } - PlayerData data = loadData ? getDataProvider().loadPlayerData(profile) : null; - StatisticsFile stats = loadedStats != null ? loadedStats : mgr.loadStatisticsFile_Async(profile); - return new LoadedDataStruct(nbt, data, stats); + int dim = nbt.getInteger("Dimension"); + if(dim != 0 && isolatedDataDims.contains(dim)) + nbt = getDataProvider().loadPlayer(dim, profile); } - }, new Function() - { - @Override - public Void apply(LoadedDataStruct data) //sync - { - if(!network.channel().isOpen()) - return null; - FMLCommonHandler.instance().bus().post(new FMLNetworkEvent.ServerConnectionFromClientEvent(network)); - if(data.getNBT() != null) - player.readFromNBT(data.getNBT()); - playerLoadCallback(network, player, nethandler, data.getNBT(), data.getPlayerData(), data.getStats()); - - return null; - } + PlayerData data = loadData ? getDataProvider().loadPlayerData(profile) : null; + StatisticsFile stats = loadedStats != null ? loadedStats : mgr.loadStatisticsFile_Async(profile); + return new LoadedDataStruct(nbt, data, stats); + }, data -> { + if(!network.channel().isOpen()) + return; + FMLCommonHandler.instance().bus().post(new FMLNetworkEvent.ServerConnectionFromClientEvent(network)); + if(data.getNBT() != null) + player.readFromNBT(data.getNBT()); + playerLoadCallback(network, player, nethandler, data.getNBT(), data.getPlayerData(), data.getStats()); }); } } @@ -375,25 +363,14 @@ { applyIsolatedData(player, null); // Replacing old data first - executor.execute(new Function() - { - @Override - public NBTTagCompound apply(Void input) //async - { - if(toIs) - return dataProvider.loadPlayer(toDim, profile); - else// if(fromIs) - return dataProvider.loadPlayer(profile); - } - }, new Function() - { - @Override - public Void apply(NBTTagCompound nbt) //sync - { - player.inventory.dropAllItems(); - applyIsolatedData(player, nbt); - return null; - } + executor.execute(() -> { + if(toIs) + return dataProvider.loadPlayer(toDim, profile); + else// if(fromIs) + return dataProvider.loadPlayer(profile); + }, nbt -> { + player.inventory.dropAllItems(); + applyIsolatedData(player, nbt); }); } } @@ -427,29 +404,18 @@ return dataExtinfos; } - public void loadOffline(final GameProfile profile, final Function callback) + public void loadOffline(final GameProfile profile, final Consumer callback) { - executor.execute(new Function() - { - @Override - public NBTTagCompound apply(Void input) //async + executor.execute(() -> { + return getDataProvider().loadPlayer(profile); + }, nbt -> { + EntityPlayerMP player = mgr.getPlayerByUsername(profile.getName()); + if(player == null) { - return getDataProvider().loadPlayer(profile); + player = new FakePlayer(mgr.getServerInstance().getMultiWorld().getWorldByID(0), profile); + player.readFromNBT(nbt); } - }, new Function() - { - @Override - public Void apply(NBTTagCompound nbt) //sync - { - EntityPlayerMP player = mgr.getPlayerByUsername(profile.getName()); - if(player == null) - { - player = new FakePlayer(mgr.getServerInstance().getMultiWorld().getWorldByID(0), profile); - player.readFromNBT(nbt); - } - callback.apply(player); - return null; - } + callback.accept(player); }); } diff --git a/src/main/java/org/ultramine/server/util/TwoStepsExecutor.java b/src/main/java/org/ultramine/server/util/TwoStepsExecutor.java index 7832ee1..6f3b998 100644 --- a/src/main/java/org/ultramine/server/util/TwoStepsExecutor.java +++ b/src/main/java/org/ultramine/server/util/TwoStepsExecutor.java @@ -3,6 +3,8 @@ import java.util.Queue; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.function.Consumer; +import java.util.function.Supplier; import com.google.common.base.Function; import com.google.common.collect.Queues; @@ -15,7 +17,7 @@ public final class TwoStepsExecutor { private final Executor exec; - private final Queue> queue = Queues.newConcurrentLinkedQueue(); + private final Queue queue = Queues.newConcurrentLinkedQueue(); public TwoStepsExecutor(Executor exec) { @@ -37,22 +39,21 @@ FMLCommonHandler.instance().bus().unregister(this); } + public void execute(final Supplier async, final Consumer sync) + { + exec.execute(() -> queue.add(new CallbackDataStruct(sync, async.get()))); + } + + @Deprecated public void execute(final Function async, final Function sync) { execute(null, async, sync); } + @Deprecated public void execute(final P param, final Function async, final Function sync) { - exec.execute(new Runnable() - { - @Override - public void run() - { - R ret = async.apply(param); - queue.add(new CallbackDataStruct(sync, ret)); - } - }); + exec.execute(() -> queue.add(new OldCallbackDataStruct(sync, async.apply(param)))); } @SubscribeEvent @@ -60,23 +61,40 @@ { if(e.phase == TickEvent.Phase.START) { - for(CallbackDataStruct toCall; (toCall = queue.poll()) != null;) - toCall.call(); + for(Runnable toRun; (toRun = queue.poll()) != null;) + toRun.run(); } } - private static class CallbackDataStruct + private static class CallbackDataStruct implements Runnable { - private Function callback; + private Consumer callback; private T param; - public CallbackDataStruct(Function callback, T param) + public CallbackDataStruct(Consumer callback, T param) { this.callback = callback; this.param = param; } - public void call() + public void run() + { + callback.accept(param); + } + } + + private static class OldCallbackDataStruct implements Runnable + { + private Function callback; + private T param; + + public OldCallbackDataStruct(Function callback, T param) + { + this.callback = callback; + this.param = param; + } + + public void run() { callback.apply(param); }