Skip to content

Commit f6805ad

Browse files
committed
add tileentity method and mojang player apis
1 parent e0327b3 commit f6805ad

File tree

6 files changed

+120
-12
lines changed

6 files changed

+120
-12
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,5 @@ build
7272
!lib/LocketteProAPI.jar
7373
!lib/EssentialsX-2.0.1-468.jar
7474
!/gradle/wrapper/gradle-wrapper.jar
75+
/testdb.db
76+
/testdb.db-journal

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ dependencies {
5656
compileOnly "org.spigotmc:spigot-api:$minecraftVersion-R0.1-SNAPSHOT"
5757
compileOnly 'io.netty:netty-all:4.1.25.Final' // netty is shadowed inside spigot jar
5858
compileOnly files('lib/spigot-1.13.2.jar') // for NMS
59+
// compileOnly files('lib/patched_1.13.2.jar') // for Paper NMS
5960

6061
// other plugins
6162
compileOnly('net.milkbowl.vault:VaultAPI:1.7') { transitive = false }

src/main/java/cat/nyaa/nyaacore/NyaaCoreLoader.java

+18
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import cat.nyaa.nyaacore.utils.ClickSelectionUtils;
88
import cat.nyaa.nyaacore.utils.OfflinePlayerUtils;
99
import org.bukkit.Bukkit;
10+
import org.bukkit.craftbukkit.v1_13_R2.util.CraftMagicNumbers;
1011
import org.bukkit.plugin.java.JavaPlugin;
1112

1213
public class NyaaCoreLoader extends JavaPlugin {
@@ -17,6 +18,8 @@ public static NyaaCoreLoader getInstance() {
1718
return instance;
1819
}
1920

21+
public static final String TARGET_MAPPING = "00ed8e5c39debc3ed194ad7c5645cc45";
22+
2023
@Override
2124
public void onLoad() {
2225
instance = this;
@@ -26,6 +29,14 @@ public void onLoad() {
2629

2730
@Override
2831
public void onEnable() {
32+
try {
33+
boolean check = MappingChecker.check();
34+
if (!check){
35+
getLogger().severe("CraftBukkit Mapping changed! Use with caution!");
36+
}
37+
} catch (NoSuchMethodError e){
38+
getLogger().info("Cannot detect CraftBukkit Mapping!");
39+
}
2940
HttpClient.init(0);
3041
IMessageQueue.DefaultMessageQueue defaultMessageQueue = new IMessageQueue.DefaultMessageQueue();
3142
Bukkit.getPluginManager().registerEvents(defaultMessageQueue, this);
@@ -41,4 +52,11 @@ public void onDisable() {
4152
HttpClient.shutdown();
4253
//timerManager.save();
4354
}
55+
56+
private static class MappingChecker {
57+
static boolean check() {
58+
String mappingsVersion = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion();
59+
return TARGET_MAPPING.equals(mappingsVersion);
60+
}
61+
}
4462
}

src/main/java/cat/nyaa/nyaacore/utils/NmsUtils.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
package cat.nyaa.nyaacore.utils;
22

33
import com.mojang.brigadier.exceptions.CommandSyntaxException;
4-
import net.minecraft.server.v1_13_R2.CriterionConditionNBT;
5-
import net.minecraft.server.v1_13_R2.EntityHuman;
6-
import net.minecraft.server.v1_13_R2.MojangsonParser;
7-
import net.minecraft.server.v1_13_R2.NBTTagCompound;
4+
import net.minecraft.server.v1_13_R2.*;
85
import org.bukkit.World;
6+
import org.bukkit.block.Block;
7+
import org.bukkit.block.BlockState;
98
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
109
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity;
1110
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftLivingEntity;
1211
import org.bukkit.entity.Entity;
1312
import org.bukkit.entity.LivingEntity;
1413

14+
import java.util.List;
1515
import java.util.UUID;
16+
import java.util.stream.Collectors;
1617

1718
public final class NmsUtils {
1819
/* see CommandEntityData.java */
@@ -92,4 +93,16 @@ public static void setEntityOnGround(Entity e, boolean isOnGround) {
9293
CraftEntity nmsEntity = (CraftEntity) e;
9394
nmsEntity.getHandle().onGround = isOnGround;
9495
}
96+
97+
public static List<Block> getTileEntities(World world){
98+
List<TileEntity> tileEntityList = ((CraftWorld) world).getHandle().tileEntityListTick;
99+
// Safe to parallelize getPosition and getBlockAt
100+
return tileEntityList.stream().parallel().map(TileEntity::getPosition).map(p -> world.getBlockAt(p.getX(), p.getY(), p.getZ())).collect(Collectors.toList());
101+
}
102+
103+
public static List<BlockState> getTileEntityBlockStates(World world){
104+
List<TileEntity> tileEntityList = ((CraftWorld) world).getHandle().tileEntityListTick;
105+
// Not safe to parallelize getState
106+
return tileEntityList.stream().map(TileEntity::getPosition).map(p -> world.getBlockAt(p.getX(), p.getY(), p.getZ())).map(Block::getState).collect(Collectors.toList());
107+
}
95108
}

src/main/java/cat/nyaa/nyaacore/utils/OfflinePlayerUtils.java

+80-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package cat.nyaa.nyaacore.utils;
22

3+
import cat.nyaa.nyaacore.NyaaCoreLoader;
4+
import cat.nyaa.nyaacore.http.client.HttpClient;
5+
import com.google.common.collect.BiMap;
6+
import com.google.common.collect.HashBiMap;
7+
import com.google.common.collect.ImmutableBiMap;
8+
import com.google.gson.Gson;
9+
import com.google.gson.reflect.TypeToken;
10+
import io.netty.handler.codec.http.FullHttpResponse;
311
import org.bukkit.Bukkit;
412
import org.bukkit.OfflinePlayer;
513
import org.bukkit.event.EventHandler;
@@ -8,24 +16,33 @@
816
import org.bukkit.event.player.PlayerJoinEvent;
917
import org.bukkit.event.player.PlayerQuitEvent;
1018

11-
import java.util.Arrays;
12-
import java.util.Comparator;
13-
import java.util.Locale;
14-
import java.util.Map;
19+
import java.util.*;
20+
import java.util.concurrent.CompletableFuture;
21+
import java.util.concurrent.ConcurrentMap;
1522
import java.util.function.BinaryOperator;
1623
import java.util.function.Function;
24+
import java.util.logging.Level;
1725
import java.util.stream.Collectors;
26+
import java.util.stream.Stream;
27+
28+
import static java.nio.charset.StandardCharsets.UTF_8;
1829

1930
public class OfflinePlayerUtils {
20-
private static Map<String, OfflinePlayer> playerCache;
31+
private static ConcurrentMap<String, OfflinePlayer> playerCache;
32+
private static ConcurrentMap<UUID, String> nameCache;
33+
private static TypeToken<List<Map<String, Object>>> typeTokenListMap = new TypeToken<List<Map<String, Object>>>() {
34+
};
35+
private static final String UNDASHED = "(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})";
36+
private static final String DASHED = "$1-$2-$3-$4-$5";
2137

2238
private OfflinePlayerUtils() {
2339
}
2440

2541
public static void init() {
2642
playerCache = Arrays.stream(Bukkit.getOfflinePlayers())
2743
.filter(p -> p.getName() != null)
28-
.collect(Collectors.toMap(p -> p.getName().toLowerCase(Locale.ENGLISH), Function.identity(), BinaryOperator.maxBy(Comparator.comparing(OfflinePlayer::getLastPlayed))));
44+
.collect(Collectors.toConcurrentMap(p -> p.getName().toLowerCase(Locale.ENGLISH), Function.identity(), BinaryOperator.maxBy(Comparator.comparing(OfflinePlayer::getLastPlayed))));
45+
nameCache = playerCache.entrySet().stream().collect(Collectors.toConcurrentMap(e -> e.getValue().getUniqueId(), Map.Entry::getKey));
2946
}
3047

3148
public static OfflinePlayer lookupPlayer(String name) {
@@ -34,6 +51,63 @@ public static OfflinePlayer lookupPlayer(String name) {
3451
return playerCache.get(name.toLowerCase(Locale.ENGLISH));
3552
}
3653

54+
public static CompletableFuture<BiMap<String, UUID>> lookupPlayerNamesOnline(String... names) {
55+
List<String> nameList = new LinkedList<>(Arrays.asList(names));
56+
BiMap<String, UUID> ret = HashBiMap.create();
57+
Iterator<String> iterator = nameList.iterator();
58+
while (iterator.hasNext()) {
59+
String n = iterator.next();
60+
OfflinePlayer player = playerCache.get(n.toLowerCase(Locale.ENGLISH));
61+
if (player != null) {
62+
iterator.remove();
63+
ret.put(n, player.getUniqueId());
64+
}
65+
}
66+
CompletableFuture<FullHttpResponse> response = HttpClient.postJson("https://api.mojang.com/profiles/minecraft", Collections.emptyMap(), new Gson().toJson(Stream.of(names).collect(Collectors.toList())));
67+
return response.thenApply((r) -> {
68+
NyaaCoreLoader.getInstance().getLogger().log(Level.FINER, "request name -> uuid api " + r.status().code());
69+
if (r.status().code() > 299 || r.content() == null) {
70+
return HashBiMap.<UUID, String>create();
71+
}
72+
List<Map<String, Object>> result = new Gson().fromJson(r.content().toString(UTF_8), typeTokenListMap.getType());
73+
return result.stream().collect(ImmutableBiMap.toImmutableBiMap(m -> {
74+
m.get("id");
75+
return UUID.fromString(((String) m.get("id")).replaceAll(UNDASHED, DASHED));
76+
},
77+
m -> (String) m.get("name")));
78+
}).thenApply(u -> {
79+
nameCache.putAll(u);
80+
ret.putAll(u.inverse());
81+
return ret;
82+
}).exceptionally((e) -> {
83+
NyaaCoreLoader.getInstance().getLogger().log(Level.INFO, "failed to request name -> uuid api", e);
84+
return ret;
85+
});
86+
}
87+
88+
public static CompletableFuture<String> lookupPlayerNameByUuidOnline(UUID uuid) {
89+
String s = nameCache.get(uuid);
90+
if (s != null) {
91+
return CompletableFuture.completedFuture(s);
92+
}
93+
CompletableFuture<FullHttpResponse> response = HttpClient.get("https://api.mojang.com/user/profiles/" + uuid.toString().toLowerCase().replace("-", "") + "/names", Collections.emptyMap());
94+
return response.thenApply((r) -> {
95+
NyaaCoreLoader.getInstance().getLogger().log(Level.FINER, "request uuid -> name api " + r.status().code());
96+
if (r.status().code() > 299 || r.content() == null) {
97+
return null;
98+
}
99+
List<Map<String, Object>> nameMapsList = new Gson().fromJson(r.content().toString(UTF_8), typeTokenListMap.getType());
100+
if (nameMapsList.isEmpty()){
101+
return null;
102+
}
103+
nameCache.put(uuid, nameMapsList.get(nameMapsList.size() - 1).get("name").toString());
104+
return nameCache.get(uuid);
105+
}).exceptionally((e) -> {
106+
NyaaCoreLoader.getInstance().getLogger().log(Level.INFO, "failed to request uuid -> name api", e);
107+
return null;
108+
});
109+
}
110+
37111
public static class _Listener implements Listener {
38112
@EventHandler(priority = EventPriority.MONITOR)
39113
public void onPlayerJoin(PlayerJoinEvent event) {

src/main/java/cat/nyaa/nyaacore/utils/VaultUtils.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
public final class VaultUtils {
1212
public static Economy getVaultEconomy() {
13-
if(eco == null){
13+
if (eco == null) {
1414
RegisteredServiceProvider<Economy> provider = Bukkit.getServer().getServicesManager().getRegistration(Economy.class);
1515
if (provider != null) {
1616
return eco = provider.getProvider();
@@ -23,7 +23,7 @@ public static Economy getVaultEconomy() {
2323
}
2424

2525
public static Chat getVaultChat() {
26-
if(chat == null){
26+
if (chat == null) {
2727
RegisteredServiceProvider<Chat> provider = Bukkit.getServer().getServicesManager().getRegistration(Chat.class);
2828
if (provider != null) {
2929
return chat = provider.getProvider();

0 commit comments

Comments
 (0)