mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-11-25 20:25:19 +01:00
Fix paper backcompat with playerlist tracker change
This commit is contained in:
parent
6b4ef37a46
commit
3e578db3ad
@ -2,12 +2,14 @@ package net.citizensnpcs.nms.v1_11_R1.util;
|
|||||||
|
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.google.common.collect.ForwardingMap;
|
||||||
import com.google.common.collect.ForwardingSet;
|
import com.google.common.collect.ForwardingSet;
|
||||||
|
|
||||||
import net.citizensnpcs.Settings.Setting;
|
import net.citizensnpcs.Settings.Setting;
|
||||||
@ -27,25 +29,48 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry {
|
|||||||
public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
||||||
super(entity, i, j, k, flag);
|
super(entity, i, j, k, flag);
|
||||||
tracker = getTracker(this);
|
tracker = getTracker(this);
|
||||||
try {
|
if (TRACKING_MAP_SETTER != null) {
|
||||||
Set<EntityPlayer> delegate = super.trackedPlayers;
|
try {
|
||||||
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
Map<EntityPlayer, Boolean> delegate = (Map<EntityPlayer, Boolean>) TRACKING_MAP_GETTER.invoke(this);
|
||||||
@Override
|
TRACKING_MAP_SETTER.invoke(this, new ForwardingMap<EntityPlayer, Boolean>() {
|
||||||
public boolean add(EntityPlayer player) {
|
@Override
|
||||||
boolean res = super.add(player);
|
protected Map<EntityPlayer, Boolean> delegate() {
|
||||||
if (res) {
|
return delegate;
|
||||||
updateLastPlayer(player);
|
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Set<EntityPlayer> delegate() {
|
public Boolean put(EntityPlayer player, Boolean value) {
|
||||||
return delegate;
|
Boolean res = super.put(player, value);
|
||||||
}
|
if (res == null) {
|
||||||
});
|
updateLastPlayer(player);
|
||||||
} catch (Throwable e) {
|
}
|
||||||
e.printStackTrace();
|
return res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Set<EntityPlayer> delegate = super.trackedPlayers;
|
||||||
|
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
||||||
|
@Override
|
||||||
|
public boolean add(EntityPlayer player) {
|
||||||
|
boolean res = super.add(player);
|
||||||
|
if (res) {
|
||||||
|
updateLastPlayer(player);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<EntityPlayer> delegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,10 +166,25 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Field E = NMS.getField(EntityTrackerEntry.class, "e");
|
private static Field E = NMS.getField(EntityTrackerEntry.class, "e");
|
||||||
|
|
||||||
private static Field F = NMS.getField(EntityTrackerEntry.class, "f");
|
private static Field F = NMS.getField(EntityTrackerEntry.class, "f");
|
||||||
|
|
||||||
private static Field G = NMS.getField(EntityTrackerEntry.class, "g");
|
private static Field G = NMS.getField(EntityTrackerEntry.class, "g");
|
||||||
|
|
||||||
private static Field TRACKER = NMS.getField(EntityTrackerEntry.class, "tracker");
|
private static Field TRACKER = NMS.getField(EntityTrackerEntry.class, "tracker");
|
||||||
|
private static MethodHandle TRACKING_MAP_GETTER;
|
||||||
|
private static MethodHandle TRACKING_MAP_SETTER;
|
||||||
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
||||||
Set.class);
|
Set.class);
|
||||||
private static Field U = NMS.getField(EntityTrackerEntry.class, "u");
|
private static Field U = NMS.getField(EntityTrackerEntry.class, "u");
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
// Old paper versions override the tracked player set to be a map
|
||||||
|
if (EntityTrackerEntry.class.getField("trackedPlayerMap") != null) {
|
||||||
|
TRACKING_MAP_SETTER = NMS.getFirstSetter(EntityTrackerEntry.class, Map.class);
|
||||||
|
TRACKING_MAP_GETTER = NMS.getFirstGetter(EntityTrackerEntry.class, Map.class);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,14 @@ package net.citizensnpcs.nms.v1_12_R1.util;
|
|||||||
|
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.google.common.collect.ForwardingMap;
|
||||||
import com.google.common.collect.ForwardingSet;
|
import com.google.common.collect.ForwardingSet;
|
||||||
|
|
||||||
import net.citizensnpcs.Settings.Setting;
|
import net.citizensnpcs.Settings.Setting;
|
||||||
@ -27,25 +29,48 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry {
|
|||||||
public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
||||||
super(entity, i, j, k, flag);
|
super(entity, i, j, k, flag);
|
||||||
this.tracker = getTracker(this);
|
this.tracker = getTracker(this);
|
||||||
try {
|
if (TRACKING_MAP_SETTER != null) {
|
||||||
Set<EntityPlayer> delegate = super.trackedPlayers;
|
try {
|
||||||
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
Map<EntityPlayer, Boolean> delegate = (Map<EntityPlayer, Boolean>) TRACKING_MAP_GETTER.invoke(this);
|
||||||
@Override
|
TRACKING_MAP_SETTER.invoke(this, new ForwardingMap<EntityPlayer, Boolean>() {
|
||||||
public boolean add(EntityPlayer player) {
|
@Override
|
||||||
boolean res = super.add(player);
|
protected Map<EntityPlayer, Boolean> delegate() {
|
||||||
if (res) {
|
return delegate;
|
||||||
updateLastPlayer(player);
|
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Set<EntityPlayer> delegate() {
|
public Boolean put(EntityPlayer player, Boolean value) {
|
||||||
return delegate;
|
Boolean res = super.put(player, value);
|
||||||
}
|
if (res == null) {
|
||||||
});
|
updateLastPlayer(player);
|
||||||
} catch (Throwable e) {
|
}
|
||||||
e.printStackTrace();
|
return res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Set<EntityPlayer> delegate = super.trackedPlayers;
|
||||||
|
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
||||||
|
@Override
|
||||||
|
public boolean add(EntityPlayer player) {
|
||||||
|
boolean res = super.add(player);
|
||||||
|
if (res) {
|
||||||
|
updateLastPlayer(player);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<EntityPlayer> delegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,9 +176,22 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry {
|
|||||||
private static Field F = NMS.getField(EntityTrackerEntry.class, "f");
|
private static Field F = NMS.getField(EntityTrackerEntry.class, "f");
|
||||||
private static Field G = NMS.getField(EntityTrackerEntry.class, "g");
|
private static Field G = NMS.getField(EntityTrackerEntry.class, "g");
|
||||||
private static Field TRACKER = NMS.getField(EntityTrackerEntry.class, "tracker");
|
private static Field TRACKER = NMS.getField(EntityTrackerEntry.class, "tracker");
|
||||||
|
private static MethodHandle TRACKING_MAP_GETTER;
|
||||||
|
private static MethodHandle TRACKING_MAP_SETTER;
|
||||||
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
||||||
int.class);
|
int.class);
|
||||||
|
|
||||||
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
||||||
Set.class);
|
Set.class);
|
||||||
private static Field U = NMS.getField(EntityTrackerEntry.class, "u");
|
private static Field U = NMS.getField(EntityTrackerEntry.class, "u");
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
// Old paper versions override the tracked player set to be a map
|
||||||
|
if (EntityTrackerEntry.class.getField("trackedPlayerMap") != null) {
|
||||||
|
TRACKING_MAP_SETTER = NMS.getFirstSetter(EntityTrackerEntry.class, Map.class);
|
||||||
|
TRACKING_MAP_GETTER = NMS.getFirstGetter(EntityTrackerEntry.class, Map.class);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,14 @@ package net.citizensnpcs.nms.v1_13_R2.util;
|
|||||||
|
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.google.common.collect.ForwardingMap;
|
||||||
import com.google.common.collect.ForwardingSet;
|
import com.google.common.collect.ForwardingSet;
|
||||||
|
|
||||||
import net.citizensnpcs.Settings.Setting;
|
import net.citizensnpcs.Settings.Setting;
|
||||||
@ -28,25 +30,48 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry {
|
|||||||
public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
public PlayerlistTrackerEntry(Entity entity, int i, int j, int k, boolean flag) {
|
||||||
super(entity, i, j, k, flag);
|
super(entity, i, j, k, flag);
|
||||||
tracker = getTracker(this);
|
tracker = getTracker(this);
|
||||||
try {
|
if (TRACKING_MAP_SETTER != null) {
|
||||||
Set<EntityPlayer> delegate = super.trackedPlayers;
|
try {
|
||||||
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
Map<EntityPlayer, Boolean> delegate = (Map<EntityPlayer, Boolean>) TRACKING_MAP_GETTER.invoke(this);
|
||||||
@Override
|
TRACKING_MAP_SETTER.invoke(this, new ForwardingMap<EntityPlayer, Boolean>() {
|
||||||
public boolean add(EntityPlayer player) {
|
@Override
|
||||||
boolean res = super.add(player);
|
protected Map<EntityPlayer, Boolean> delegate() {
|
||||||
if (res) {
|
return delegate;
|
||||||
updateLastPlayer(player);
|
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Set<EntityPlayer> delegate() {
|
public Boolean put(EntityPlayer player, Boolean value) {
|
||||||
return delegate;
|
Boolean res = super.put(player, value);
|
||||||
}
|
if (res == null) {
|
||||||
});
|
updateLastPlayer(player);
|
||||||
} catch (Throwable e) {
|
}
|
||||||
e.printStackTrace();
|
return res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Set<EntityPlayer> delegate = super.trackedPlayers;
|
||||||
|
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
||||||
|
@Override
|
||||||
|
public boolean add(EntityPlayer player) {
|
||||||
|
boolean res = super.add(player);
|
||||||
|
if (res) {
|
||||||
|
updateLastPlayer(player);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<EntityPlayer> delegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,10 +183,25 @@ public class PlayerlistTrackerEntry extends EntityTrackerEntry {
|
|||||||
private static Field F = NMS.getField(EntityTrackerEntry.class, "f");
|
private static Field F = NMS.getField(EntityTrackerEntry.class, "f");
|
||||||
|
|
||||||
private static Field G = NMS.getField(EntityTrackerEntry.class, "g");
|
private static Field G = NMS.getField(EntityTrackerEntry.class, "g");
|
||||||
|
|
||||||
private static Field TRACKER = NMS.getField(EntityTrackerEntry.class, "tracker");
|
private static Field TRACKER = NMS.getField(EntityTrackerEntry.class, "tracker");
|
||||||
|
|
||||||
|
private static MethodHandle TRACKING_MAP_GETTER;
|
||||||
|
|
||||||
|
private static MethodHandle TRACKING_MAP_SETTER;
|
||||||
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
||||||
int.class);
|
int.class);
|
||||||
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTrackerEntry.class,
|
||||||
Set.class);
|
Set.class);
|
||||||
private static Field U = NMS.getField(EntityTrackerEntry.class, "u");
|
private static Field U = NMS.getField(EntityTrackerEntry.class, "u");
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
// Old paper versions override the tracked player set to be a map
|
||||||
|
if (EntityTrackerEntry.class.getField("trackedPlayerMap") != null) {
|
||||||
|
TRACKING_MAP_SETTER = NMS.getFirstSetter(EntityTrackerEntry.class, Map.class);
|
||||||
|
TRACKING_MAP_GETTER = NMS.getFirstGetter(EntityTrackerEntry.class, Map.class);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package net.citizensnpcs.nms.v1_14_R1.util;
|
package net.citizensnpcs.nms.v1_14_R1.util;
|
||||||
|
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.google.common.collect.ForwardingMap;
|
||||||
import com.google.common.collect.ForwardingSet;
|
import com.google.common.collect.ForwardingSet;
|
||||||
|
|
||||||
import net.citizensnpcs.Settings.Setting;
|
import net.citizensnpcs.Settings.Setting;
|
||||||
@ -29,25 +31,48 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker {
|
|||||||
public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) {
|
public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) {
|
||||||
map.super(entity, i, j, flag);
|
map.super(entity, i, j, flag);
|
||||||
this.tracker = entity;
|
this.tracker = entity;
|
||||||
try {
|
if (TRACKING_MAP_SETTER != null) {
|
||||||
Set<EntityPlayer> delegate = super.trackedPlayers;
|
try {
|
||||||
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
Map<EntityPlayer, Boolean> delegate = (Map<EntityPlayer, Boolean>) TRACKING_MAP_GETTER.invoke(this);
|
||||||
@Override
|
TRACKING_MAP_SETTER.invoke(this, new ForwardingMap<EntityPlayer, Boolean>() {
|
||||||
public boolean add(EntityPlayer player) {
|
@Override
|
||||||
boolean res = super.add(player);
|
protected Map<EntityPlayer, Boolean> delegate() {
|
||||||
if (res) {
|
return delegate;
|
||||||
updateLastPlayer(player);
|
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Set<EntityPlayer> delegate() {
|
public Boolean put(EntityPlayer player, Boolean value) {
|
||||||
return delegate;
|
Boolean res = super.put(player, value);
|
||||||
}
|
if (res == null) {
|
||||||
});
|
updateLastPlayer(player);
|
||||||
} catch (Throwable e) {
|
}
|
||||||
e.printStackTrace();
|
return res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Set<EntityPlayer> delegate = super.trackedPlayers;
|
||||||
|
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
||||||
|
@Override
|
||||||
|
public boolean add(EntityPlayer player) {
|
||||||
|
boolean res = super.add(player);
|
||||||
|
if (res) {
|
||||||
|
updateLastPlayer(player);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<EntityPlayer> delegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,11 +160,22 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final MethodHandle D = NMS.getGetter(EntityTrackerEntry.class, "d");
|
private static final MethodHandle D = NMS.getGetter(EntityTrackerEntry.class, "d");
|
||||||
|
|
||||||
private static final MethodHandle E = NMS.getGetter(EntityTrackerEntry.class, "e");
|
private static final MethodHandle E = NMS.getGetter(EntityTrackerEntry.class, "e");
|
||||||
private static final MethodHandle TRACKER = NMS.getGetter(EntityTracker.class, "tracker");
|
private static final MethodHandle TRACKER = NMS.getGetter(EntityTracker.class, "tracker");
|
||||||
private static final MethodHandle TRACKER_ENTRY = NMS.getGetter(EntityTracker.class, "trackerEntry");
|
private static final MethodHandle TRACKER_ENTRY = NMS.getGetter(EntityTracker.class, "trackerEntry");
|
||||||
|
private static MethodHandle TRACKING_MAP_GETTER;
|
||||||
|
private static MethodHandle TRACKING_MAP_SETTER;
|
||||||
private static final MethodHandle TRACKING_RANGE = NMS.getGetter(EntityTracker.class, "trackingDistance");
|
private static final MethodHandle TRACKING_RANGE = NMS.getGetter(EntityTracker.class, "trackingDistance");
|
||||||
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, int.class);
|
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, int.class);
|
||||||
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, Set.class);
|
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, Set.class);
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
// Old paper versions override the tracked player set to be a map
|
||||||
|
if (EntityTracker.class.getField("trackedPlayerMap") != null) {
|
||||||
|
TRACKING_MAP_SETTER = NMS.getFirstSetter(EntityTracker.class, Map.class);
|
||||||
|
TRACKING_MAP_GETTER = NMS.getFirstGetter(EntityTracker.class, Map.class);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package net.citizensnpcs.nms.v1_15_R1.util;
|
package net.citizensnpcs.nms.v1_15_R1.util;
|
||||||
|
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.google.common.collect.ForwardingMap;
|
||||||
import com.google.common.collect.ForwardingSet;
|
import com.google.common.collect.ForwardingSet;
|
||||||
|
|
||||||
import net.citizensnpcs.Settings.Setting;
|
import net.citizensnpcs.Settings.Setting;
|
||||||
@ -29,25 +31,48 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker {
|
|||||||
public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) {
|
public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) {
|
||||||
map.super(entity, i, j, flag);
|
map.super(entity, i, j, flag);
|
||||||
this.tracker = entity;
|
this.tracker = entity;
|
||||||
try {
|
if (TRACKING_MAP_SETTER != null) {
|
||||||
Set<EntityPlayer> delegate = super.trackedPlayers;
|
try {
|
||||||
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
Map<EntityPlayer, Boolean> delegate = (Map<EntityPlayer, Boolean>) TRACKING_MAP_GETTER.invoke(this);
|
||||||
@Override
|
TRACKING_MAP_SETTER.invoke(this, new ForwardingMap<EntityPlayer, Boolean>() {
|
||||||
public boolean add(EntityPlayer player) {
|
@Override
|
||||||
boolean res = super.add(player);
|
protected Map<EntityPlayer, Boolean> delegate() {
|
||||||
if (res) {
|
return delegate;
|
||||||
updateLastPlayer(player);
|
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Set<EntityPlayer> delegate() {
|
public Boolean put(EntityPlayer player, Boolean value) {
|
||||||
return delegate;
|
Boolean res = super.put(player, value);
|
||||||
}
|
if (res == null) {
|
||||||
});
|
updateLastPlayer(player);
|
||||||
} catch (Throwable e) {
|
}
|
||||||
e.printStackTrace();
|
return res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Set<EntityPlayer> delegate = super.trackedPlayers;
|
||||||
|
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
||||||
|
@Override
|
||||||
|
public boolean add(EntityPlayer player) {
|
||||||
|
boolean res = super.add(player);
|
||||||
|
if (res) {
|
||||||
|
updateLastPlayer(player);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<EntityPlayer> delegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +163,19 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker {
|
|||||||
private static final MethodHandle E = NMS.getGetter(EntityTrackerEntry.class, "e");
|
private static final MethodHandle E = NMS.getGetter(EntityTrackerEntry.class, "e");
|
||||||
private static final MethodHandle TRACKER = NMS.getGetter(EntityTracker.class, "tracker");
|
private static final MethodHandle TRACKER = NMS.getGetter(EntityTracker.class, "tracker");
|
||||||
private static final MethodHandle TRACKER_ENTRY = NMS.getGetter(EntityTracker.class, "trackerEntry");
|
private static final MethodHandle TRACKER_ENTRY = NMS.getGetter(EntityTracker.class, "trackerEntry");
|
||||||
|
private static MethodHandle TRACKING_MAP_GETTER;
|
||||||
|
private static MethodHandle TRACKING_MAP_SETTER;
|
||||||
private static final MethodHandle TRACKING_RANGE = NMS.getGetter(EntityTracker.class, "trackingDistance");
|
private static final MethodHandle TRACKING_RANGE = NMS.getGetter(EntityTracker.class, "trackingDistance");
|
||||||
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, int.class);
|
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, int.class);
|
||||||
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, Set.class);
|
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, Set.class);
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
// Old paper versions override the tracked player set to be a map
|
||||||
|
if (EntityTracker.class.getField("trackedPlayerMap") != null) {
|
||||||
|
TRACKING_MAP_SETTER = NMS.getFirstSetter(EntityTracker.class, Map.class);
|
||||||
|
TRACKING_MAP_GETTER = NMS.getFirstGetter(EntityTracker.class, Map.class);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package net.citizensnpcs.nms.v1_16_R3.util;
|
package net.citizensnpcs.nms.v1_16_R3.util;
|
||||||
|
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.google.common.collect.ForwardingMap;
|
||||||
import com.google.common.collect.ForwardingSet;
|
import com.google.common.collect.ForwardingSet;
|
||||||
|
|
||||||
import net.citizensnpcs.Settings.Setting;
|
import net.citizensnpcs.Settings.Setting;
|
||||||
@ -29,25 +31,48 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker {
|
|||||||
public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) {
|
public PlayerlistTracker(PlayerChunkMap map, Entity entity, int i, int j, boolean flag) {
|
||||||
map.super(entity, i, j, flag);
|
map.super(entity, i, j, flag);
|
||||||
this.tracker = entity;
|
this.tracker = entity;
|
||||||
try {
|
if (TRACKING_MAP_SETTER != null) {
|
||||||
Set<EntityPlayer> delegate = super.trackedPlayers;
|
try {
|
||||||
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
Map<EntityPlayer, Boolean> delegate = (Map<EntityPlayer, Boolean>) TRACKING_MAP_GETTER.invoke(this);
|
||||||
@Override
|
TRACKING_MAP_SETTER.invoke(this, new ForwardingMap<EntityPlayer, Boolean>() {
|
||||||
public boolean add(EntityPlayer player) {
|
@Override
|
||||||
boolean res = super.add(player);
|
protected Map<EntityPlayer, Boolean> delegate() {
|
||||||
if (res) {
|
return delegate;
|
||||||
updateLastPlayer(player);
|
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Set<EntityPlayer> delegate() {
|
public Boolean put(EntityPlayer player, Boolean value) {
|
||||||
return delegate;
|
Boolean res = super.put(player, value);
|
||||||
}
|
if (res == null) {
|
||||||
});
|
updateLastPlayer(player);
|
||||||
} catch (Throwable e) {
|
}
|
||||||
e.printStackTrace();
|
return res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Set<EntityPlayer> delegate = super.trackedPlayers;
|
||||||
|
TRACKING_SET_SETTER.invoke(this, new ForwardingSet<EntityPlayer>() {
|
||||||
|
@Override
|
||||||
|
public boolean add(EntityPlayer player) {
|
||||||
|
boolean res = super.add(player);
|
||||||
|
if (res) {
|
||||||
|
updateLastPlayer(player);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<EntityPlayer> delegate() {
|
||||||
|
return delegate;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,11 +160,22 @@ public class PlayerlistTracker extends PlayerChunkMap.EntityTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final MethodHandle D = NMS.getGetter(EntityTrackerEntry.class, "d");
|
private static final MethodHandle D = NMS.getGetter(EntityTrackerEntry.class, "d");
|
||||||
|
|
||||||
private static final MethodHandle E = NMS.getGetter(EntityTrackerEntry.class, "e");
|
private static final MethodHandle E = NMS.getGetter(EntityTrackerEntry.class, "e");
|
||||||
private static final MethodHandle TRACKER = NMS.getGetter(EntityTracker.class, "tracker");
|
private static final MethodHandle TRACKER = NMS.getGetter(EntityTracker.class, "tracker");
|
||||||
private static final MethodHandle TRACKER_ENTRY = NMS.getGetter(EntityTracker.class, "trackerEntry");
|
private static final MethodHandle TRACKER_ENTRY = NMS.getGetter(EntityTracker.class, "trackerEntry");
|
||||||
|
private static MethodHandle TRACKING_MAP_GETTER;
|
||||||
|
private static MethodHandle TRACKING_MAP_SETTER;
|
||||||
private static final MethodHandle TRACKING_RANGE = NMS.getGetter(EntityTracker.class, "trackingDistance");
|
private static final MethodHandle TRACKING_RANGE = NMS.getGetter(EntityTracker.class, "trackingDistance");
|
||||||
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, int.class);
|
private static final MethodHandle TRACKING_RANGE_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, int.class);
|
||||||
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, Set.class);
|
private static final MethodHandle TRACKING_SET_SETTER = NMS.getFirstFinalSetter(EntityTracker.class, Set.class);
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
// Old paper versions override the tracked player set to be a map
|
||||||
|
if (EntityTracker.class.getField("trackedPlayerMap") != null) {
|
||||||
|
TRACKING_MAP_SETTER = NMS.getFirstSetter(EntityTracker.class, Map.class);
|
||||||
|
TRACKING_MAP_GETTER = NMS.getFirstGetter(EntityTracker.class, Map.class);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user