This commit is contained in:
zimzaza4
2024-07-16 22:46:13 +08:00
parent 80f4c5dfae
commit 0cb354bfa8
6 changed files with 38 additions and 751 deletions

View File

@@ -110,7 +110,7 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>me.zimzaza4</groupId> <groupId>com.github.geyserextensionists</groupId>
<artifactId>geyserutils-spigot</artifactId> <artifactId>geyserutils-spigot</artifactId>
<version>1.0.0</version> <version>1.0.0</version>
<scope>system</scope> <scope>system</scope>

View File

@@ -8,7 +8,7 @@ import com.ticxo.modelengine.api.generator.blueprint.ModelBlueprint;
import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.ModeledEntity; import com.ticxo.modelengine.api.model.ModeledEntity;
import com.ticxo.modelengine.api.model.render.ModelRenderer; import com.ticxo.modelengine.api.model.render.ModelRenderer;
import me.zimzaza4.geyserutils.spigot.api.PlayerUtils; import me.zimzaza4.geyserutils.spigot.api.EntityUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;

View File

@@ -8,12 +8,15 @@ import com.ticxo.modelengine.api.model.bone.ModelBone;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.zimzaza4.geyserutils.common.animation.Animation; import me.zimzaza4.geyserutils.common.animation.Animation;
import me.zimzaza4.geyserutils.spigot.GeyserUtils;
import me.zimzaza4.geyserutils.spigot.api.EntityUtils;
import me.zimzaza4.geyserutils.spigot.api.PlayerUtils; import me.zimzaza4.geyserutils.spigot.api.PlayerUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.FloodgateApi;
import org.jetbrains.annotations.NotNull;
import org.joml.Vector3f; import org.joml.Vector3f;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import re.imc.geysermodelengine.packet.entity.PacketEntity; import re.imc.geysermodelengine.packet.entity.PacketEntity;
@@ -21,6 +24,7 @@ import re.imc.geysermodelengine.packet.entity.PacketEntity;
import java.awt.*; import java.awt.*;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import static re.imc.geysermodelengine.model.ModelEntity.ENTITIES; import static re.imc.geysermodelengine.model.ModelEntity.ENTITIES;
import static re.imc.geysermodelengine.model.ModelEntity.MODEL_ENTITIES; import static re.imc.geysermodelengine.model.ModelEntity.MODEL_ENTITIES;
@@ -184,12 +188,11 @@ public class EntityTask {
} }
public void sendEntityData(Player player, int delay) { public void sendEntityData(Player player, int delay) {
PlayerUtils.setCustomEntity(player, model.getEntity().getEntityId(), "modelengine:" + model.getActiveModel().getBlueprint().getName().toLowerCase()); EntityUtils.setCustomEntity(player, model.getEntity().getEntityId(), "modelengine:" + model.getActiveModel().getBlueprint().getName().toLowerCase());
Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> { Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> {
// PlayerUtils.sendCustomSkin(player, model.getEntity(), model.getActiveModel().getBlueprint().getName()); // EntityUtils.sendCustomSkin(player, model.getEntity(), model.getActiveModel().getBlueprint().getName());
model.getEntity().sendSpawnPacket(Collections.singletonList(player));
model.getEntity().sendSpawnPacket(Collections.singletonList(player));
Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> { Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> {
if (looping) { if (looping) {
playBedrockAnimation(lastAnimation, Set.of(player), looping, 0f); playBedrockAnimation(lastAnimation, Set.of(player), looping, 0f);
@@ -208,7 +211,7 @@ public class EntityTask {
float average = (scale.x + scale.y + scale.z) / 3; float average = (scale.x + scale.y + scale.z) / 3;
if (average == lastScale) return; if (average == lastScale) return;
PlayerUtils.sendCustomScale(player, model.getEntity(), average); EntityUtils.sendCustomScale(player, model.getEntity().getEntityId(), average);
if (ignore) return; if (ignore) return;
lastScale = average; lastScale = average;
@@ -220,7 +223,7 @@ public class EntityTask {
Color color = new Color(model.getActiveModel().getDefaultTint().asARGB()); Color color = new Color(model.getActiveModel().getDefaultTint().asARGB());
if (color.equals(lastColor)) return; if (color.equals(lastColor)) return;
PlayerUtils.sendCustomColor(player, model.getEntity(), color); EntityUtils.sendCustomColor(player, model.getEntity().getEntityId(), color);
if (ignore) return; if (ignore) return;
lastColor = color; lastColor = color;
@@ -232,7 +235,7 @@ public class EntityTask {
} }
public void updateEntityProperties(Player player, boolean ignore) { public void updateEntityProperties(Player player, boolean ignore) {
Entity entity = model.getEntity(); int entity = model.getEntity().getEntityId();
Map<String, Boolean> updates = new HashMap<>(); Map<String, Boolean> updates = new HashMap<>();
model.getActiveModel().getBones().forEach((s,bone) -> { model.getActiveModel().getBones().forEach((s,bone) -> {
@@ -250,7 +253,7 @@ public class EntityTask {
updates.put(currentAnimProperty, true); updates.put(currentAnimProperty, true);
} }
if (updates.isEmpty()) return; if (updates.isEmpty()) return;
PlayerUtils.sendBoolProperties(player, entity, updates); EntityUtils.sendBoolProperties(player, entity, updates);
} }
private String unstripName(ModelBone bone) { private String unstripName(ModelBone bone) {
@@ -265,13 +268,13 @@ public class EntityTask {
public void sendHitBoxToAll() { public void sendHitBoxToAll() {
for (Player viewer : model.getViewers()) { for (Player viewer : model.getViewers()) {
PlayerUtils.sendCustomHitBox(viewer, model.getEntity(), 0.01f, 0.01f); EntityUtils.sendCustomHitBox(viewer, model.getEntity().getEntityId(), 0.01f, 0.01f);
} }
} }
public void sendHitBox(Player viewer) { public void sendHitBox(Player viewer) {
PlayerUtils.sendCustomHitBox(viewer, model.getEntity(), 0.01f, 0.01f); EntityUtils.sendCustomHitBox(viewer, model.getEntity().getEntityId(), 0.01f, 0.01f);
} }
@@ -329,7 +332,7 @@ public class EntityTask {
public void playStopBedrockAnimation(String animationId) { public void playStopBedrockAnimation(String animationId) {
Entity entity = model.getEntity(); int entity = model.getEntity().getEntityId();
Set<Player> viewers = model.getViewers(); Set<Player> viewers = model.getViewers();
// model.getViewers().forEach(viewer -> viewer.sendActionBar("CURRENT AN:" + "STOP")); // model.getViewers().forEach(viewer -> viewer.sendActionBar("CURRENT AN:" + "STOP"));
@@ -342,7 +345,7 @@ public class EntityTask {
.blendOutTime(0f); .blendOutTime(0f);
for (Player viewer : viewers) { for (Player viewer : viewers) {
PlayerUtils.playEntityAnimation(viewer, animation.build(), entity); PlayerUtils.playEntityAnimation(viewer, animation.build(), Collections.singletonList(entity));
} }
} }
@@ -353,7 +356,7 @@ public class EntityTask {
// model.getViewers().forEach(viewer -> viewer.sendActionBar("CURRENT AN:" + animationId)); // model.getViewers().forEach(viewer -> viewer.sendActionBar("CURRENT AN:" + animationId));
Entity entity = model.getEntity(); int entity = model.getEntity().getEntityId();
Animation.AnimationBuilder animation = Animation.builder() Animation.AnimationBuilder animation = Animation.builder()
.animation(animationId) .animation(animationId)
@@ -363,12 +366,12 @@ public class EntityTask {
animation.nextState(animationId); animation.nextState(animationId);
} }
for (Player viewer : viewers) { for (Player viewer : viewers) {
PlayerUtils.playEntityAnimation(viewer, animation.build(), entity); PlayerUtils.playEntityAnimation(viewer, animation.build(), Collections.singletonList(entity));
} }
} }
private boolean canSee(Player player, Entity entity) { private boolean canSee(Player player, PacketEntity entity) {
if (!player.isOnline()) { if (!player.isOnline()) {
return false; return false;
} }
@@ -379,7 +382,7 @@ public class EntityTask {
return false; return false;
} }
if (entity.getChunk() == player.getChunk()) { if (entity.getLocation().getChunk() == player.getChunk()) {
return true; return true;
} }

View File

@@ -20,8 +20,9 @@ public class EntityTeleportPacket implements WrapperPacket {
packet.getDoubles().write(0, loc.getX()); packet.getDoubles().write(0, loc.getX());
packet.getDoubles().write(1, loc.getY()); packet.getDoubles().write(1, loc.getY());
packet.getDoubles().write(2, loc.getZ()); packet.getDoubles().write(2, loc.getZ());
packet.getBytes().write(1, (byte) (loc.getPitch() * 256.0F / 360.0F));
packet.getBytes().write(0, (byte) (loc.getYaw() * 256.0F / 360.0F)); packet.getBytes().write(0, (byte) (loc.getYaw() * 256.0F / 360.0F));
packet.getBytes().write(1, (byte) (loc.getPitch() * 256.0F / 360.0F));
return packet; return packet;
} }
} }

View File

@@ -1,35 +1,20 @@
package re.imc.geysermodelengine.packet.entity; package re.imc.geysermodelengine.packet.entity;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import io.papermc.paper.entity.TeleportFlag; import org.bukkit.Location;
import io.papermc.paper.threadedregions.scheduler.EntityScheduler; import org.bukkit.entity.EntityType;
import net.kyori.adventure.text.Component; import org.bukkit.entity.Player;
import org.bukkit.*;
import org.bukkit.block.BlockFace;
import org.bukkit.block.PistonMoveReaction;
import org.bukkit.entity.*;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.plugin.Plugin;
import org.bukkit.util.BoundingBox;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import re.imc.geysermodelengine.packet.*; import re.imc.geysermodelengine.packet.*;
import java.util.*; import java.util.Collection;
import java.util.concurrent.CompletableFuture; import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
public class PacketEntity implements Entity { public class PacketEntity {
public PacketEntity(EntityType type, Set<Player> viewers, Location location) { public PacketEntity(EntityType type, Set<Player> viewers, Location location) {
this.id = ThreadLocalRandom.current().nextInt(20000, 100000000); this.id = ThreadLocalRandom.current().nextInt(300000000, 400000000);
this.uuid = UUID.randomUUID(); this.uuid = UUID.randomUUID();
this.type = type; this.type = type;
this.viewers = viewers; this.viewers = viewers;
@@ -42,12 +27,11 @@ public class PacketEntity implements Entity {
private Set<Player> viewers; private Set<Player> viewers;
private Location location; private Location location;
private boolean removed = false; private boolean removed = false;
@Override
public @NotNull Location getLocation() { public @NotNull Location getLocation() {
return location; return location;
} }
@Override
public boolean teleport(@NotNull Location location) { public boolean teleport(@NotNull Location location) {
this.location = location.clone(); this.location = location.clone();
sendLocationPacket(viewers); sendLocationPacket(viewers);
@@ -55,19 +39,15 @@ public class PacketEntity implements Entity {
} }
@Override
public void remove() { public void remove() {
removed = true; removed = true;
sendEntityDestroyPacket(viewers); sendEntityDestroyPacket(viewers);
} }
@Override
public boolean isDead() { public boolean isDead() {
return removed; return removed;
} }
@Override
public boolean isValid() { public boolean isValid() {
return !removed; return !removed;
} }
@@ -75,9 +55,13 @@ public class PacketEntity implements Entity {
public void sendSpawnPacket(Collection<Player> players) { public void sendSpawnPacket(Collection<Player> players) {
EntitySpawnPacket packet = new EntitySpawnPacket(id, uuid, type, location); EntitySpawnPacket packet = new EntitySpawnPacket(id, uuid, type, location);
EntityMetadataPacket metadataPacket = new EntityMetadataPacket(id); EntityMetadataPacket metadataPacket = new EntityMetadataPacket(id);
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode()));
players.forEach(player -> {
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode());
});
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, metadataPacket.encode())); players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, metadataPacket.encode()));
} }
public void sendLocationPacket(Collection<Player> players) { public void sendLocationPacket(Collection<Player> players) {
EntityTeleportPacket packet = new EntityTeleportPacket(id, location); EntityTeleportPacket packet = new EntityTeleportPacket(id, location);
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode())); players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode()));
@@ -94,710 +78,9 @@ public class PacketEntity implements Entity {
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode())); players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode()));
} }
@Override
public int getEntityId() { public int getEntityId() {
return id; return id;
} }
// ----------------
@Override
public @Nullable Location getLocation(@Nullable Location location) {
return null;
}
@Override
public void setVelocity(@NotNull Vector vector) {
}
@Override
public @NotNull Vector getVelocity() {
return null;
}
@Override
public double getHeight() {
return 0;
}
@Override
public double getWidth() {
return 0;
}
@Override
public @NotNull BoundingBox getBoundingBox() {
return null;
}
@Override
public boolean isOnGround() {
return false;
}
@Override
public boolean isInWater() {
return false;
}
@Override
public @NotNull World getWorld() {
return null;
}
@Override
public void setRotation(float v, float v1) {
}
@Override
public boolean teleport(@NotNull Location location, PlayerTeleportEvent.@NotNull TeleportCause teleportCause, @NotNull TeleportFlag @NotNull ... teleportFlags) {
return false;
}
@Override
public boolean teleport(@NotNull Location location, PlayerTeleportEvent.@NotNull TeleportCause teleportCause) {
return false;
}
@Override
public boolean teleport(@NotNull Entity entity) {
return false;
}
@Override
public boolean teleport(@NotNull Entity entity, PlayerTeleportEvent.@NotNull TeleportCause teleportCause) {
return false;
}
@Override
public @NotNull CompletableFuture<Boolean> teleportAsync(@NotNull Location location, PlayerTeleportEvent.@NotNull TeleportCause teleportCause, @NotNull TeleportFlag @NotNull ... teleportFlags) {
return null;
}
@Override
public @NotNull List<Entity> getNearbyEntities(double v, double v1, double v2) {
return null;
}
@Override
public int getFireTicks() {
return 0;
}
@Override
public int getMaxFireTicks() {
return 0;
}
@Override
public void setFireTicks(int i) {
}
@Override
public void setVisualFire(boolean b) {
}
@Override
public boolean isVisualFire() {
return false;
}
@Override
public int getFreezeTicks() {
return 0;
}
@Override
public int getMaxFreezeTicks() {
return 0;
}
@Override
public void setFreezeTicks(int i) {
}
@Override
public boolean isFrozen() {
return false;
}
@Override
public void setInvisible(boolean b) {
}
@Override
public boolean isInvisible() {
return false;
}
@Override
public void setNoPhysics(boolean b) {
}
@Override
public boolean hasNoPhysics() {
return false;
}
@Override
public boolean isFreezeTickingLocked() {
return false;
}
@Override
public void lockFreezeTicks(boolean b) {
}
@Override
public void sendMessage(@NotNull String s) {
}
@Override
public void sendMessage(@NotNull String... strings) {
}
@Override
public void sendMessage(@Nullable UUID uuid, @NotNull String s) {
}
@Override
public void sendMessage(@Nullable UUID uuid, @NotNull String... strings) {
}
@Override
public @NotNull Server getServer() {
return null;
}
@Override
public @NotNull String getName() {
return null;
}
@Override
public boolean isPersistent() {
return false;
}
@Override
public void setPersistent(boolean b) {
}
@Override
public @Nullable Entity getPassenger() {
return null;
}
@Override
public boolean setPassenger(@NotNull Entity entity) {
return false;
}
@Override
public @NotNull List<Entity> getPassengers() {
return null;
}
@Override
public boolean addPassenger(@NotNull Entity entity) {
return false;
}
@Override
public boolean removePassenger(@NotNull Entity entity) {
return false;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean eject() {
return false;
}
@Override
public float getFallDistance() {
return 0;
}
@Override
public void setFallDistance(float v) {
}
@Override
public void setLastDamageCause(@Nullable EntityDamageEvent entityDamageEvent) {
}
@Override
public @Nullable EntityDamageEvent getLastDamageCause() {
return null;
}
@Override
public @NotNull UUID getUniqueId() {
return null;
}
@Override
public int getTicksLived() {
return 0;
}
@Override
public void setTicksLived(int i) {
}
@Override
public void playEffect(@NotNull EntityEffect entityEffect) {
}
@Override
public @NotNull EntityType getType() {
return null;
}
@Override
public @NotNull Sound getSwimSound() {
return null;
}
@Override
public @NotNull Sound getSwimSplashSound() {
return null;
}
@Override
public @NotNull Sound getSwimHighSpeedSplashSound() {
return null;
}
@Override
public boolean isInsideVehicle() {
return false;
}
@Override
public boolean leaveVehicle() {
return false;
}
@Override
public @Nullable Entity getVehicle() {
return null;
}
@Override
public void setCustomNameVisible(boolean b) {
}
@Override
public boolean isCustomNameVisible() {
return false;
}
@Override
public void setVisibleByDefault(boolean b) {
}
@Override
public boolean isVisibleByDefault() {
return false;
}
@Override
public @NotNull Set<Player> getTrackedBy() {
return null;
}
@Override
public void setGlowing(boolean b) {
}
@Override
public boolean isGlowing() {
return false;
}
@Override
public void setInvulnerable(boolean b) {
}
@Override
public boolean isInvulnerable() {
return false;
}
@Override
public boolean isSilent() {
return false;
}
@Override
public void setSilent(boolean b) {
}
@Override
public boolean hasGravity() {
return false;
}
@Override
public void setGravity(boolean b) {
}
@Override
public int getPortalCooldown() {
return 0;
}
@Override
public void setPortalCooldown(int i) {
}
@Override
public @NotNull Set<String> getScoreboardTags() {
return null;
}
@Override
public boolean addScoreboardTag(@NotNull String s) {
return false;
}
@Override
public boolean removeScoreboardTag(@NotNull String s) {
return false;
}
@Override
public @NotNull PistonMoveReaction getPistonMoveReaction() {
return null;
}
@Override
public @NotNull BlockFace getFacing() {
return null;
}
@Override
public @NotNull Pose getPose() {
return null;
}
@Override
public boolean isSneaking() {
return false;
}
@Override
public void setSneaking(boolean b) {
}
@Override
public void setPose(@NotNull Pose pose, boolean b) {
}
@Override
public boolean hasFixedPose() {
return false;
}
@Override
public @NotNull SpawnCategory getSpawnCategory() {
return null;
}
@Override
public boolean isInWorld() {
return false;
}
@Override
public @Nullable EntitySnapshot createSnapshot() {
return null;
}
@Override
public @NotNull Entity copy() {
return null;
}
@Override
public @NotNull Entity copy(@NotNull Location location) {
return null;
}
@Override
public @NotNull Spigot spigot() {
return null;
}
@Override
public @NotNull Component name() {
return null;
}
@Override
public @NotNull Component teamDisplayName() {
return null;
}
@Override
public @Nullable Location getOrigin() {
return null;
}
@Override
public boolean fromMobSpawner() {
return false;
}
@Override
public CreatureSpawnEvent.@NotNull SpawnReason getEntitySpawnReason() {
return null;
}
@Override
public boolean isUnderWater() {
return false;
}
@Override
public boolean isInRain() {
return false;
}
@Override
public boolean isInBubbleColumn() {
return false;
}
@Override
public boolean isInWaterOrRain() {
return false;
}
@Override
public boolean isInWaterOrBubbleColumn() {
return false;
}
@Override
public boolean isInWaterOrRainOrBubbleColumn() {
return false;
}
@Override
public boolean isInLava() {
return false;
}
@Override
public boolean isTicking() {
return false;
}
@Override
public @NotNull Set<Player> getTrackedPlayers() {
return null;
}
@Override
public boolean spawnAt(@NotNull Location location, CreatureSpawnEvent.@NotNull SpawnReason spawnReason) {
return false;
}
@Override
public boolean isInPowderedSnow() {
return false;
}
@Override
public double getX() {
return 0;
}
@Override
public double getY() {
return 0;
}
@Override
public double getZ() {
return 0;
}
@Override
public float getPitch() {
return 0;
}
@Override
public float getYaw() {
return 0;
}
@Override
public boolean collidesAt(@NotNull Location location) {
return false;
}
@Override
public boolean wouldCollideUsing(@NotNull BoundingBox boundingBox) {
return false;
}
@Override
public @NotNull EntityScheduler getScheduler() {
return null;
}
@Override
public @NotNull String getScoreboardEntryName() {
return null;
}
@Override
public @Nullable Component customName() {
return null;
}
@Override
public void customName(@Nullable Component component) {
}
@Override
public @Nullable String getCustomName() {
return null;
}
@Override
public void setCustomName(@Nullable String s) {
}
@Override
public void setMetadata(@NotNull String s, @NotNull MetadataValue metadataValue) {
}
@Override
public @NotNull List<MetadataValue> getMetadata(@NotNull String s) {
return null;
}
@Override
public boolean hasMetadata(@NotNull String s) {
return false;
}
@Override
public void removeMetadata(@NotNull String s, @NotNull Plugin plugin) {
}
@Override
public boolean isPermissionSet(@NotNull String s) {
return false;
}
@Override
public boolean isPermissionSet(@NotNull Permission permission) {
return false;
}
@Override
public boolean hasPermission(@NotNull String s) {
return false;
}
@Override
public boolean hasPermission(@NotNull Permission permission) {
return false;
}
@Override
public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String s, boolean b) {
return null;
}
@Override
public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin) {
return null;
}
@Override
public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String s, boolean b, int i) {
return null;
}
@Override
public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, int i) {
return null;
}
@Override
public void removeAttachment(@NotNull PermissionAttachment permissionAttachment) {
}
@Override
public void recalculatePermissions() {
}
@Override
public @NotNull Set<PermissionAttachmentInfo> getEffectivePermissions() {
return null;
}
@Override
public boolean isOp() {
return false;
}
@Override
public void setOp(boolean b) {
}
@Override
public @NotNull PersistentDataContainer getPersistentDataContainer() {
return null;
}
} }