/** * Clone the content of the current DataWatcher. * * @return A cloned data watcher. */ public WrappedDataWatcher deepClone() { WrappedDataWatcher clone = new WrappedDataWatcher(getEntity()); if (MinecraftReflection.watcherObjectExists()) { for (WrappedWatchableObject wrapper : this) { clone.setObject(wrapper.getWatcherObject(), wrapper); } } else { for (WrappedWatchableObject wrapper : this) { clone.setObject(wrapper.getIndex(), wrapper); } } return clone; }
@Override public Iterator<WrappedWatchableObject> iterator() { return getWatchableObjects().iterator(); }
/** * Gets a list of the contents of this DataWatcher. * @return The contents */ public List<WrappedWatchableObject> getWatchableObjects() { return new ArrayList<>(asMap().values()); }
/** * Constructs a new DataWatcher using a fake egg entity. The * resulting DataWatcher will not have any keys or values and new ones will * have to be added using watcher objects. */ public WrappedDataWatcher() { this(newHandle(fakeEntity())); }
/** * Sets the DataWatcher Item at a given index to a new value. In 1.9 and up, * you cannot register objects without a watcher object. * * @param index Index of the object to set * @param value New value * @param update Whether or not to inform the client * * @see {@link #setObject(WrappedDataWatcherObject, Object, boolean)} * @throws IllegalArgumentException in 1.9 and up if there isn't already an * object at this index */ public void setObject(int index, Object value, boolean update) { if (MinecraftReflection.watcherObjectExists() && !hasIndex(index)) { throw new IllegalArgumentException("You cannot register objects without a watcher object!"); } setObject(WrappedDataWatcherObject.fromIndex(index), value, update); }
/** * Create a new datawatcher but with the 'correct' values */ public static WrappedDataWatcher createSanitizedDataWatcher(WrappedDataWatcher entityWatcher, FlagWatcher disguiseWatcher) { WrappedDataWatcher newWatcher = new WrappedDataWatcher(); try { List<WrappedWatchableObject> list = DisguiseConfig.isMetadataPacketsEnabled() ? disguiseWatcher.convert(entityWatcher.getWatchableObjects()) : disguiseWatcher.getWatchableObjects(); for (WrappedWatchableObject watchableObject : list) { if (watchableObject == null) continue; if (watchableObject.getValue() == null) continue; WrappedDataWatcher.WrappedDataWatcherObject obj = ReflectionManager .createDataWatcherObject(watchableObject.getIndex(), watchableObject.getValue()); newWatcher.setObject(obj, watchableObject.getValue()); } } catch (Exception ex) { ex.printStackTrace(); } return newWatcher; }
.createSanitizedDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher()); } else { newWatcher = new WrappedDataWatcher(); newWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(MetaIndex.ENTITY_META.getIndex(), WrappedDataWatcher.Registry.get(Byte.class)), (byte) 32); .createSanitizedDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher()); metaPacket.getWatchableCollectionModifier().write(0, newWatcher.getWatchableObjects()); .createSanitizedDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); } else if (disguise.getType().isMisc()) {
/** * Shortcut for {@link #setObject(int, Object, boolean)} */ public void setObject(int index, Object value) { setObject(index, value, false); }
@Override public WrappedDataWatcher getSpecific(Object generic) { if (MinecraftReflection.isDataWatcher(generic)) return new WrappedDataWatcher(generic); else if (generic instanceof WrappedDataWatcher) return (WrappedDataWatcher) generic; else throw new IllegalArgumentException("Unrecognized type " + generic.getClass()); }
bukkitEntity instanceof Damageable ? ((Damageable) bukkitEntity).getMaxHealth() : 0); WrappedDataWatcher watcher = WrappedDataWatcher.getEntityWatcher(bukkitEntity); ArrayList<MetaIndex> indexes = MetaIndex.getMetaIndexes(disguiseType.getWatcherClass()); boolean loggedName = false; for (WrappedWatchableObject watch : watcher.getWatchableObjects()) { MetaIndex flagType = MetaIndex.getMetaIndex(watcherClass, watch.getIndex());
if (hasIndex(object.getIndex())) { SETTER.invoke(handle, object.getHandle(), value); } else { getWatchableObject(object.getIndex()).setDirtyState(update);
data == MetaIndex.ENTITY_META) { value = addEntityAnimations((byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
WrappedWatchableObject customNameWatchableObject = spawnEntityPacket.getMetadata().getWatchableObject(customNameWatcherIndex); replaceRelativePlaceholders(customNameWatchableObject, player, relativePlaceholders); event.setPacket(spawnEntityPacket.getHandle());
WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); dataWatcher.setObject(new WrappedDataWatcherObject(0, byteSerializer), (byte) 0x20); // Entity status: invisible dataWatcher.setObject(new WrappedDataWatcherObject(customNameWatcherIndex, chatComponentSerializer), Optional.of(WrappedChatComponent.fromText(customName).getHandle())); } else { dataWatcher.setObject(new WrappedDataWatcherObject(customNameWatcherIndex, stringSerializer), customName); dataWatcher.setObject(new WrappedDataWatcherObject(3, booleanSerializer), true); // Custom name visible dataWatcher.setObject(new WrappedDataWatcherObject(5, booleanSerializer), true); // No gravity dataWatcher.setObject(new WrappedDataWatcherObject(11, byteSerializer), (byte) (0x01 | 0x08 | 0x10)); // Armor stand data: small, no base plate, marker dataPacket.setEntityMetadata(dataWatcher.getWatchableObjects()); dataPacket.setEntityId(armorStand.getIdNMS()); dataPacket.sendPacket(receiver);
/** * Shortcut for {@link #setObject(WrappedDataWatcherObject, Object, boolean)} */ public void setObject(WrappedDataWatcherObject object, Object value) { setObject(object, value, false); }
/** * Retrieve the data watcher associated with an entity. * * @param entity - the entity to read from. * @return Associated data watcher. */ public static WrappedDataWatcher getEntityWatcher(Entity entity) { if (ENTITY_DATA_FIELD == null) { ENTITY_DATA_FIELD = Accessors.getFieldAccessor(MinecraftReflection.getEntityClass(), MinecraftReflection.getDataWatcherClass(), true); } BukkitUnwrapper unwrapper = new BukkitUnwrapper(); Object handle = ENTITY_DATA_FIELD.get(unwrapper.unwrapItem(entity)); return handle != null ? new WrappedDataWatcher(handle) : null; }
.createWatchable(0, WrappedDataWatcher.getEntityWatcher(entity).getByte(0));
WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); dataWatcher.setObject(toWatcherObject(2, STRING_SERIALISER), Text.colorize(entity.getLine().resolve(player))); dataWatcher.setObject(toWatcherObject(3, BOOLEAN_SERIALISER), true); List<WrappedWatchableObject> watchableObjects = new ArrayList<>(dataWatcher.getWatchableObjects()); for (Map.Entry<Integer, WrappedWatchableObject> ent : entity.getCachedMetadata().entrySet()) { if (ent.getKey() != 2 && ent.getKey() != 3) {
/** * Sets the DataWatcher Item at a given index to a new value. * * @param index Index of the object to set * @param value New value * @param update Whether or not to inform the client * * @see {@link #setObject(int, Object, boolean)} */ public void setObject(int index, WrappedWatchableObject value, boolean update) { setObject(index, value.getRawValue(), update); }
@Override public int hashCode() { return getWatchableObjects().hashCode(); }