Skip to content

Commit

Permalink
allow fakespawn to recognize item_projectile
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jan 22, 2021
1 parent 2779b8a commit b86a02e
Show file tree
Hide file tree
Showing 9 changed files with 64 additions and 16 deletions.
Expand Up @@ -3,12 +3,12 @@
import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.entity.DenizenEntityType;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizencore.objects.Mechanism;
import org.bukkit.*;
import org.bukkit.boss.BossBar;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;

import java.util.*;
Expand All @@ -17,7 +17,7 @@ public abstract class PlayerHelper {

public abstract void stopSound(Player player, String sound, SoundCategory category);

public FakeEntity sendEntitySpawn(List<PlayerTag> players, EntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
public FakeEntity sendEntitySpawn(List<PlayerTag> players, DenizenEntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
throw new UnsupportedOperationException();
}

Expand Down
Expand Up @@ -231,7 +231,7 @@ public void sendTo(List<PlayerTag> players) {
return;
}
if (toOthers == null) {
toOthers = NMSHandler.getPlayerHelper().sendEntitySpawn(players, as.getBukkitEntityType(), entity.getLocation(), as.getWaitingMechanisms(), entity.getBukkitEntity().getEntityId(), entity.getUUID(), false);
toOthers = NMSHandler.getPlayerHelper().sendEntitySpawn(players, as.getEntityType(), entity.getLocation(), as.getWaitingMechanisms(), entity.getBukkitEntity().getEntityId(), entity.getUUID(), false);
toOthers.overrideUUID = UUID.randomUUID();
toOthers.entity.uuid = toOthers.overrideUUID;
FakeEntity.idsToEntities.put(toOthers.overrideUUID, toOthers);
Expand Down Expand Up @@ -346,7 +346,7 @@ public void execute(ScriptEntry scriptEntry) {
}
if (cancel == null || !cancel.asBoolean()) {
TrackedDisguise disguise = new TrackedDisguise(entity, as);
disguise.as.entity = NMSHandler.getPlayerHelper().sendEntitySpawn(new ArrayList<>(), as.getBukkitEntityType(), entity.getLocation(), as.getWaitingMechanisms(), -1, null, false).entity.getBukkitEntity();
disguise.as.entity = NMSHandler.getPlayerHelper().sendEntitySpawn(new ArrayList<>(), as.getEntityType(), entity.getLocation(), as.getWaitingMechanisms(), -1, null, false).entity.getBukkitEntity();
if (isGlobal) {
playerMap = disguises.get(entity.getUUID());
if (playerMap == null) {
Expand Down
Expand Up @@ -26,7 +26,7 @@ public class DenizenEntityType {
private final String name;
private final String lowercaseName;
private final double gravity;
private final CustomEntityType customEntityType;
public final CustomEntityType customEntityType;

static {
for (EntityType entityType : EntityType.values()) {
Expand Down
Expand Up @@ -51,7 +51,7 @@ public FakeEntity(List<PlayerTag> player, LocationTag location, int id) {
}

public static FakeEntity showFakeEntityTo(List<PlayerTag> players, EntityTag typeToSpawn, LocationTag location, DurationTag duration) {
FakeEntity fakeEntity = NMSHandler.getPlayerHelper().sendEntitySpawn(players, typeToSpawn.getBukkitEntityType(), location, typeToSpawn.getWaitingMechanisms(), -1, null, true);
FakeEntity fakeEntity = NMSHandler.getPlayerHelper().sendEntitySpawn(players, typeToSpawn.getEntityType(), location, typeToSpawn.getWaitingMechanisms(), -1, null, true);
idsToEntities.put(fakeEntity.overrideUUID == null ? fakeEntity.entity.getUUID() : fakeEntity.overrideUUID, fakeEntity);
for (PlayerTag player : players) {
UUID uuid = player.getPlayerEntity().getUniqueId();
Expand Down
Expand Up @@ -7,6 +7,7 @@
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.entity.DenizenEntityType;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizencore.objects.Mechanism;
import com.mojang.authlib.GameProfile;
Expand All @@ -22,7 +23,6 @@
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

Expand Down Expand Up @@ -69,9 +69,9 @@ public void deTrackEntity(Player player, Entity entity) {
}

@Override
public FakeEntity sendEntitySpawn(List<PlayerTag> players, EntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
public FakeEntity sendEntitySpawn(List<PlayerTag> players, DenizenEntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
CraftWorld world = ((CraftWorld) location.getWorld());
net.minecraft.server.v1_15_R1.Entity nmsEntity = world.createEntity(location, entityType.getEntityClass());
net.minecraft.server.v1_15_R1.Entity nmsEntity = world.createEntity(location, entityType.getBukkitEntityType().getEntityClass());
if (customUUID != null) {
nmsEntity.e(customId);
nmsEntity.a(customUUID);
Expand Down
Expand Up @@ -42,11 +42,16 @@ public FakeArrow spawnFakeArrow(Location location) {
public ItemProjectile spawnItemProjectile(Location location, ItemStack itemStack) {
CraftWorld world = (CraftWorld) location.getWorld();
EntityItemProjectileImpl entity = new EntityItemProjectileImpl(world.getHandle(), location, CraftItemStack.asNMSCopy(itemStack));
world.getHandle().addEntity(entity);
return entity.getBukkitEntity();
}

@Override
public FakePlayer spawnFakePlayer(Location location, String name, String skin) throws IllegalArgumentException {
return spawnFakePlayer(location, name, skin, true);
}

public static FakePlayer spawnFakePlayer(Location location, String name, String skin, boolean doAdd) throws IllegalArgumentException {
String fullName = name;
String prefix = null;
String suffix = null;
Expand Down Expand Up @@ -116,7 +121,7 @@ else if (name.length() > 46) {
new Property("textures", playerProfile.getTexture(), playerProfile.getTextureSignature()));

final EntityFakePlayerImpl fakePlayer = new EntityFakePlayerImpl(worldServer.getMinecraftServer(), worldServer,
gameProfile, new PlayerInteractManager(worldServer));
gameProfile, new PlayerInteractManager(worldServer), doAdd);

fakePlayer.setPositionRotation(location.getX(), location.getY(), location.getZ(),
location.getYaw(), location.getPitch());
Expand Down
@@ -1,14 +1,19 @@
package com.denizenscript.denizen.nms.v1_16.helpers;

import com.denizenscript.denizen.Denizen;
import com.denizenscript.denizen.nms.enums.CustomEntityType;
import com.denizenscript.denizen.nms.v1_16.Handler;
import com.denizenscript.denizen.nms.v1_16.impl.ImprovedOfflinePlayerImpl;
import com.denizenscript.denizen.nms.v1_16.impl.entities.CraftFakePlayerImpl;
import com.denizenscript.denizen.nms.v1_16.impl.entities.EntityItemProjectileImpl;
import com.denizenscript.denizen.nms.v1_16.impl.network.handlers.AbstractListenerPlayInImpl;
import com.denizenscript.denizen.nms.v1_16.impl.network.handlers.DenizenNetworkManagerImpl;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.FormattedTextHelper;
import com.denizenscript.denizen.utilities.entity.DenizenEntityType;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizencore.objects.Mechanism;
import com.mojang.authlib.GameProfile;
Expand All @@ -20,15 +25,17 @@
import net.minecraft.server.v1_16_R3.*;
import org.bukkit.*;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.SoundCategory;
import org.bukkit.boss.BossBar;
import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
import org.bukkit.craftbukkit.v1_16_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_16_R3.boss.CraftBossBar;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;

import java.lang.reflect.Field;
Expand Down Expand Up @@ -79,9 +86,44 @@ public static class TrackerData {
}

@Override
public FakeEntity sendEntitySpawn(List<PlayerTag> players, EntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
public FakeEntity sendEntitySpawn(List<PlayerTag> players, DenizenEntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
CraftWorld world = ((CraftWorld) location.getWorld());
net.minecraft.server.v1_16_R3.Entity nmsEntity = world.createEntity(location, entityType.getEntityClass());
net.minecraft.server.v1_16_R3.Entity nmsEntity;
if (entityType.isCustom()) {
if (entityType.customEntityType == CustomEntityType.ITEM_PROJECTILE) {
org.bukkit.inventory.ItemStack itemStack = new ItemStack(Material.STONE);
for (Mechanism mechanism : mechanisms) {
if (mechanism.matches("item") && mechanism.requireObject(ItemTag.class)) {
itemStack = mechanism.valueAsType(ItemTag.class).getItemStack();
}
}
nmsEntity = new EntityItemProjectileImpl(world.getHandle(), location, CraftItemStack.asNMSCopy(itemStack));
}
else if (entityType.customEntityType == CustomEntityType.FAKE_PLAYER) {
String name = null;
String skin = null;
for (Mechanism mechanism : new ArrayList<>(mechanisms)) {
if (mechanism.matches("name")) {
name = mechanism.getValue().asString();
mechanisms.remove(mechanism);
}
else if (mechanism.matches("skin")) {
skin = mechanism.getValue().asString();
mechanisms.remove(mechanism);
}
if (name != null && skin != null) {
break;
}
}
nmsEntity = ((CraftFakePlayerImpl) CustomEntityHelperImpl.spawnFakePlayer(location, name, skin, false)).getHandle();
}
else {
throw new IllegalArgumentException("entityType");
}
}
else {
nmsEntity = world.createEntity(location, entityType.getBukkitEntityType().getEntityClass());
}
if (customUUID != null) {
nmsEntity.e(customId);
nmsEntity.a_(customUUID);
Expand Down
Expand Up @@ -12,7 +12,7 @@

public class EntityFakePlayerImpl extends EntityPlayer {

public EntityFakePlayerImpl(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) {
public EntityFakePlayerImpl(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager, boolean doAdd) {
super(minecraftserver, worldserver, gameprofile, playerinteractmanager);
try {
Handler.ENTITY_BUKKITYENTITY.set(this, new CraftFakePlayerImpl((CraftServer) Bukkit.getServer(), this));
Expand All @@ -25,7 +25,9 @@ public EntityFakePlayerImpl(MinecraftServer minecraftserver, WorldServer worldse
playerConnection = new FakePlayerConnectionImpl(minecraftserver, networkManager, this);
networkManager.setPacketListener(playerConnection);
datawatcher.set(EntityHuman.bi, (byte) 127);
worldserver.addEntity(this, CreatureSpawnEvent.SpawnReason.CUSTOM);
if (doAdd) {
worldserver.addEntity(this, CreatureSpawnEvent.SpawnReason.CUSTOM);
}
}

@Override
Expand Down
Expand Up @@ -35,7 +35,6 @@ public EntityItemProjectileImpl(World world, Location location, ItemStack item)
}
setPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
setItemStack(item);
world.addEntity(this);
}

@Override
Expand Down

0 comments on commit b86a02e

Please sign in to comment.