Skip to content

Commit

Permalink
1.18 rc-3
Browse files Browse the repository at this point in the history
  • Loading branch information
Brokkonaut committed Nov 27, 2021
1 parent cb3a706 commit d4e5f98
Show file tree
Hide file tree
Showing 8 changed files with 652 additions and 2 deletions.
85 changes: 85 additions & 0 deletions nmsutils-v1_18_R1/pom.xml
@@ -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>
@@ -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);
}
}

0 comments on commit d4e5f98

Please sign in to comment.