Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cb3a706
commit d4e5f98
Showing
8 changed files
with
652 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<modelVersion>4.0.0</modelVersion> | ||
<artifactId>nmsutils-v1_18_R1</artifactId> | ||
<parent> | ||
<groupId>de.cubeside.nmsutils</groupId> | ||
<artifactId>nmsutils-parent</artifactId> | ||
<version>0.0.1-SNAPSHOT</version> | ||
</parent> | ||
<dependencies> | ||
<dependency> | ||
<groupId>io.papermc.paper</groupId> | ||
<artifactId>paper-api</artifactId> | ||
<version>1.18-rc3-R0.1-SNAPSHOT</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.papermc.paper</groupId> | ||
<artifactId>paper-server</artifactId> | ||
<version>1.18-rc3-R0.1-SNAPSHOT</version> | ||
<classifier>mojang-mapped</classifier> | ||
<scope>provided</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>${project.groupId}</groupId> | ||
<artifactId>nmsutils-core</artifactId> | ||
<version>${project.version}</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
</dependencies> | ||
<repositories> | ||
<repository> | ||
<id>minecraft-repo</id> | ||
<url>https://libraries.minecraft.net/</url> | ||
</repository> | ||
<repository> | ||
<id>spigot-repo</id> | ||
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url> | ||
</repository> | ||
</repositories> | ||
<build> | ||
<plugins> | ||
<plugin> | ||
<artifactId>maven-compiler-plugin</artifactId> | ||
<version>3.8.1</version> | ||
<configuration> | ||
<release>17</release> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>net.md-5</groupId> | ||
<artifactId>specialsource-maven-plugin</artifactId> | ||
<version>1.2.3</version> | ||
<executions> | ||
<execution> | ||
<phase>package</phase> | ||
<goals> | ||
<goal>remap</goal> | ||
</goals> | ||
<id>remap-obf</id> | ||
<configuration> | ||
<srgIn>org.spigotmc:minecraft-server:1.18-rc3-R0.1-SNAPSHOT:txt:maps-mojang</srgIn> | ||
<reverse>true</reverse> | ||
<remappedDependencies>org.spigotmc:spigot:1.18-rc3-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies> | ||
<remappedArtifactAttached>true</remappedArtifactAttached> | ||
<remappedClassifierName>remapped-obf</remappedClassifierName> | ||
</configuration> | ||
</execution> | ||
<execution> | ||
<phase>package</phase> | ||
<goals> | ||
<goal>remap</goal> | ||
</goals> | ||
<id>remap-spigot</id> | ||
<configuration> | ||
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile> | ||
<srgIn>org.spigotmc:minecraft-server:1.18-rc3-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn> | ||
<remappedDependencies>org.spigotmc:spigot:1.18-rc3-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies> | ||
</configuration> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
</project> |
310 changes: 310 additions & 0 deletions
310
nmsutils-v1_18_R1/src/main/java/de/cubeside/nmsutils/v1_18_R1/EntityUtilsImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,310 @@ | ||
package de.cubeside.nmsutils.v1_18_R1; | ||
|
||
import com.destroystokyo.paper.entity.ai.VanillaGoal; | ||
import de.cubeside.nmsutils.EntityUtils; | ||
import de.cubeside.nmsutils.NMSUtils; | ||
import java.lang.reflect.Field; | ||
import java.util.function.Function; | ||
import java.util.logging.Level; | ||
import net.minecraft.core.BlockPos; | ||
import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; | ||
import net.minecraft.server.level.ChunkMap; | ||
import net.minecraft.server.level.ServerLevel; | ||
import net.minecraft.world.entity.Entity; | ||
import net.minecraft.world.entity.LivingEntity; | ||
import net.minecraft.world.entity.MoverType; | ||
import net.minecraft.world.entity.PathfinderMob; | ||
import net.minecraft.world.entity.ai.goal.FloatGoal; | ||
import net.minecraft.world.level.ChunkPos; | ||
import net.minecraft.world.level.entity.Visibility; | ||
import net.minecraft.world.phys.Vec3; | ||
import org.bukkit.Bukkit; | ||
import org.bukkit.Chunk; | ||
import org.bukkit.Location; | ||
import org.bukkit.World; | ||
import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; | ||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftBat; | ||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftCreature; | ||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; | ||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftMob; | ||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPiglin; | ||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftShulker; | ||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftVex; | ||
import org.bukkit.entity.Bat; | ||
import org.bukkit.entity.Creature; | ||
import org.bukkit.entity.EntityType; | ||
import org.bukkit.entity.Mob; | ||
import org.bukkit.entity.Vex; | ||
import org.bukkit.util.Vector; | ||
|
||
public class EntityUtilsImpl implements EntityUtils { | ||
private static final String FIELD_BAT_TARGET_NAME = "targetPosition"; | ||
|
||
private final NMSUtilsImpl nmsUtils; | ||
|
||
private Field fieldEntityTracker; | ||
private Field fieldBatTarget; | ||
|
||
public EntityUtilsImpl(NMSUtilsImpl nmsUtils) { | ||
this.nmsUtils = nmsUtils; | ||
} | ||
|
||
@Override | ||
public NMSUtils getNMSUtils() { | ||
return nmsUtils; | ||
} | ||
|
||
@Override | ||
public void clearAI(org.bukkit.entity.Entity entity) { | ||
if (entity instanceof Mob) { | ||
nmsUtils.getPlugin().getServer().getMobGoals().removeAllGoals((Mob) entity); | ||
} | ||
} | ||
|
||
@Override | ||
public void addGoalFloat(Mob mob) { | ||
if (!Bukkit.getMobGoals().hasGoal(mob, VanillaGoal.FLOAT)) { | ||
net.minecraft.world.entity.Mob h = ((CraftMob) mob).getHandle(); | ||
h.goalSelector.addGoal(1, new FloatGoal(h)); | ||
} | ||
} | ||
|
||
@Override | ||
public void addGoalLimitedStrollLand(Creature mob, double velocity, Function<Vector, Boolean> checkTargetFunction) { | ||
PathfinderMob h = ((CraftCreature) mob).getHandle(); | ||
h.goalSelector.addGoal(7, new PathfinderGoalLimitedRandomStrollLand(h, velocity, checkTargetFunction)); | ||
} | ||
|
||
@Override | ||
public int getShulkerOpenState(org.bukkit.entity.Entity shulker) { | ||
try { | ||
if (shulker.getType() != EntityType.SHULKER) { | ||
return 0; | ||
} | ||
CraftShulker cs = (CraftShulker) shulker; | ||
return cs.getHandle().getRawPeekAmount(); | ||
} catch (Exception e) { | ||
nmsUtils.getPlugin().getLogger().log(Level.SEVERE, "Could not get shulker open state", e); | ||
} | ||
return 0; | ||
} | ||
|
||
@Override | ||
public void setShulkerOpenState(org.bukkit.entity.Entity shulker, int state) { | ||
try { | ||
if (shulker.getType() != EntityType.SHULKER) { | ||
return; | ||
} | ||
state = Math.max(0, Math.min(Byte.MAX_VALUE, state)); | ||
CraftShulker cs = (CraftShulker) shulker; | ||
cs.getHandle().setRawPeekAmount(state); | ||
} catch (Exception e) { | ||
nmsUtils.getPlugin().getLogger().log(Level.SEVERE, "Could not set shulker open state", e); | ||
} | ||
} | ||
|
||
@Override | ||
public boolean isPiglinDancing(org.bukkit.entity.Entity piglin) { | ||
try { | ||
if (piglin.getType() != EntityType.PIGLIN) { | ||
return false; | ||
} | ||
CraftPiglin cs = (CraftPiglin) piglin; | ||
return cs.getHandle().isDancing(); | ||
} catch (Exception e) { | ||
nmsUtils.getPlugin().getLogger().log(Level.SEVERE, "Could not get piglin dancing state", e); | ||
} | ||
return false; | ||
} | ||
|
||
@Override | ||
public void setPiglinDancing(org.bukkit.entity.Entity piglin, boolean dancing) { | ||
try { | ||
if (piglin.getType() != EntityType.PIGLIN) { | ||
return; | ||
} | ||
CraftPiglin cs = (CraftPiglin) piglin; | ||
cs.getHandle().setDancing(dancing); | ||
} catch (Exception e) { | ||
nmsUtils.getPlugin().getLogger().log(Level.SEVERE, "Could not set piglin dancing state", e); | ||
} | ||
} | ||
|
||
@Override | ||
public void sendEntityPositionUpdate(org.bukkit.entity.Entity entity) { | ||
Entity handle = ((CraftEntity) entity).getHandle(); | ||
if (fieldEntityTracker == null) { | ||
try { | ||
fieldEntityTracker = Entity.class.getDeclaredField("tracker"); | ||
fieldEntityTracker.setAccessible(true); | ||
} catch (Exception e) { | ||
nmsUtils.getPlugin().getLogger().log(Level.SEVERE, "Could not get tracker field", e); | ||
} | ||
} | ||
try { | ||
ChunkMap.TrackedEntity ete = (ChunkMap.TrackedEntity) fieldEntityTracker.get(handle); | ||
if (ete != null) { | ||
ClientboundTeleportEntityPacket positionPacket = new ClientboundTeleportEntityPacket(handle); | ||
ete.seenBy.stream().forEach(viewer -> { | ||
viewer.send(positionPacket); | ||
}); | ||
} | ||
} catch (Exception e) { | ||
nmsUtils.getPlugin().getLogger().log(Level.SEVERE, "Could not send teleport packet", e); | ||
} | ||
} | ||
|
||
@Override | ||
public void moveEntity(org.bukkit.entity.Entity e, double x, double y, double z) { | ||
Entity handle = ((CraftEntity) e).getHandle(); | ||
handle.move(MoverType.SELF, new Vec3(x, y, z)); | ||
} | ||
|
||
@Override | ||
public void moveEntity(org.bukkit.entity.Entity e, Vector v) { | ||
moveEntity(e, v.getX(), v.getY(), v.getZ()); | ||
} | ||
|
||
@Override | ||
public void setEntityHeadRotation(org.bukkit.entity.Entity e, float headRotation) { | ||
Entity handle = ((CraftEntity) e).getHandle(); | ||
if (handle instanceof LivingEntity) { | ||
// required for goats | ||
((LivingEntity) handle).yHeadRot = headRotation; | ||
} else { | ||
handle.setYHeadRot(headRotation); | ||
} | ||
} | ||
|
||
@Override | ||
public float getEntityHeadRotation(org.bukkit.entity.Entity e) { | ||
Entity handle = ((CraftEntity) e).getHandle(); | ||
return handle.getYHeadRot(); | ||
} | ||
|
||
@Override | ||
public void setEntityYaw(org.bukkit.entity.Entity e, float yaw) { | ||
Entity handle = ((CraftEntity) e).getHandle(); | ||
handle.setYRot(yaw); | ||
} | ||
|
||
@Override | ||
public float getEntityYaw(org.bukkit.entity.Entity e) { | ||
Entity handle = ((CraftEntity) e).getHandle(); | ||
return handle.getYRot(); | ||
} | ||
|
||
@Override | ||
public void setEntityPitch(org.bukkit.entity.Entity e, float pitch) { | ||
Entity handle = ((CraftEntity) e).getHandle(); | ||
handle.setXRot(pitch); | ||
} | ||
|
||
@Override | ||
public float getEntityPitch(org.bukkit.entity.Entity e) { | ||
Entity handle = ((CraftEntity) e).getHandle(); | ||
return handle.getXRot(); | ||
} | ||
|
||
@Override | ||
public void setEntityNavigationTarget(org.bukkit.entity.Entity entity, Location target, double speed) { | ||
if (entity instanceof Bat) { | ||
try { | ||
if (fieldBatTarget == null) { | ||
fieldBatTarget = net.minecraft.world.entity.ambient.Bat.class.getDeclaredField(FIELD_BAT_TARGET_NAME); | ||
fieldBatTarget.setAccessible(true); | ||
} | ||
fieldBatTarget.set(((CraftBat) entity).getHandle(), new BlockPos(target.getX(), target.getY(), target.getZ())); | ||
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { | ||
nmsUtils.getPlugin().getLogger().log(Level.SEVERE, "could not set field", e); | ||
} | ||
} else if (entity instanceof Vex) { | ||
net.minecraft.world.entity.monster.Vex entityVex = ((CraftVex) entity).getHandle(); | ||
entityVex.getMoveControl().setWantedPosition(target.getX(), target.getY(), target.getZ(), speed); | ||
if (entityVex.getTarget() == null) { | ||
entityVex.getLookControl().setLookAt(target.getX(), target.getY(), target.getZ(), 180, 20); | ||
} | ||
} else { | ||
((CraftCreature) entity).getHandle().getNavigation().moveTo(target.getX(), target.getY(), target.getZ(), speed); | ||
} | ||
} | ||
|
||
@Override | ||
public void setEntityLeftHanded(org.bukkit.entity.Entity ent, boolean left) { | ||
Entity nmsEntity = ((CraftEntity) ent).getHandle(); | ||
if (nmsEntity instanceof net.minecraft.world.entity.Mob) { | ||
((net.minecraft.world.entity.Mob) nmsEntity).setLeftHanded(left); | ||
} | ||
} | ||
|
||
@Override | ||
public boolean isEntityLeftHanded(org.bukkit.entity.Entity ent) { | ||
Entity nmsEntity = ((CraftEntity) ent).getHandle(); | ||
if (nmsEntity instanceof net.minecraft.world.entity.Mob) { | ||
return ((net.minecraft.world.entity.Mob) nmsEntity).isLeftHanded(); | ||
} | ||
return false; | ||
} | ||
|
||
@Override | ||
public boolean isEntityInvisible(org.bukkit.entity.Entity entity) { | ||
Entity nmsEntity = ((CraftEntity) entity).getHandle(); | ||
return nmsEntity.isInvisible(); | ||
} | ||
|
||
@Override | ||
public void setEntityInvisible(org.bukkit.entity.Entity entity, boolean invisible) { | ||
Entity nmsEntity = ((CraftEntity) entity).getHandle(); | ||
nmsEntity.setInvisible(invisible); | ||
} | ||
|
||
@Override | ||
public boolean hasEntityNoClip(org.bukkit.entity.Entity entity) { | ||
Entity nmsEntity = ((CraftEntity) entity).getHandle(); | ||
return nmsEntity.noPhysics; | ||
} | ||
|
||
@Override | ||
public void setEntityNoClip(org.bukkit.entity.Entity entity, boolean noClip) { | ||
Entity nmsEntity = ((CraftEntity) entity).getHandle(); | ||
nmsEntity.noPhysics = noClip; | ||
} | ||
|
||
@Override | ||
public boolean areChunkEntitiesLoaded(Chunk c) { | ||
return ((CraftWorld) c.getWorld()).getHandle().areEntitiesLoaded(ChunkPos.asLong(c.getX(), c.getZ())); | ||
} | ||
|
||
@Override | ||
public void loadChunkEntities(Chunk c) { | ||
int x = c.getX(); | ||
int z = c.getZ(); | ||
World world = c.getWorld(); | ||
if (!world.isChunkLoaded(x, z)) { | ||
world.getChunkAt(x, z); | ||
} | ||
|
||
if (areChunkEntitiesLoaded(c)) { | ||
return; | ||
} | ||
ServerLevel serverLevel = ((CraftWorld) world).getHandle(); | ||
serverLevel.entityManager.updateChunkStatus(new ChunkPos(x, z), Visibility.TRACKED); | ||
// now wait until entities are loaded | ||
if (!areChunkEntitiesLoaded(c)) { | ||
serverLevel.getServer().managedBlock(() -> { | ||
if (areChunkEntitiesLoaded(c)) { | ||
return true; | ||
} | ||
// process chunk inbox | ||
serverLevel.entityManager.tick(); | ||
return areChunkEntitiesLoaded(c); | ||
}); | ||
} | ||
} | ||
|
||
@Override | ||
public void setOnGround(org.bukkit.entity.Entity entity, boolean onGround) { | ||
Entity nmsEntity = ((CraftEntity) entity).getHandle(); | ||
nmsEntity.setOnGround(onGround); | ||
} | ||
} |
Oops, something went wrong.