Added Enderman properties, TODO: fix them lol

This commit is contained in:
D3v1s0m 2023-07-03 10:47:10 +05:30
parent b3475db944
commit 49c23a85a4
No known key found for this signature in database
GPG Key ID: 3B6EC35367B8D82E
9 changed files with 140 additions and 25 deletions

@ -0,0 +1,14 @@
package lol.pyr.znpcsplus.util;
public class BlockState {
private final int globalId;
public BlockState(int globalId) {
this.globalId = globalId;
}
public int getGlobalId() {
return globalId;
}
}

@ -1,6 +1,9 @@
package lol.pyr.znpcsplus.commands.property; package lol.pyr.znpcsplus.commands.property;
import com.github.retrooper.packetevents.protocol.item.ItemStack; import com.github.retrooper.packetevents.protocol.item.ItemStack;
import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState;
import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
import io.github.retrooper.packetevents.util.SpigotConversionUtil; import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import lol.pyr.director.adventure.command.CommandContext; import lol.pyr.director.adventure.command.CommandContext;
import lol.pyr.director.adventure.command.CommandHandler; import lol.pyr.director.adventure.command.CommandHandler;
@ -10,11 +13,7 @@ import lol.pyr.znpcsplus.entity.EntityPropertyImpl;
import lol.pyr.znpcsplus.npc.NpcEntryImpl; import lol.pyr.znpcsplus.npc.NpcEntryImpl;
import lol.pyr.znpcsplus.npc.NpcImpl; import lol.pyr.znpcsplus.npc.NpcImpl;
import lol.pyr.znpcsplus.npc.NpcRegistryImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
import lol.pyr.znpcsplus.util.CatVariant; import lol.pyr.znpcsplus.util.*;
import lol.pyr.znpcsplus.util.CreeperState;
import lol.pyr.znpcsplus.util.NpcPose;
import lol.pyr.znpcsplus.util.Vector3f;
import lol.pyr.znpcsplus.util.ParrotVariant;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Color; import org.bukkit.Color;
@ -65,6 +64,39 @@ public class PropertySetCommand implements CommandHandler {
value = ParrotVariant.NONE; value = ParrotVariant.NONE;
valueName = "NONE"; valueName = "NONE";
} }
else if (type == BlockState.class) {
String inputType = context.popString().toLowerCase();
switch (inputType) {
case "hand":
org.bukkit.inventory.ItemStack bukkitStack = context.ensureSenderIsPlayer().getInventory().getItemInHand();
if (bukkitStack.getAmount() == 0) {
value = new BlockState(0);
valueName = "EMPTY";
} else {
WrappedBlockState blockState = StateTypes.getByName(bukkitStack.getType().name().toLowerCase()).createBlockState();
// WrappedBlockState blockState = WrappedBlockState.getByString(bukkitStack.getType().name().toLowerCase());
value = new BlockState(blockState.getGlobalId());
valueName = bukkitStack.toString();
}
break;
case "looking_at":
// TODO
value = new BlockState(0);
valueName = "EMPTY";
break;
case "block":
context.ensureArgsNotEmpty();
WrappedBlockState blockState = WrappedBlockState.getByString(context.popString());
value = new BlockState(blockState.getGlobalId());
valueName = blockState.toString();
break;
default:
context.send(Component.text("Invalid input type " + inputType + ", must be hand, looking_at, or block", NamedTextColor.RED));
return;
}
}
else { else {
value = context.parse(type); value = context.parse(type);
valueName = String.valueOf(value); valueName = String.valueOf(value);
@ -92,6 +124,13 @@ public class PropertySetCommand implements CommandHandler {
if (type == CatVariant.class) return context.suggestEnum(CatVariant.values()); if (type == CatVariant.class) return context.suggestEnum(CatVariant.values());
if (type == CreeperState.class) return context.suggestEnum(CreeperState.values()); if (type == CreeperState.class) return context.suggestEnum(CreeperState.values());
if (type == ParrotVariant.class) return context.suggestEnum(ParrotVariant.values()); if (type == ParrotVariant.class) return context.suggestEnum(ParrotVariant.values());
if (type == BlockState.class) return context.suggestLiteral("hand", "looking_at", "block");
}
else if (context.argSize() == 4) {
if (type == BlockState.class) {
// TODO: suggest block with nbt like minecraft setblock command
return context.suggestionParse(2, String.class).equals("block") ? context.suggestStream(StateTypes.values().stream().map(StateType::getName)) : Collections.emptyList();
}
} }
} }
return Collections.emptyList(); return Collections.emptyList();

@ -6,11 +6,7 @@ import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry;
import lol.pyr.znpcsplus.api.skin.SkinDescriptor; import lol.pyr.znpcsplus.api.skin.SkinDescriptor;
import lol.pyr.znpcsplus.entity.serializers.*; import lol.pyr.znpcsplus.entity.serializers.*;
import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache;
import lol.pyr.znpcsplus.util.CatVariant; import lol.pyr.znpcsplus.util.*;
import lol.pyr.znpcsplus.util.CreeperState;
import lol.pyr.znpcsplus.util.NpcPose;
import lol.pyr.znpcsplus.util.Vector3f;
import lol.pyr.znpcsplus.util.ParrotVariant;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Color; import org.bukkit.Color;
@ -35,6 +31,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerSerializer(new ItemStackPropertySerializer()); registerSerializer(new ItemStackPropertySerializer());
registerSerializer(new ColorPropertySerializer()); registerSerializer(new ColorPropertySerializer());
registerSerializer(new Vector3fPropertySerializer()); registerSerializer(new Vector3fPropertySerializer());
registerSerializer(new BlockStatePropertySerializer());
registerEnumSerializer(NpcPose.class); registerEnumSerializer(NpcPose.class);
registerEnumSerializer(DyeColor.class); registerEnumSerializer(DyeColor.class);
@ -113,8 +110,13 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerType("cat_collar_color", DyeColor.RED); registerType("cat_collar_color", DyeColor.RED);
// Creeper // Creeper
registerType("creeper_state", CreeperState.IDLE); // TODO: -1 = idle, 1 = fuse registerType("creeper_state", CreeperState.IDLE);
registerType("creeper_charged", false); // TODO registerType("creeper_charged", false);
// Enderman
registerType("enderman_held_block", new BlockState(0)); // TODO: figure out the type on this
registerType("enderman_screaming", false); // TODO
registerType("enderman_staring", false); // TODO
// Pufferfish // Pufferfish
registerType("puff_state", null); // TODO: Make a puff state enum class registerType("puff_state", null); // TODO: Make a puff state enum class
@ -203,10 +205,6 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
// Wither // Wither
registerType("invulnerable_time", 0); // TODO registerType("invulnerable_time", 0); // TODO
// Enderman
registerType("enderman_held_block", null); // TODO: figure out the type on this
registerType("enderman_screaming", false); // TODO
// Ghast // Ghast
registerType("attacking", false); // TODO registerType("attacking", false); // TODO

@ -0,0 +1,27 @@
package lol.pyr.znpcsplus.entity.serializers;
import lol.pyr.znpcsplus.entity.PropertySerializer;
import lol.pyr.znpcsplus.util.BlockState;
public class BlockStatePropertySerializer implements PropertySerializer<BlockState> {
@Override
public String serialize(BlockState property) {
return String.valueOf(property.getGlobalId());
}
@Override
public BlockState deserialize(String property) {
try {
int id = Integer.parseInt(property);
return new BlockState(id);
} catch (Exception e) {
e.printStackTrace();
}
return new BlockState(0);
}
@Override
public Class<BlockState> getTypeClass() {
return BlockState.class;
}
}

@ -2,10 +2,7 @@ package lol.pyr.znpcsplus.metadata;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import lol.pyr.znpcsplus.util.CatVariant; import lol.pyr.znpcsplus.util.*;
import lol.pyr.znpcsplus.util.CreeperState;
import lol.pyr.znpcsplus.util.ParrotVariant;
import lol.pyr.znpcsplus.util.Vector3f;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
@ -71,4 +68,9 @@ public interface MetadataFactory {
// Creeper // Creeper
EntityData creeperState(CreeperState state); EntityData creeperState(CreeperState state);
EntityData creeperCharged(boolean charged); EntityData creeperCharged(boolean charged);
// Enderman
EntityData endermanHeldBlock(int heldBlock);
EntityData endermanScreaming(boolean screaming);
EntityData endermanStaring(boolean staring);
} }

@ -143,4 +143,19 @@ public class V1_17MetadataFactory extends V1_16MetadataFactory {
public EntityData creeperCharged(boolean charged) { public EntityData creeperCharged(boolean charged) {
return newEntityData(17, EntityDataTypes.BOOLEAN, charged); return newEntityData(17, EntityDataTypes.BOOLEAN, charged);
} }
@Override
public EntityData endermanHeldBlock(int carriedBlock) {
return newEntityData(16, EntityDataTypes.INT, carriedBlock);
}
@Override
public EntityData endermanScreaming(boolean screaming) {
return newEntityData(17, EntityDataTypes.BOOLEAN, screaming);
}
@Override
public EntityData endermanStaring(boolean staring) {
return newEntityData(18, EntityDataTypes.BOOLEAN, staring);
}
} }

@ -5,10 +5,7 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.util.adventure.AdventureSerializer; import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
import lol.pyr.znpcsplus.util.CatVariant; import lol.pyr.znpcsplus.util.*;
import lol.pyr.znpcsplus.util.CreeperState;
import lol.pyr.znpcsplus.util.ParrotVariant;
import lol.pyr.znpcsplus.util.Vector3f;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
@ -168,6 +165,21 @@ public class V1_8MetadataFactory implements MetadataFactory {
return newEntityData(17, EntityDataTypes.BYTE, (byte) (charged ? 1 : 0)); return newEntityData(17, EntityDataTypes.BYTE, (byte) (charged ? 1 : 0));
} }
@Override
public EntityData endermanHeldBlock(int carriedBlock) {
throw new UnsupportedOperationException("The enderman carried block entity data isn't supported on this version");
}
@Override
public EntityData endermanScreaming(boolean screaming) {
throw new UnsupportedOperationException("The enderman screaming entity data isn't supported on this version");
}
@Override
public EntityData endermanStaring(boolean staring) {
return newEntityData(18, EntityDataTypes.BOOLEAN, staring);
}
@Override @Override
public EntityData silent(boolean enabled) { public EntityData silent(boolean enabled) {
return newEntityData(4, EntityDataTypes.BYTE, (byte) (enabled ? 1 : 0)); return newEntityData(4, EntityDataTypes.BYTE, (byte) (enabled ? 1 : 0));

@ -80,7 +80,8 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
.setHologramOffset(6.0245)); .setHologramOffset(6.0245));
register(builder(p, "enderman", EntityTypes.ENDERMAN) register(builder(p, "enderman", EntityTypes.ENDERMAN)
.setHologramOffset(0.925)); .setHologramOffset(0.925)
.addProperties("enderman_held_block", "enderman_screaming", "enderman_staring"));
register(builder(p, "endermite", EntityTypes.ENDERMITE) register(builder(p, "endermite", EntityTypes.ENDERMITE)
.setHologramOffset(-1.675)); .setHologramOffset(-1.675));

@ -189,6 +189,13 @@ public class V1_8PacketFactory implements PacketFactory {
add(data, metadataFactory.creeperState(properties.getProperty(propertyRegistry.getByName("creeper_state", CreeperState.class)))); add(data, metadataFactory.creeperState(properties.getProperty(propertyRegistry.getByName("creeper_state", CreeperState.class))));
add(data, metadataFactory.creeperCharged(properties.getProperty(propertyRegistry.getByName("creeper_charged", Boolean.class)))); add(data, metadataFactory.creeperCharged(properties.getProperty(propertyRegistry.getByName("creeper_charged", Boolean.class))));
} }
else if (entity.getType().equals(EntityTypes.ENDERMAN)) {
add(data, metadataFactory.endermanHeldBlock(
properties.getProperty(propertyRegistry.getByName("enderman_held_block", BlockState.class)).getGlobalId())
);
add(data, metadataFactory.endermanScreaming(properties.getProperty(propertyRegistry.getByName("enderman_screaming", Boolean.class))));
add(data, metadataFactory.endermanStaring(properties.getProperty(propertyRegistry.getByName("enderman_staring", Boolean.class))));
}
if (properties.getProperty(propertyRegistry.getByName("dinnerbone", Boolean.class))) { if (properties.getProperty(propertyRegistry.getByName("dinnerbone", Boolean.class))) {
add(data, metadataFactory.name(Component.text("Dinnerbone"))); add(data, metadataFactory.name(Component.text("Dinnerbone")));