per player entities
This commit is contained in:
parent
0d99f705e8
commit
ccea96a6ad
4 changed files with 86 additions and 6 deletions
|
@ -92,6 +92,11 @@ public class WrapperEntity implements Tickable {
|
|||
return true;
|
||||
}
|
||||
|
||||
public PacketWrapper<?> getSpawnPacket(User user) {
|
||||
// TODO: Version/EntityType compatibility
|
||||
return SpawnPacketProvider.GENERAL.provide(this);
|
||||
}
|
||||
|
||||
public boolean spawn(Location location) {
|
||||
return spawn(location, EntityLib.getApi().getDefaultContainer());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
package me.tofaa.entitylib.wrapper;
|
||||
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.player.User;
|
||||
import com.github.retrooper.packetevents.protocol.world.Location;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Generic utility for per player wrapper entities.
|
||||
* These spawn in the same spot for everyone.
|
||||
*/
|
||||
public class WrapperPerPlayerEntity {
|
||||
|
||||
private final Map<UUID, WrapperEntity> entities = new ConcurrentHashMap<>();
|
||||
private Function<User, WrapperEntity> baseSupplier;
|
||||
|
||||
public WrapperPerPlayerEntity(Function<User, WrapperEntity> baseSupplier) {
|
||||
this.baseSupplier = baseSupplier;
|
||||
}
|
||||
|
||||
public void setBaseSupplier(Function<User, WrapperEntity> baseSupplier) {
|
||||
this.baseSupplier = baseSupplier;
|
||||
}
|
||||
|
||||
public Function<User, WrapperEntity> getBaseSupplier() {
|
||||
return baseSupplier;
|
||||
}
|
||||
|
||||
public void spawn(Location location) {
|
||||
if (check(WrapperEntity::isSpawned)) {
|
||||
return;
|
||||
}
|
||||
execute(e -> e.spawn(location));
|
||||
}
|
||||
|
||||
public void addViewer(User user) {
|
||||
getEntityOf(user).addViewer(user);
|
||||
}
|
||||
|
||||
public void removeViewer(User user) {
|
||||
getEntityOf(user).removeViewer(user);
|
||||
}
|
||||
|
||||
public void execute(Consumer<WrapperEntity> consumer) {
|
||||
entities.values().forEach(consumer);
|
||||
}
|
||||
|
||||
public boolean check(Predicate<WrapperEntity> predicate) {
|
||||
if (entities.isEmpty()) return false;
|
||||
WrapperEntity e= entities.values().stream().findFirst().get();
|
||||
return predicate.test(e);
|
||||
}
|
||||
|
||||
public void modify(User user, Consumer<WrapperEntity> consumer) {
|
||||
consumer.accept(getEntityOf(user));
|
||||
}
|
||||
|
||||
public WrapperEntity getEntityOf(User user) {
|
||||
if (this.entities.containsKey(user.getUUID())) {
|
||||
return this.entities.get(user.getUUID());
|
||||
}
|
||||
else {
|
||||
WrapperEntity e = baseSupplier.apply(user);
|
||||
this.entities.put(user.getUUID(), e);
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -7,6 +7,6 @@ import me.tofaa.entitylib.wrapper.WrapperEntity;
|
|||
@FunctionalInterface
|
||||
public interface SpawnPacketProvider<T extends PacketWrapper<T>> extends SpawnPacketProviders {
|
||||
|
||||
T provide(User user, WrapperEntity entity);
|
||||
T provide(WrapperEntity entity);
|
||||
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ import java.util.Optional;
|
|||
|
||||
interface SpawnPacketProviders {
|
||||
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnExperienceOrb> EXPERIENCE_ORB = (user, entity) -> {
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnExperienceOrb> EXPERIENCE_ORB = (entity) -> {
|
||||
Check.stateCondition(!(entity instanceof WrapperExperienceOrbEntity), "Attempted to use spawn packet provider for Experience orbs on a non ExperienceOrb entity. Please use an instance of WrapperExperienceOrbEntity.");
|
||||
WrapperExperienceOrbEntity expEntity = (WrapperExperienceOrbEntity) entity;
|
||||
return new WrapperPlayServerSpawnExperienceOrb(
|
||||
|
@ -25,7 +25,7 @@ interface SpawnPacketProviders {
|
|||
);
|
||||
};
|
||||
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnEntity> GENERAL = (user, entity) -> {
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnEntity> GENERAL = (entity) -> {
|
||||
Location location = entity.getLocation();
|
||||
return new WrapperPlayServerSpawnEntity(
|
||||
entity.getEntityId(),
|
||||
|
@ -40,10 +40,10 @@ interface SpawnPacketProviders {
|
|||
);
|
||||
};
|
||||
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnWeatherEntity> LEGACY_WEATHER_ENTITY = (user, entity) -> {
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnWeatherEntity> LEGACY_WEATHER_ENTITY = (entity) -> {
|
||||
throw new NotImplementedException();
|
||||
};
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnPainting> LEGACY_PAINTING = (user, entity) -> {
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnPainting> LEGACY_PAINTING = (entity) -> {
|
||||
Check.stateCondition(!(entity.getEntityMeta() instanceof PaintingMeta), "Attempted to use spawn packet provider for paintings but not using an entity with PaintingMeta.");
|
||||
PaintingMeta meta = entity.getEntityMeta(PaintingMeta.class);
|
||||
return new WrapperPlayServerSpawnPainting(
|
||||
|
@ -55,7 +55,7 @@ interface SpawnPacketProviders {
|
|||
);
|
||||
};
|
||||
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnLivingEntity> PRE_1_19_LIVING = (user, entity) -> {
|
||||
@NotNull SpawnPacketProvider<WrapperPlayServerSpawnLivingEntity> PRE_1_19_LIVING = (entity) -> {
|
||||
Location location = entity.getLocation();
|
||||
return new WrapperPlayServerSpawnLivingEntity(
|
||||
entity.getEntityId(),
|
||||
|
|
Loading…
Reference in a new issue