mirror of
https://github.com/Minestom/Minestom.git
synced 2025-01-31 20:41:29 +01:00
Added AdvancementTab#getTabs
This commit is contained in:
parent
d3d06e907c
commit
1f2451f0b2
@ -6,7 +6,6 @@ import net.minestom.server.item.ItemStack;
|
||||
import net.minestom.server.item.Material;
|
||||
import net.minestom.server.network.packet.server.play.AdvancementsPacket;
|
||||
import net.minestom.server.network.player.PlayerConnection;
|
||||
import net.minestom.server.utils.PacketUtils;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@ -336,7 +335,8 @@ public class Advancement {
|
||||
updateCriteria();
|
||||
|
||||
if (tab != null) {
|
||||
tab.createBuffer = PacketUtils.writePacket(tab.createPacket());
|
||||
// Update the tab cached packet
|
||||
tab.updatePacket();
|
||||
|
||||
final ByteBuf createBuffer = tab.createBuffer;
|
||||
final ByteBuf removeBuffer = tab.removeBuffer;
|
||||
|
@ -16,6 +16,8 @@ import java.util.*;
|
||||
*/
|
||||
public class AdvancementTab implements Viewable {
|
||||
|
||||
private static Map<Player, Set<AdvancementTab>> playerTabMap = new HashMap<>();
|
||||
|
||||
private Set<Player> viewers = new HashSet<>();
|
||||
|
||||
private AdvancementRoot root;
|
||||
@ -38,6 +40,16 @@ public class AdvancementTab implements Viewable {
|
||||
this.removeBuffer = PacketUtils.writePacket(removePacket);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the tabs of a viewer
|
||||
*
|
||||
* @param player the player to get the tabs from
|
||||
* @return all the advancement tabs that the player sees
|
||||
*/
|
||||
public static Set<AdvancementTab> getTabs(Player player) {
|
||||
return playerTabMap.getOrDefault(player, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the root advancement of this tab
|
||||
*
|
||||
@ -116,7 +128,7 @@ public class AdvancementTab implements Viewable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addViewer(Player player) {
|
||||
public synchronized boolean addViewer(Player player) {
|
||||
final boolean result = viewers.add(player);
|
||||
if (!result) {
|
||||
return false;
|
||||
@ -127,11 +139,13 @@ public class AdvancementTab implements Viewable {
|
||||
// Send the tab to the player
|
||||
playerConnection.sendPacket(createBuffer, true);
|
||||
|
||||
addPlayer(player);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeViewer(Player player) {
|
||||
public synchronized boolean removeViewer(Player player) {
|
||||
if (!isViewer(player)) {
|
||||
return false;
|
||||
}
|
||||
@ -141,6 +155,8 @@ public class AdvancementTab implements Viewable {
|
||||
// Remove the tab
|
||||
playerConnection.sendPacket(removeBuffer, true);
|
||||
|
||||
removePlayer(player);
|
||||
|
||||
return viewers.remove(player);
|
||||
}
|
||||
|
||||
@ -149,4 +165,30 @@ public class AdvancementTab implements Viewable {
|
||||
return viewers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the tab to the player set
|
||||
*
|
||||
* @param player the player
|
||||
*/
|
||||
private void addPlayer(Player player) {
|
||||
Set<AdvancementTab> tabs = playerTabMap.computeIfAbsent(player, p -> new HashSet<>());
|
||||
tabs.add(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the tab from the player set
|
||||
*
|
||||
* @param player the player
|
||||
*/
|
||||
private void removePlayer(Player player) {
|
||||
if (!playerTabMap.containsKey(player)) {
|
||||
return;
|
||||
}
|
||||
Set<AdvancementTab> tabs = playerTabMap.get(player);
|
||||
tabs.remove(this);
|
||||
if (tabs.isEmpty()) {
|
||||
playerTabMap.remove(player);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -76,6 +76,7 @@ public abstract class EntityCreature extends LivingEntity {
|
||||
return;
|
||||
}
|
||||
|
||||
// Goal selectors
|
||||
{
|
||||
// Supplier used to get the next goal selector which should start
|
||||
// (null if not found)
|
||||
@ -111,7 +112,7 @@ public abstract class EntityCreature extends LivingEntity {
|
||||
this.currentGoalSelector.start();
|
||||
}
|
||||
|
||||
// Execute tick for the goal selector
|
||||
// Execute tick for the current goal selector
|
||||
if (currentGoalSelector != null) {
|
||||
currentGoalSelector.tick(time);
|
||||
}
|
||||
@ -120,7 +121,7 @@ public abstract class EntityCreature extends LivingEntity {
|
||||
|
||||
// Path finding
|
||||
{
|
||||
pathLock.lock();
|
||||
this.pathLock.lock();
|
||||
path = pathFinder.updatePathFor(pathingEntity);
|
||||
if (path != null) {
|
||||
final float speed = getAttributeValue(Attribute.MOVEMENT_SPEED);
|
||||
@ -132,7 +133,7 @@ public abstract class EntityCreature extends LivingEntity {
|
||||
this.pathFinder.reset();
|
||||
}
|
||||
}
|
||||
pathLock.unlock();
|
||||
this.pathLock.unlock();
|
||||
}
|
||||
|
||||
super.update(time);
|
||||
@ -337,7 +338,7 @@ public abstract class EntityCreature extends LivingEntity {
|
||||
return false;
|
||||
}
|
||||
|
||||
pathLock.lock();
|
||||
this.pathLock.lock();
|
||||
this.pathFinder.reset();
|
||||
if (position == null) {
|
||||
return false;
|
||||
@ -362,7 +363,7 @@ public abstract class EntityCreature extends LivingEntity {
|
||||
} catch (NullPointerException | IndexOutOfBoundsException e) {
|
||||
this.path = null;
|
||||
}
|
||||
pathLock.unlock();
|
||||
this.pathLock.unlock();
|
||||
|
||||
final boolean success = path != null;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user