Skip to content

Commit

Permalink
Added: Runtime Reload Support
Browse files Browse the repository at this point in the history
  • Loading branch information
Bram1903 committed Oct 2, 2024
1 parent 9c32e48 commit f48d943
Show file tree
Hide file tree
Showing 12 changed files with 137 additions and 178 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
import java.util.Map;
import java.util.stream.Collectors;

public class AntiHealthIndicatorCommand<P> implements IGlobalCommand<P> {
public class AntiHealthIndicatorCommand<P> {
private final Component versionComponent;
private final Map<String, SubCommand<P>> subCommands = new HashMap<>();

Expand All @@ -46,7 +46,6 @@ public AntiHealthIndicatorCommand(AHIPlatform<P> platform) {
versionComponent = CommandComponentCreator.createAHICommandComponent();
}

@Override
public void onCommand(@NotNull CommonUser<P> sender, @NotNull String[] args) {
if (!hasAnyPermission(sender)) {
sender.sendMessage(versionComponent);
Expand All @@ -68,7 +67,6 @@ public void onCommand(@NotNull CommonUser<P> sender, @NotNull String[] args) {
}
}

@Override
public List<String> onTabComplete(@NotNull CommonUser<P> sender, @NotNull String[] args) {
if (args.length == 1) {
return subCommands.keySet().stream()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -44,19 +44,17 @@ public class CacheManager<P> {
private final ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, CachedEntity>> cache;

private final AHIPlatform<P> platform;
private final Settings settings;
private final ConfigManager<P> configManager;
private final LogManager<P> logManager;

public CacheManager(AHIPlatform<P> platform) {
this.cache = new ConcurrentHashMap<>();

this.platform = platform;
this.logManager = platform.getLogManager();
this.settings = platform.getConfigManager().getSettings();
this.configManager = platform.getConfigManager();

if (settings.isDebug()) {
LogCacheStats();
}
LogCacheStats();

this.platform.getLogManager().debug("CacheManager initialized.");
}
Expand Down Expand Up @@ -118,6 +116,8 @@ public int getEntityIdByPassengerId(@NonNull UUID uuid, int passengerId) {

private void LogCacheStats() {
platform.getScheduler().runAsyncTaskAtFixedRate((o) -> {
if (!configManager.getSettings().isDebug()) return;

ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, CachedEntity>> cacheMap = cache;

int underlyingSize = cacheMap.values().stream().mapToInt(Map::size).sum();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
*/
public class PacketManager<P> {
private final AHIPlatform<P> platform;
private final Settings settings;

/**
* Constructs a new PacketManager with the specified {@link AHIPlatform}.
Expand All @@ -42,7 +41,6 @@ public class PacketManager<P> {
*/
public PacketManager(AHIPlatform<P> platform) {
this.platform = platform;
this.settings = platform.getConfigManager().getSettings();

setupPacketListeners();
platform.getLogManager().debug("Packet listeners have been set up.");
Expand All @@ -52,39 +50,12 @@ public PacketManager(AHIPlatform<P> platform) {
* Sets up packet listeners
*/
public void setupPacketListeners() {
setupEntityListeners();
setupAdditionalListeners();
}

/**
* Sets up entity listeners
*/
private void setupEntityListeners() {
if (settings.getEntityData().isEnabled()) {
PacketEvents.getAPI().getEventManager().registerListener(new EntityTracker<>(platform), PacketListenerPriority.LOW);
PacketEvents.getAPI().getEventManager().registerListener(new EntityMetadataListener<>(platform));

if (!settings.getEntityData().isPlayersOnly()) {
PacketEvents.getAPI().getEventManager().registerListener(new VehicleState<>(platform));
}
}
}

/**
* Sets up additional listeners
*/
private void setupAdditionalListeners() {
if (settings.getItems().isEnabled()) {
PacketEvents.getAPI().getEventManager().registerListener(new EntityEquipmentListener<>(platform));
}
if (settings.isFoodSaturation()) {
PacketEvents.getAPI().getEventManager().registerListener(new PlayerUpdateHealthListener<>(platform));
}
if (settings.isWorldSeed()) {
PacketEvents.getAPI().getEventManager().registerListener(new WorldSeedListener<>(platform));
}
if (settings.isTeamScoreboard()) {
PacketEvents.getAPI().getEventManager().registerListener(new ScoreboardListener<>(platform));
}
PacketEvents.getAPI().getEventManager().registerListener(new EntityTracker<>(platform), PacketListenerPriority.LOW);
PacketEvents.getAPI().getEventManager().registerListener(new EntityMetadataListener<>(platform));
PacketEvents.getAPI().getEventManager().registerListener(new VehicleState<>(platform));
PacketEvents.getAPI().getEventManager().registerListener(new EntityEquipmentListener<>(platform));
PacketEvents.getAPI().getEventManager().registerListener(new PlayerUpdateHealthListener<>(platform));
PacketEvents.getAPI().getEventManager().registerListener(new WorldSeedListener<>(platform));
PacketEvents.getAPI().getEventManager().registerListener(new ScoreboardListener<>(platform));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.deathmotion.antihealthindicator.data.cache.RidableEntity;
import com.deathmotion.antihealthindicator.data.cache.WolfEntity;
import com.deathmotion.antihealthindicator.managers.CacheManager;
import com.deathmotion.antihealthindicator.managers.ConfigManager;
import com.github.retrooper.packetevents.event.PacketListener;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.event.UserDisconnectEvent;
Expand All @@ -44,7 +45,7 @@
*/
public class EntityTracker<P> implements PacketListener {
private final CacheManager<P> cacheManager;
private final Settings settings;
private final ConfigManager<P> configManager;

/**
* Constructs a new EntityState with the specified {@link AHIPlatform}.
Expand All @@ -53,7 +54,7 @@ public class EntityTracker<P> implements PacketListener {
*/
public EntityTracker(AHIPlatform<P> platform) {
this.cacheManager = platform.getCacheManager();
this.settings = platform.getConfigManager().getSettings();
this.configManager = platform.getConfigManager();

platform.getLogManager().debug("Entity State listener has been set up.");
}
Expand All @@ -66,16 +67,19 @@ public EntityTracker(AHIPlatform<P> platform) {
*/
@Override
public void onPacketSend(PacketSendEvent event) {
final Settings settings = configManager.getSettings();
if (!settings.getEntityData().isEnabled()) return;

final PacketTypeCommon type = event.getPacketType();

if (PacketType.Play.Server.SPAWN_LIVING_ENTITY == type) {
handleSpawnLivingEntity(new WrapperPlayServerSpawnLivingEntity(event), event.getUser());
handleSpawnLivingEntity(new WrapperPlayServerSpawnLivingEntity(event), event.getUser(), settings);
} else if (PacketType.Play.Server.SPAWN_ENTITY == type) {
handleSpawnEntity(new WrapperPlayServerSpawnEntity(event), event.getUser());
handleSpawnEntity(new WrapperPlayServerSpawnEntity(event), event.getUser(), settings);
} else if (PacketType.Play.Server.SPAWN_PLAYER == type) {
handleSpawnPlayer(new WrapperPlayServerSpawnPlayer(event), event.getUser());
} else if (PacketType.Play.Server.ENTITY_METADATA == type) {
handleEntityMetadata(new WrapperPlayServerEntityMetadata(event), event.getUser());
handleEntityMetadata(new WrapperPlayServerEntityMetadata(event), event.getUser(), settings);
} else if (PacketType.Play.Server.DESTROY_ENTITIES == type) {
handleDestroyEntities(new WrapperPlayServerDestroyEntities(event), event.getUser());
} else if (PacketType.Play.Server.RESPAWN == type) {
Expand All @@ -95,7 +99,7 @@ public void onUserDisconnect(UserDisconnectEvent event) {
cacheManager.removeUserCache(userUUID);
}

private void handleSpawnLivingEntity(WrapperPlayServerSpawnLivingEntity packet, User user) {
private void handleSpawnLivingEntity(WrapperPlayServerSpawnLivingEntity packet, User user, Settings settings) {
EntityType entityType = packet.getEntityType();

if (settings.getEntityData().isPlayersOnly()) {
Expand All @@ -108,7 +112,7 @@ private void handleSpawnLivingEntity(WrapperPlayServerSpawnLivingEntity packet,
cacheManager.addLivingEntity(user.getUUID(), entityId, entityData);
}

private void handleSpawnEntity(WrapperPlayServerSpawnEntity packet, User user) {
private void handleSpawnEntity(WrapperPlayServerSpawnEntity packet, User user, Settings settings) {
EntityType entityType = packet.getEntityType();

if (EntityTypes.isTypeInstanceOf(entityType, EntityTypes.LIVINGENTITY)) {
Expand All @@ -130,7 +134,7 @@ private void handleSpawnPlayer(WrapperPlayServerSpawnPlayer packet, User user) {
cacheManager.addLivingEntity(user.getUUID(), packet.getEntityId(), livingEntityData);
}

private void handleEntityMetadata(WrapperPlayServerEntityMetadata packet, User user) {
private void handleEntityMetadata(WrapperPlayServerEntityMetadata packet, User user, Settings settings) {
if (settings.getEntityData().isPlayersOnly()) return;

int entityId = packet.getEntityId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import com.deathmotion.antihealthindicator.AHIPlatform;
import com.deathmotion.antihealthindicator.data.Constants;
import com.deathmotion.antihealthindicator.data.Settings;
import com.deathmotion.antihealthindicator.util.AHIVersion;
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.UserLoginEvent;
Expand Down Expand Up @@ -72,6 +73,9 @@ public UpdateNotifier(AHIPlatform<P> platform, AHIVersion latestVersion) {
*/
@Override
public void onUserLogin(UserLoginEvent event) {
final Settings settings = platform.getConfigManager().getSettings();
if (!settings.getUpdateChecker().isNotifyInGame()) return;

User user = event.getUser();

platform.getScheduler().runAsyncTaskDelayed((o) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@
import com.deathmotion.antihealthindicator.data.Settings;
import com.deathmotion.antihealthindicator.data.cache.CachedEntity;
import com.deathmotion.antihealthindicator.managers.CacheManager;
import com.deathmotion.antihealthindicator.managers.ConfigManager;
import com.deathmotion.antihealthindicator.util.MetadataIndex;
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
import com.github.retrooper.packetevents.protocol.player.User;
Expand All @@ -47,96 +47,87 @@
*/
public class VehicleState<P> extends PacketListenerAbstract {
private final AHIPlatform<P> platform;
private final Settings settings;
private final ConfigManager<P> configManager;
private final CacheManager<P> cacheManager;

/**
* Constructs a new VehicleState with the specified {@link AHIPlatform}.
*
* @param platform The platform to use.
*/
public VehicleState(AHIPlatform<P> platform) {
this.platform = platform;
this.settings = platform.getConfigManager().getSettings();
this.configManager = platform.getConfigManager();
this.cacheManager = platform.getCacheManager();

platform.getLogManager().debug("Vehicle State listener has been set up.");
}

/**
* This function is called when an {@link PacketSendEvent} is triggered.
* Manages the state of various entities based on the event triggered.
*
* @param event The event that has been triggered.
*/
@Override
public void onPacketSend(PacketSendEvent event) {
final Settings settings = configManager.getSettings();
if (!settings.getEntityData().isEnabled()) return;
if (!settings.getEntityData().isPlayersOnly()) return;

final PacketTypeCommon type = event.getPacketType();

if (PacketType.Play.Server.SET_PASSENGERS == type) {
handleSetPassengers(new WrapperPlayServerSetPassengers(event), event.getUser());
handlePassengers(new WrapperPlayServerSetPassengers(event), event.getUser(), settings);
} else if (PacketType.Play.Server.ATTACH_ENTITY == type) {
handleAttachEntity(new WrapperPlayServerAttachEntity(event), event.getUser());
handleAttachEntity(new WrapperPlayServerAttachEntity(event), event.getUser(), settings);
}
}

private void handleSetPassengers(WrapperPlayServerSetPassengers packet, User user) {
private void handlePassengers(WrapperPlayServerSetPassengers packet, User user, Settings settings) {
int entityId = packet.getEntityId();
if (entityId == user.getEntityId()) return;
if (!validVehicle(user.getUUID(), entityId)) return;
if (entityId == user.getEntityId() || !isValidVehicle(user.getUUID(), entityId)) return;

int[] passengers = packet.getPassengers();

if (passengers.length > 0) {
cacheManager.updateVehiclePassenger(user.getUUID(), entityId, passengers[0]);
handlePassengerEvent(user, entityId, cacheManager.getVehicleHealth(user.getUUID(), entityId), true);
updatePassengerState(user, entityId, passengers[0], true, settings);
} else {
int passengerId = cacheManager.getPassengerId(user.getUUID(), entityId);
cacheManager.updateVehiclePassenger(user.getUUID(), entityId, -1);

if (user.getEntityId() == passengerId) {
handlePassengerEvent(user, entityId, 0.5F, false);
}
updatePassengerState(user, entityId, passengerId, false, settings);
}
}

private void handleAttachEntity(WrapperPlayServerAttachEntity packet, User user) {
private void handleAttachEntity(WrapperPlayServerAttachEntity packet, User user, Settings settings) {
int entityId = packet.getHoldingId();
if (entityId == user.getEntityId()) return;
if (!validVehicle(user.getUUID(), entityId)) return;
if (entityId == user.getEntityId() || !isValidVehicle(user.getUUID(), entityId)) return;

int passengerId = packet.getAttachedId();

if (entityId > 0) {
cacheManager.updateVehiclePassenger(user.getUUID(), entityId, passengerId);
handlePassengerEvent(user, entityId, cacheManager.getVehicleHealth(user.getUUID(), entityId), true);
updatePassengerState(user, entityId, passengerId, true, settings);
} else {
// With the Entity Attach packet, the entity ID is set to -1 when the entity is detached;
// Thus we need to retrieve the vehicle we stepped of by using a reverse lookup by passenger ID
int reversedEntityId = cacheManager.getEntityIdByPassengerId(user.getUUID(), passengerId);
cacheManager.updateVehiclePassenger(user.getUUID(), reversedEntityId, -1);

if (user.getEntityId() == passengerId) {
handlePassengerEvent(user, reversedEntityId, 0.5F, false);
}
updatePassengerState(user, reversedEntityId, passengerId, false, settings);
}
}

private boolean validVehicle(UUID user, int entityId) {
CachedEntity cachedEntity = cacheManager.getCachedEntity(user, entityId).orElse(null);
if (cachedEntity == null) return false;
private void updatePassengerState(User user, int vehicleId, int passengerId, boolean entering, Settings settings) {
cacheManager.updateVehiclePassenger(user.getUUID(), vehicleId, entering ? passengerId : -1);
if (entering || user.getEntityId() == passengerId) {
float healthValue = entering ? cacheManager.getVehicleHealth(user.getUUID(), vehicleId) : 0.5F;
sendVehicleHealthUpdate(user, vehicleId, healthValue, entering, settings);
}
}

EntityType entityType = cachedEntity.getEntityType();
return RidableEntities.isRideable(entityType);
private boolean isValidVehicle(UUID userUUID, int entityId) {
return cacheManager.getCachedEntity(userUUID, entityId)
.map(CachedEntity::getEntityType)
.map(RidableEntities::isRideable)
.orElse(false);
}

private void handlePassengerEvent(User user, int vehicleId, float healthValue, boolean entering) {
private void sendVehicleHealthUpdate(User user, int vehicleId, float healthValue, boolean entering, Settings settings) {
platform.getScheduler().runAsyncTask((o) -> {
if (!entering && settings.isAllowBypass()) {
if (platform.hasPermission(user.getUUID(), "AntiHealthIndicator.Bypass")) return;
if (!entering && settings.isAllowBypass() && platform.hasPermission(user.getUUID(), "AntiHealthIndicator.Bypass")) {
return;
}

List<EntityData> metadata = Collections.singletonList(new EntityData(new MetadataIndex(user.getClientVersion()).HEALTH, EntityDataTypes.FLOAT, healthValue));
List<EntityData> metadata = Collections.singletonList(
new EntityData(
new MetadataIndex(user.getClientVersion()).HEALTH,
EntityDataTypes.FLOAT,
healthValue
)
);

user.sendPacketSilently(new WrapperPlayServerEntityMetadata(vehicleId, metadata));
});
}
Expand Down
Loading

0 comments on commit f48d943

Please sign in to comment.