Skip to content

Commit

Permalink
Stable release ready? I think
Browse files Browse the repository at this point in the history
  • Loading branch information
Tofaa2 committed Nov 27, 2023
1 parent 0ace331 commit 1cd57b7
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 5 deletions.
89 changes: 88 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,89 @@
# EntityLib
A PacketEvents based utility library for generating and working with EntityMeta and other Entity features
EntityLib is a PacketEvents addon that provides an abstraction over raw entity data and packets to make it easier to work with entities as a whole.


## Features
- Full EntityMeta support
- Creation of WrapperEntities
- Keeping track of entities.


## Usage

For more realistic examples, please take a look at the `test-plugin` module. It has an example `Bukkit` plugin that uses EntityLib.

### Using the EntityMeta api

```java
import java.sql.Wrapper;

class Example {

public static void main(String[] args) {
PacketEventsAPI api = ;// create PacketEventsAPI instance
EntityLib.init(api); // If failed, it will throw an exception.

// Making a random entity using packet events raw, i strongly recommend using the EntityLib#createEntity method instead
int entityID = 1;
WrapperPlayServerSpawnEntity packet = new WrapperPlayServerSpawnEntity(constructor args);
EntityMeta meta = EntityLib.createMeta(entityId, EntityType);
// You can cast the meta to the correct type depending on the entity type
PigMeta pigMeta = (PigMeta) meta;

// Once you're done modifying the meta accordingly, you can convert it to a packet, and send it to whoever you want for them to see the changes.
WrapperPlayServerEntityMetadata metaPacket = meta.createPacket();
User.sendPacket(metaPacket);;
}

}
```

### Creating a WrapperEntity

```java
import javax.xml.stream.Location;

class Example {

public static void main(String[] args) {
PacketEventsAPI api = ;// create PacketEventsAPI instance
EntityLib.init(api); // If failed, it will throw an exception.

WrapperEntity entity = EntityLib.createEntity(UUID, EntityType);
// You can keep track of the entity yourself or store its entityId or uuid and fetch it using EntityLib#getEntity

// Handling entity interactions if needed
// By default EntityLib will ignore interaction packets and not handle them. You can enable this if needed
EntityLib.enableEntityInteractions(); // Now we need to create an interaction handler
EntityLib.setInteractionProcessor(EntityInteractionProcessor);


// Entities also have access to the EntityMeta api, the EntityMeta api can be used seperately from wrapper entities but also can be used together
EntityMeta meta = entity.getEntityMeta();
// Depending on the entity type, you can safely cast the meta to the correct type
PigMeta meta1 = (PigMeta) meta; // If the entity type is EntityTypes.PIG

// adding a viewer to the entity can be done before or after spawn, doesnt matter
entity.addViewer(User); // UUID also applicable
entity.removeViewer(User); // UUID also applicable

entity.spawn(Location); // Spawns the entity at the given location
entity.remove(); // Removes the entity from the world
entity.rotateHead(float yaw, float pitch); // Rotates the head of the entity
entity.teleport(Location); // Teleports the entity to the given location.

// If the entityId provider for WrapperEntities is not working for you or needs changing, you can get it from WrapperEntity#ID_PROVIDER
// You can also set it to a custom provider if needed
WrapperEntity.ID_PROVIDER = new EntityIdProvider() {
@Override
public int getEntityId() {
return 0;
}
};

// You can also create the EntityLib default provider by calling EntityIdProvider.simple();
}

}

```
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ allprojects {


dependencies {
compileOnlyApi("com.github.retrooper.packetevents:spigot:2.0.2")
compileOnlyApi("com.github.retrooper.packetevents:spigot:2.1.0")
}

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package me.tofaa.entitylib;
package me.tofaa.entitylib.entity;


import java.util.concurrent.atomic.AtomicInteger;
Expand Down
19 changes: 18 additions & 1 deletion src/main/java/me/tofaa/entitylib/entity/WrapperEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
import com.github.retrooper.packetevents.protocol.world.Location;
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDestroyEntities;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityRotation;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityTeleport;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity;
import me.tofaa.entitylib.EntityIdProvider;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.meta.EntityMeta;
import org.jetbrains.annotations.NotNull;
Expand All @@ -28,6 +28,7 @@ public class WrapperEntity {
private final Set<UUID> viewers = new HashSet<>();

private Location location;
private boolean onGround;
private boolean spawned;

public WrapperEntity(@NotNull UUID uuid, EntityType entityType, EntityMeta meta) {
Expand Down Expand Up @@ -57,6 +58,21 @@ public boolean spawn(Location location) {
return true;
}

public void rotateHead(float yaw, float pitch) {
sendPacketToViewers(
new WrapperPlayServerEntityRotation(entityId, yaw, pitch, onGround)
);
}


private static double distance(Location to, Location from) {
double x = to.getX() - from.getX();
double y = to.getY() - from.getY();
double z = to.getZ() - from.getZ();
return Math.sqrt(x * x + y * y + z * z);
}


public void remove() {
if (!spawned) return;
spawned = false;
Expand All @@ -65,6 +81,7 @@ public void remove() {

public void teleport(Location location, boolean onGround) {
this.location = location;
this.onGround = onGround;
sendPacketToViewers(
new WrapperPlayServerEntityTeleport(entityId, location, onGround)
);
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/me/tofaa/entitylib/meta/EntityMeta.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,19 @@

import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.manager.server.VersionComparison;
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.data.EntityMetadataProvider;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.exception.InvalidVersionException;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;

public class EntityMeta {
import java.util.List;

public class EntityMeta implements EntityMetadataProvider {

public static final byte OFFSET = 0;
public static final byte MAX_OFFSET = OFFSET + 8;
Expand Down Expand Up @@ -193,4 +197,8 @@ protected void setMaskBit(int index, byte bit, boolean value) {
setMask((byte)index, mask);
}

@Override
public List<EntityData> entityData() {
return metadata.getEntries();
}
}

0 comments on commit 1cd57b7

Please sign in to comment.