use of org.lanternpowered.server.network.entity.parameter.ByteBufParameterList in project LanternServer by LanternPowered.
the class PlayerEntityProtocol method sendStackEntry.
private void sendStackEntry(EntityProtocolUpdateContext context, int index, int type) {
final ParameterList parameterList = new ByteBufParameterList(ByteBufferAllocator.unpooled());
parameterList.add(EntityParameters.Base.FLAGS, (byte) 0x20);
if (type == 55) {
parameterList.add(EntityParameters.AbstractSlime.SIZE, -1);
} else if (type == 101) {
parameterList.add(EntityParameters.Ageable.IS_BABY, true);
}
context.sendToAll(() -> new MessagePlayOutSpawnMob(this.passengerStack[index], UUID.randomUUID(), type, getEntity().getPosition(), (byte) 0, (byte) 0, (byte) 0, Vector3d.ZERO, parameterList));
}
use of org.lanternpowered.server.network.entity.parameter.ByteBufParameterList in project LanternServer by LanternPowered.
the class ProcessorPlayOutParticleEffect method preProcess.
private ICachedMessage preProcess(ParticleEffect effect0) {
final LanternParticleEffect effect = (LanternParticleEffect) effect0;
final LanternParticleType type = effect.getType();
final OptionalInt internalType = type.getInternalType();
// Special cases
if (!internalType.isPresent()) {
if (type == ParticleTypes.FIREWORKS) {
// Create the fireworks data item
final LanternItemStack itemStack = new LanternItemStack(ItemTypes.FIREWORKS);
itemStack.tryOffer(Keys.FIREWORK_EFFECTS, effect.getOptionOrDefault(ParticleOptions.FIREWORK_EFFECTS).get());
// Write the item to a parameter list
final ByteBufParameterList parameterList = new ByteBufParameterList(ByteBufferAllocator.unpooled());
parameterList.add(EntityParameters.Fireworks.ITEM, itemStack);
return new CachedFireworksMessage(new MessagePlayOutEntityMetadata(CachedFireworksMessage.ENTITY_ID, parameterList));
} else if (type == ParticleTypes.FERTILIZER) {
final int quantity = effect.getOptionOrDefault(ParticleOptions.QUANTITY).get();
return new CachedEffectMessage(2005, quantity, false);
} else if (type == ParticleTypes.SPLASH_POTION) {
final int potionId = this.potionEffectTypeToId.getInt(effect.getOptionOrDefault(ParticleOptions.POTION_EFFECT_TYPE).get());
return new CachedEffectMessage(2002, potionId, false);
} else if (type == ParticleTypes.BREAK_BLOCK) {
final int state = getBlockState(effect, type.getDefaultOption(ParticleOptions.BLOCK_STATE));
if (state == 0) {
return EmptyCachedMessage.INSTANCE;
}
return new CachedEffectMessage(2001, state, false);
} else if (type == ParticleTypes.MOBSPAWNER_FLAMES) {
return new CachedEffectMessage(2004, 0, false);
} else if (type == ParticleTypes.ENDER_TELEPORT) {
return new CachedEffectMessage(2003, 0, false);
} else if (type == ParticleTypes.DRAGON_BREATH_ATTACK) {
return new CachedEffectMessage(2006, 0, false);
} else if (type == ParticleTypes.FIRE_SMOKE) {
final Direction direction = effect.getOptionOrDefault(ParticleOptions.DIRECTION).get();
return new CachedEffectMessage(2000, getDirectionData(direction), false);
}
return EmptyCachedMessage.INSTANCE;
}
final int internalId = internalType.getAsInt();
final Vector3f offset = effect.getOption(ParticleOptions.OFFSET).map(Vector3d::toFloat).orElse(Vector3f.ZERO);
final int quantity = effect.getOption(ParticleOptions.QUANTITY).orElse(1);
int[] extra = null;
// The extra values, normal behavior offsetX, offsetY, offsetZ
double f0 = 0f;
double f1 = 0f;
double f2 = 0f;
// Depends on behavior
// Note: If the count > 0 -> speed = 0f else if count = 0 -> speed = 1f
final Optional<BlockState> defaultBlockState;
if (type != ParticleTypes.ITEM_CRACK && (defaultBlockState = type.getDefaultOption(ParticleOptions.BLOCK_STATE)).isPresent()) {
final int state = getBlockState(effect, defaultBlockState);
if (state == 0) {
return EmptyCachedMessage.INSTANCE;
}
extra = new int[] { state };
}
final Optional<ItemStackSnapshot> defaultItemStackSnapshot;
if (extra == null && (defaultItemStackSnapshot = type.getDefaultOption(ParticleOptions.ITEM_STACK_SNAPSHOT)).isPresent()) {
final Optional<ItemStackSnapshot> optItemStackSnapshot = effect.getOption(ParticleOptions.ITEM_STACK_SNAPSHOT);
if (optItemStackSnapshot.isPresent()) {
extra = toExtraItemData(optItemStackSnapshot.get().createStack());
} else {
final Optional<BlockState> optBlockState = effect.getOption(ParticleOptions.BLOCK_STATE);
if (optBlockState.isPresent()) {
final BlockState blockState = optBlockState.get();
final Optional<ItemType> optItemType = blockState.getType().getItem();
if (optItemType.isPresent()) {
// TODO: Item damage value
extra = new int[] { ItemRegistryModule.get().getInternalId(optItemType.get()), 0 };
} else {
return EmptyCachedMessage.INSTANCE;
}
} else {
extra = toExtraItemData(defaultItemStackSnapshot.get().createStack());
}
}
}
if (extra == null) {
extra = new int[0];
}
final Optional<Double> defaultScale = type.getDefaultOption(ParticleOptions.SCALE);
final Optional<Color> defaultColor;
final Optional<NotePitch> defaultNote;
final Optional<Vector3d> defaultVelocity;
if (defaultScale.isPresent()) {
double scale = effect.getOption(ParticleOptions.SCALE).orElse(defaultScale.get());
// Server formula: sizeServer = (-sizeClient * 2) + 2
if (type == ParticleTypes.LARGE_EXPLOSION || type == ParticleTypes.SWEEP_ATTACK) {
scale = (-scale * 2f) + 2f;
}
if (scale == 0f) {
return new CachedParticleMessage(internalId, offset, quantity, extra);
}
f0 = scale;
} else if ((defaultColor = type.getDefaultOption(ParticleOptions.COLOR)).isPresent()) {
final boolean isSpell = type == ParticleTypes.MOB_SPELL || type == ParticleTypes.AMBIENT_MOB_SPELL;
Color color = effect.getOption(ParticleOptions.COLOR).orElse(null);
if (!isSpell && (color == null || color.equals(defaultColor.get()))) {
return new CachedParticleMessage(internalId, offset, quantity, extra);
} else if (isSpell && color == null) {
color = defaultColor.get();
}
f0 = color.getRed() / 255f;
f1 = color.getGreen() / 255f;
f2 = color.getBlue() / 255f;
// but we already chose for the color, can't have both
if (isSpell) {
f0 = Math.max(f0, 0.001f);
f2 = Math.max(f0, 0.001f);
}
// If the f0 value 0 is, the redstone will set it automatically to red 255
if (f0 == 0f && type == ParticleTypes.REDSTONE_DUST) {
f0 = 0.00001f;
}
} else if ((defaultNote = type.getDefaultOption(ParticleOptions.NOTE)).isPresent()) {
final NotePitch notePitch = effect.getOption(ParticleOptions.NOTE).orElse(defaultNote.get());
final float note = ((LanternNotePitch) notePitch).getInternalId();
if (note == 0f) {
return new CachedParticleMessage(internalId, offset, quantity, extra);
}
f0 = note / 24f;
} else if ((defaultVelocity = type.getDefaultOption(ParticleOptions.VELOCITY)).isPresent()) {
final Vector3d velocity = effect.getOption(ParticleOptions.VELOCITY).orElse(defaultVelocity.get());
f0 = velocity.getX();
f1 = velocity.getY();
f2 = velocity.getZ();
final Optional<Boolean> slowHorizontalVelocity = type.getDefaultOption(ParticleOptions.SLOW_HORIZONTAL_VELOCITY);
if (slowHorizontalVelocity.isPresent() && effect.getOption(ParticleOptions.SLOW_HORIZONTAL_VELOCITY).orElse(slowHorizontalVelocity.get())) {
f0 = 0f;
f2 = 0f;
}
// The y value won't work for this effect, if the value isn't 0 the velocity won't work
if (type == ParticleTypes.WATER_SPLASH) {
f1 = 0f;
}
if (f0 == 0f && f1 == 0f && f2 == 0f) {
return new CachedParticleMessage(internalId, offset, quantity, extra);
}
}
// Is this check necessary?
if (f0 == 0f && f1 == 0f && f2 == 0f) {
return new CachedParticleMessage(internalId, offset, quantity, extra);
}
return new CachedOffsetParticleMessage(internalId, new Vector3f(f0, f1, f2), offset, quantity, extra);
}
use of org.lanternpowered.server.network.entity.parameter.ByteBufParameterList in project LanternServer by LanternPowered.
the class ProcessorPlayOutParticleEffect method processRemoval.
private void processRemoval(@Nullable ParticleEffect key, @Nullable ICachedMessage value, RemovalCause cause) {
if (value instanceof CachedFireworksMessage) {
final ByteBufParameterList parameterList = (ByteBufParameterList) ((CachedFireworksMessage) value).entityMetadataMessage.getParameterList();
parameterList.getByteBuffer().ifPresent(ByteBuffer::release);
}
}
use of org.lanternpowered.server.network.entity.parameter.ByteBufParameterList in project LanternServer by LanternPowered.
the class PlayerEntityProtocol method update.
@Override
protected void update(EntityProtocolUpdateContext context) {
final GameMode gameMode = this.entity.get(Keys.GAME_MODE).get();
final boolean canFly = canFly();
final float flySpeed = getFlySpeed();
final float fieldOfView = getFovModifier();
if (gameMode != this.lastGameMode) {
context.sendToSelf(() -> new MessagePlayOutSetGameMode((LanternGameMode) gameMode));
context.sendToSelf(() -> new MessagePlayOutPlayerAbilities(this.entity.get(Keys.IS_FLYING).orElse(false), canFly, false, gameMode == GameModes.CREATIVE, flySpeed, fieldOfView));
this.lastGameMode = gameMode;
this.lastCanFly = canFly;
this.lastFlySpeed = flySpeed;
this.lastFieldOfView = fieldOfView;
} else if (canFly != this.lastCanFly || flySpeed != this.lastFlySpeed || fieldOfView != this.lastFieldOfView) {
context.sendToSelf(() -> new MessagePlayOutPlayerAbilities(this.entity.get(Keys.IS_FLYING).orElse(false), canFly, false, gameMode == GameModes.CREATIVE, flySpeed, fieldOfView));
this.lastCanFly = canFly;
this.lastFlySpeed = flySpeed;
this.lastFieldOfView = fieldOfView;
}
final float health = this.entity.get(Keys.HEALTH).get().floatValue();
final int foodLevel = this.entity.get(Keys.FOOD_LEVEL).get();
final float saturation = this.entity.get(Keys.SATURATION).get().floatValue();
if (health != this.lastHealth || foodLevel != this.lastFoodLevel || saturation == 0.0f != this.lastHungry) {
context.sendToSelf(() -> new MessagePlayOutPlayerHealthUpdate(health, foodLevel, saturation));
this.lastHealth = health;
this.lastFoodLevel = foodLevel;
this.lastHungry = saturation == 0.0f;
}
super.update(context);
final TopHat topHat = getTopHat();
if (topHat != this.lastTopHat) {
if (this.lastTopHat == null) {
sendPassengerStack(context);
sendHat(context, topHat);
} else if (topHat == null) {
removePassengerStack(context);
} else {
sendHat(context, topHat);
}
this.lastTopHat = topHat;
}
if (this.lastYaw0 != this.lastYaw || this.lastPitch0 != this.lastPitch || this.lastFlags0 != this.lastFlags) {
for (final int id : this.passengerStack) {
context.sendToSelf(() -> new MessagePlayOutEntityLook(id, this.lastYaw, this.lastPitch, this.entity.isOnGround()));
}
if (this.lastTopHat != null) {
context.sendToSelf(() -> new MessagePlayOutEntityHeadLook(this.passengerStack[10], this.lastYaw));
context.sendToSelf(() -> new MessagePlayOutEntityHeadLook(this.passengerStack[11], this.lastYaw));
context.sendToSelf(() -> new MessagePlayOutEntityHeadLook(this.passengerStack[12], this.lastYaw));
// context.sendToSelf(() -> new MessagePlayOutEntityHeadLook(this.passengerStack[14], this.lastYaw));
if (this.lastFlags0 != this.lastFlags) {
final boolean glow = (this.lastFlags & 0x40) != 0;
final ParameterList parameterList = new ByteBufParameterList(ByteBufferAllocator.unpooled());
parameterList.add(EntityParameters.Base.FLAGS, (byte) (0x20 | (glow ? 0x40 : 0x00)));
context.sendToAll(() -> new MessagePlayOutEntityMetadata(this.passengerStack[10], parameterList));
context.sendToAll(() -> new MessagePlayOutEntityMetadata(this.passengerStack[11], parameterList));
}
}
this.lastYaw0 = this.lastYaw;
this.lastPitch0 = this.lastPitch;
this.lastFlags0 = this.lastFlags;
}
// Some 1.11.2 magic, ultra secret stuff...
final boolean elytraFlying = this.entity.get(LanternKeys.IS_ELYTRA_FLYING).orElse(false);
final boolean elytraSpeedBoost = this.entity.get(LanternKeys.ELYTRA_SPEED_BOOST).orElse(false);
if (this.lastElytraFlying != elytraFlying || this.lastElytraSpeedBoost != elytraSpeedBoost) {
if (this.lastElytraFlying && this.lastElytraSpeedBoost) {
context.sendToAll(() -> new MessagePlayOutDestroyEntities(this.elytraRocketId));
} else if (elytraFlying && elytraSpeedBoost) {
// Create the fireworks data item
final LanternItemStack itemStack = new LanternItemStack(ItemTypes.FIREWORKS);
// Write the item to a parameter list
final ByteBufParameterList parameterList = new ByteBufParameterList(ByteBufferAllocator.unpooled());
parameterList.add(EntityParameters.Fireworks.ITEM, itemStack);
parameterList.add(EntityParameters.Fireworks.ELYTRA_BOOST_PLAYER, getRootEntityId());
context.sendToAll(() -> new MessagePlayOutSpawnObject(this.elytraRocketId, UUID.randomUUID(), 76, 0, this.entity.getPosition(), 0, 0, Vector3d.ZERO));
context.sendToAll(() -> new MessagePlayOutEntityMetadata(this.elytraRocketId, parameterList));
}
this.lastElytraSpeedBoost = elytraSpeedBoost;
this.lastElytraFlying = elytraFlying;
}
}
use of org.lanternpowered.server.network.entity.parameter.ByteBufParameterList in project LanternServer by LanternPowered.
the class PlayerEntityProtocol method sendHat.
private void sendHat(EntityProtocolUpdateContext context, TopHat hat) {
final LanternItemStack paneItem;
final LanternItemStack blockItem;
final Optional<DyeColor> dyeColor = hat.getDyeColor();
if (dyeColor.isPresent()) {
paneItem = new LanternItemStack(BlockTypes.CARPET);
paneItem.offer(Keys.DYE_COLOR, dyeColor.get());
blockItem = new LanternItemStack(BlockTypes.WOOL);
blockItem.offer(Keys.DYE_COLOR, dyeColor.get());
} else if (hat == TopHats.GOLD) {
paneItem = new LanternItemStack(BlockTypes.LIGHT_WEIGHTED_PRESSURE_PLATE);
blockItem = new LanternItemStack(BlockTypes.GOLD_BLOCK);
} else if (hat == TopHats.IRON) {
paneItem = new LanternItemStack(BlockTypes.HEAVY_WEIGHTED_PRESSURE_PLATE);
blockItem = new LanternItemStack(BlockTypes.IRON_BLOCK);
} else if (hat == TopHats.WOOD) {
paneItem = new LanternItemStack(BlockTypes.WOODEN_PRESSURE_PLATE);
blockItem = new LanternItemStack(BlockTypes.PLANKS);
} else if (hat == TopHats.STONE) {
paneItem = new LanternItemStack(BlockTypes.STONE_PRESSURE_PLATE);
blockItem = new LanternItemStack(BlockTypes.STONE);
} else if (hat == TopHats.SNOW) {
paneItem = new LanternItemStack(BlockTypes.SNOW_LAYER);
blockItem = new LanternItemStack(BlockTypes.SNOW);
} else {
throw new IllegalStateException();
}
byte flags = 0x20;
if (getEntity().get(Keys.GLOWING).get()) {
flags |= 0x40;
}
final ParameterList parameterList1 = new ByteBufParameterList(ByteBufferAllocator.unpooled());
parameterList1.add(EntityParameters.ArmorStand.FLAGS, (byte) (0x08 | 0x10));
parameterList1.add(EntityParameters.Base.FLAGS, flags);
final int id1 = this.passengerStack[10];
context.sendToAll(() -> new MessagePlayOutSpawnObject(id1, UUID.randomUUID(), 78, 0, getEntity().getPosition(), 0, 0, Vector3d.ZERO));
context.sendToAll(() -> new MessagePlayOutEntityMetadata(id1, parameterList1));
context.sendToAll(() -> new MessagePlayOutEntityEquipment(id1, 5, paneItem));
final ParameterList parameterList2 = new ByteBufParameterList(ByteBufferAllocator.unpooled());
parameterList2.add(EntityParameters.ArmorStand.FLAGS, (byte) (0x08 | 0x10 | 0x01));
parameterList2.add(EntityParameters.Base.FLAGS, flags);
final int id2 = this.passengerStack[11];
context.sendToAll(() -> new MessagePlayOutSpawnObject(id2, UUID.randomUUID(), 78, 0, getEntity().getPosition(), 0, 0, Vector3d.ZERO));
context.sendToAll(() -> new MessagePlayOutEntityMetadata(id2, parameterList2));
context.sendToAll(() -> new MessagePlayOutEntityEquipment(id2, 5, blockItem));
sendPassengers(context, 8, 10);
sendPassengers(context, 9, 11);
/*
final LanternItemStack boneItem = new LanternItemStack(ItemTypes.BONE);
float angleA = 250f;
float angleB = 250f;
for (int i = 12; i <= 14; i++) {
final ParameterList parameterList3 = new ByteBufParameterList(ByteBufferAllocator.unpooled());
parameterList3.add(EntityParameters.ArmorStand.FLAGS, (byte) (0x08 | 0x10 | 0x01 | 0x04));
parameterList3.add(EntityParameters.ArmorStand.LEFT_ARM_ROTATION, new Vector3f(50f, 360f - angleA, angleB));
parameterList3.add(EntityParameters.ArmorStand.RIGHT_ARM_ROTATION, new Vector3f(50f, angleA, 360f - angleB));
parameterList3.add(EntityParameters.Base.FLAGS, flags);
final int id3 = this.passengerStack[i];
context.sendToAll(() -> new MessagePlayOutSpawnObject(id3, UUID.randomUUID(), 78, 0,
getEntity().getPosition(), 0, 0, Vector3d.ZERO));
context.sendToAll(() -> new MessagePlayOutEntityMetadata(id3, parameterList3));
context.sendToAll(() -> new MessagePlayOutEntityEquipment(id3, 0, boneItem));
context.sendToAll(() -> new MessagePlayOutEntityEquipment(id3, 1, boneItem));
angleA -= 15f;
angleB -= 15f;
}
sendPassengers(context, 7, 9, 12, 13, 14);
*/
}
Aggregations