Skip to content

Commit

Permalink
Attribute rework
Browse files Browse the repository at this point in the history
  • Loading branch information
SamB440 committed Jul 1, 2024
1 parent c1531a7 commit 2df7c68
Show file tree
Hide file tree
Showing 26 changed files with 253 additions and 145 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.data.packetentity.PacketEntity;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
Expand Down Expand Up @@ -48,7 +49,7 @@ public void onPacketReceive(final PacketReceiveEvent event) {
// 27/12/2023 - Dynamic values for more than just one entity type?
// 28/12/2023 - Player-only is fine
// 30/12/2023 - Expansions differ in 1.9+
final float scale = packetEntity.scale;
final float scale = (float) packetEntity.getAttribute(Attributes.GENERIC_SCALE).get();
if (targetVector.y > (minY * scale) && targetVector.y < (maxY * scale)
&& Math.abs(targetVector.x) < (maxXZ * scale)
&& Math.abs(targetVector.z) < (maxXZ * scale)) {
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import ac.grim.grimac.utils.data.packetentity.dragon.PacketEntityEnderDragonPart;
import ac.grim.grimac.utils.nmsutil.ReachUtils;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
Expand Down Expand Up @@ -135,7 +136,7 @@ private boolean isKnownInvalid(PacketEntity reachEntity) {
if (reachEntity.getType() == EntityTypes.END_CRYSTAL) {
targetBox = new SimpleCollisionBox(reachEntity.trackedServerPosition.getPos().subtract(1, 0, 1), reachEntity.trackedServerPosition.getPos().add(1, 2, 1));
}
return ReachUtils.getMinReachToBox(player, targetBox) > player.compensatedEntities.getSelf().getEntityInteractRange();
return ReachUtils.getMinReachToBox(player, targetBox) > player.compensatedEntities.getSelf().getAttribute(Attributes.PLAYER_ENTITY_INTERACTION_RANGE).get();
}
}

Expand Down Expand Up @@ -199,7 +200,7 @@ private String checkReach(PacketEntity reachEntity, Vector3d from, boolean isPre
}

// +3 would be 3 + 3 = 6, which is the pre-1.20.5 behaviour, preventing "Missed Hitbox"
final double distance = player.compensatedEntities.getSelf().getEntityInteractRange() + 3;
final double distance = player.compensatedEntities.getSelf().getAttribute(Attributes.PLAYER_ENTITY_INTERACTION_RANGE).get() + 3;
for (Vector lookVec : possibleLookDirs) {
for (double eye : player.getPossibleEyeHeights()) {
Vector eyePos = new Vector(from.getX(), from.getY() + eye, from.getZ());
Expand All @@ -223,7 +224,7 @@ private String checkReach(PacketEntity reachEntity, Vector3d from, boolean isPre
if (minDistance == Double.MAX_VALUE) {
cancelBuffer = 1;
return "Missed hitbox";
} else if (minDistance > player.compensatedEntities.getSelf().getEntityInteractRange()) {
} else if (minDistance > player.compensatedEntities.getSelf().getAttribute(Attributes.PLAYER_ENTITY_INTERACTION_RANGE).get()) {
cancelBuffer = 1;
return String.format("%.5f", minDistance) + " blocks";
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,14 +186,7 @@ public void onPacketSend(PacketSendEvent event) {
// TODO And there should probably be some attribute holder that we can just call reset() on.
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_16) && !this.hasFlag(respawn, KEEP_ATTRIBUTES)) {
// Reset attributes if not kept
final PacketEntitySelf self = player.compensatedEntities.getSelf();
self.gravityAttribute = 0.08d;
self.stepHeight = 0.6f;
self.scale = 1.0f;
self.setJumpStrength(0.42f);
self.setBreakSpeedMultiplier(1.0f);
self.setBlockInteractRange(4.5);
self.setEntityInteractRange(3.0);
player.compensatedEntities.getSelf().resetAttributes();
player.compensatedEntities.hasSprintingAttributeEnabled = false;
}
});
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/ac/grim/grimac/player/GrimPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.netty.channel.ChannelHelper;
import com.github.retrooper.packetevents.protocol.ConnectionState;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.GameMode;
Expand Down Expand Up @@ -347,14 +348,14 @@ public void trackBaseTickAddition(Vector vector) {
public float getMaxUpStep() {
final PacketEntitySelf self = compensatedEntities.getSelf();
final PacketEntity riding = self.getRiding();
if (riding == null) return self.stepHeight;
if (riding == null) return (float) self.getAttribute(Attributes.GENERIC_STEP_HEIGHT).get();

if (riding.isBoat()) {
return 0f;
}

// Pigs, horses, striders, and other vehicles all have 1 stepping height by default
return riding.stepHeight;
return (float) riding.getAttribute(Attributes.GENERIC_STEP_HEIGHT).get();
}

public void sendTransaction() {
Expand Down Expand Up @@ -550,7 +551,7 @@ public CompensatedInventory getInventory() {

public List<Double> getPossibleEyeHeights() { // We don't return sleeping eye height
if (getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_14)) { // Elytra, sneaking (1.14), standing
final float scale = compensatedEntities.getSelf().scale;
final float scale = (float) compensatedEntities.getSelf().getAttribute(Attributes.GENERIC_SCALE).get();
return Arrays.asList(0.4 * scale, 1.27 * scale, 1.62 * scale);
} else if (getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9)) { // Elytra, sneaking, standing
return Arrays.asList(0.4, 1.54, 1.62);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import ac.grim.grimac.utils.nmsutil.*;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.item.ItemStack;
import com.github.retrooper.packetevents.protocol.item.enchantment.type.EnchantmentTypes;
Expand Down Expand Up @@ -189,8 +190,9 @@ private void check(PositionUpdate update) {
SimpleCollisionBox interTruePositions = riding.getPossibleCollisionBoxes();

// We shrink the expanded bounding box to what the packet positions can be, for a smaller box
float width = BoundingBoxSize.getWidth(player, riding) * riding.scale;
float height = BoundingBoxSize.getHeight(player, riding) * riding.scale;
final float scale = (float) riding.getAttribute(Attributes.GENERIC_SCALE).get();
float width = BoundingBoxSize.getWidth(player, riding) * scale;
float height = BoundingBoxSize.getHeight(player, riding) * scale;
interTruePositions.expand(-width, 0, -width);
interTruePositions.expandMax(0, -height, 0);

Expand Down Expand Up @@ -236,7 +238,7 @@ private void check(PositionUpdate update) {
if (player.isInBed) return;

if (!player.compensatedEntities.getSelf().inVehicle()) {
player.speed = player.compensatedEntities.getPlayerMovementSpeed();
player.speed = player.compensatedEntities.getSelf().getAttribute(Attributes.GENERIC_MOVEMENT_SPEED).get();
if (player.hasGravity != player.playerEntityHasGravity) {
player.pointThreeEstimator.updatePlayerGravity();
}
Expand Down Expand Up @@ -443,10 +445,19 @@ private void check(PositionUpdate update) {
wasChecked = true;

// Depth strider was added in 1.8
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_8)) {
player.depthStriderLevel = EnchantmentHelper.getMaximumEnchantLevel(player.getInventory(), EnchantmentTypes.DEPTH_STRIDER, PacketEvents.getAPI().getServerManager().getVersion().toClientVersion());
final boolean hasAttributes = player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_21);
if (hasAttributes && PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_21)) {
player.depthStriderLevel = (float) player.compensatedEntities.getSelf().getAttribute(Attributes.GENERIC_WATER_MOVEMENT_EFFICIENCY).get();
} else {
player.depthStriderLevel = 0;
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_8)) {
player.depthStriderLevel = EnchantmentHelper.getMaximumEnchantLevel(player.getInventory(), EnchantmentTypes.DEPTH_STRIDER, PacketEvents.getAPI().getServerManager().getVersion().toClientVersion());
if (hasAttributes && PacketEvents.getAPI().getServerManager().getVersion().isOlderThan(ServerVersion.V_1_21)) {
// This is what via does
player.depthStriderLevel /= 3.0;
}
} else {
player.depthStriderLevel = 0;
}
}

if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_19)) {
Expand Down
17 changes: 11 additions & 6 deletions src/main/java/ac/grim/grimac/predictionengine/PlayerBaseTick.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox;
import ac.grim.grimac.utils.data.attribute.ValuedAttribute;
import ac.grim.grimac.utils.data.packetentity.PacketEntity;
import ac.grim.grimac.utils.enums.FluidTag;
import ac.grim.grimac.utils.enums.Pose;
import ac.grim.grimac.utils.latency.CompensatedEntities;
import ac.grim.grimac.utils.math.GrimMath;
import ac.grim.grimac.utils.nmsutil.*;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.world.BlockFace;
import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
Expand All @@ -30,8 +30,9 @@ public static boolean canEnterPose(GrimPlayer player, Pose pose, double x, doubl
}

protected static SimpleCollisionBox getBoundingBoxForPose(GrimPlayer player, Pose pose, double x, double y, double z) {
final float width = pose.width * player.compensatedEntities.getSelf().scale;
final float height = pose.height * player.compensatedEntities.getSelf().scale;
final float scale = (float) player.compensatedEntities.getSelf().getAttribute(Attributes.GENERIC_SCALE).get();
final float width = pose.width * scale;
final float height = pose.height * scale;
float radius = width / 2.0F;
return new SimpleCollisionBox(x - radius, y, z - radius, x + radius, y + height, z + radius, false);
}
Expand Down Expand Up @@ -144,7 +145,9 @@ public void updatePowderSnow() {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_16_4)) return;

// The client first desync's this attribute
player.compensatedEntities.getSelf().playerSpeed.getModifiers().removeIf(modifier -> modifier.getUUID().equals(CompensatedEntities.SNOW_MODIFIER_UUID) || modifier.getName().getKey().equals("powder_snow"));
final ValuedAttribute playerSpeed = player.compensatedEntities.getSelf().getAttribute(Attributes.GENERIC_MOVEMENT_SPEED);
playerSpeed.property().get().getModifiers().removeIf(modifier -> modifier.getUUID().equals(CompensatedEntities.SNOW_MODIFIER_UUID) || modifier.getName().getKey().equals("powder_snow"));
playerSpeed.recalculate();

// And then re-adds it using purely what the server has sent it
StateType type = BlockProperties.getOnPos(player, player.mainSupportingBlockData, new Vector3d(player.x, player.y, player.z));
Expand All @@ -156,7 +159,9 @@ public void updatePowderSnow() {
// Remember, floats are not commutative, we must do it in the client's specific order
float percentFrozen = (float) Math.min(i, ticksToFreeze) / (float) ticksToFreeze;
float percentFrozenReducedToSpeed = -0.05F * percentFrozen;
player.compensatedEntities.getSelf().playerSpeed.getModifiers().add(new WrapperPlayServerUpdateAttributes.PropertyModifier(CompensatedEntities.SNOW_MODIFIER_UUID, percentFrozenReducedToSpeed, WrapperPlayServerUpdateAttributes.PropertyModifier.Operation.ADDITION));

playerSpeed.property().get().getModifiers().add(new WrapperPlayServerUpdateAttributes.PropertyModifier(CompensatedEntities.SNOW_MODIFIER_UUID, percentFrozenReducedToSpeed, WrapperPlayServerUpdateAttributes.PropertyModifier.Operation.ADDITION));
playerSpeed.recalculate();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import ac.grim.grimac.utils.lists.EvictingQueue;
import ac.grim.grimac.utils.nmsutil.BoundingBoxSize;
import ac.grim.grimac.utils.nmsutil.ReachUtils;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.world.BlockFace;
import org.bukkit.util.Vector;
Expand Down Expand Up @@ -138,8 +139,9 @@ public void tickFireworksBox() {
if (entity == null) continue;

SimpleCollisionBox entityBox = entity.getPossibleCollisionBoxes();
float width = BoundingBoxSize.getWidth(player, entity) * entity.scale;
float height = BoundingBoxSize.getHeight(player, entity) * entity.scale;
final float scale = (float) entity.getAttribute(Attributes.GENERIC_SCALE).get();
float width = BoundingBoxSize.getWidth(player, entity) * scale;
float height = BoundingBoxSize.getHeight(player, entity) * scale;

// Convert back to coordinates instead of hitbox
entityBox.maxY -= height;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import ac.grim.grimac.utils.data.packetentity.PacketEntityStrider;
import ac.grim.grimac.utils.math.GrimMath;
import ac.grim.grimac.utils.nmsutil.*;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.world.states.defaulttags.BlockTags;
Expand Down Expand Up @@ -307,8 +308,8 @@ public void doNormalMove(float blockFriction) {

public void livingEntityTravel() {
double playerGravity = player.compensatedEntities.getSelf().getRiding() == null
? player.compensatedEntities.getSelf().gravityAttribute
: player.compensatedEntities.getSelf().getRiding().gravityAttribute;
? player.compensatedEntities.getSelf().getAttribute(Attributes.GENERIC_GRAVITY).get()
: player.compensatedEntities.getSelf().getRiding().getAttribute(Attributes.GENERIC_GRAVITY).get();

boolean isFalling = player.actualMovement.getY() <= 0.0;
if (isFalling && player.compensatedEntities.getSlowFallingAmplifier() != null) {
Expand All @@ -332,17 +333,24 @@ public void livingEntityTravel() {
swimFriction = player.isSprinting && player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_13) ? 0.9F : (isSkeletonHorse ? 0.96F : 0.8F);
float swimSpeed = 0.02F;

if (player.depthStriderLevel > 3.0F) {
if (player.getClientVersion().isOlderThan(ClientVersion.V_1_21) && player.depthStriderLevel > 3.0F) {
player.depthStriderLevel = 3.0F;
}

if (!player.lastOnGround) {
player.depthStriderLevel *= 0.5F;
}

if (player.depthStriderLevel > 0.0F) {
swimFriction += (0.54600006F - swimFriction) * player.depthStriderLevel / 3.0F;
swimSpeed += (player.speed - swimSpeed) * player.depthStriderLevel / 3.0F;
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_21)) {
if (player.depthStriderLevel > 0.0F) {
swimFriction += (0.54600006F - swimFriction) * player.depthStriderLevel;
swimSpeed += (player.speed - swimSpeed) * player.depthStriderLevel;
}
} else {
if (player.depthStriderLevel > 0.0F) {
swimFriction += (0.54600006F - swimFriction) * player.depthStriderLevel / 3.0F;
swimSpeed += (player.speed - swimSpeed) * player.depthStriderLevel / 3.0F;
}
}

if (player.compensatedEntities.getDolphinsGraceAmplifier() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.data.packetentity.PacketEntityHorse;
import ac.grim.grimac.utils.nmsutil.Collisions;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import org.bukkit.util.Vector;

Expand All @@ -15,7 +16,7 @@ public MovementTickerHorse(GrimPlayer player) {

if (!horsePacket.hasSaddle) return;

player.speed = horsePacket.movementSpeedAttribute;
player.speed = horsePacket.getAttribute(Attributes.GENERIC_MOVEMENT_SPEED).get();

// Setup player inputs
float horizInput = player.vehicleData.vehicleHorizontal * 0.5F;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.data.packetentity.PacketEntityRideable;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import org.bukkit.util.Vector;

public class MovementTickerPig extends MovementTickerRideable {
Expand All @@ -13,6 +14,6 @@ public MovementTickerPig(GrimPlayer player) {
@Override
public float getSteeringSpeed() { // Vanilla multiples by 0.225f
PacketEntityRideable pig = (PacketEntityRideable) player.compensatedEntities.getSelf().getRiding();
return pig.movementSpeedAttribute * 0.225f;
return (float) pig.getAttribute(Attributes.GENERIC_MOVEMENT_SPEED).get() * 0.225f;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.data.packetentity.PacketEntityStrider;
import ac.grim.grimac.utils.nmsutil.BlockProperties;
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
import com.github.retrooper.packetevents.protocol.world.states.defaulttags.BlockTags;
import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
import com.github.retrooper.packetevents.util.Vector3d;
Expand Down Expand Up @@ -47,7 +48,7 @@ public void livingEntityAIStep() {
@Override
public float getSteeringSpeed() {
PacketEntityStrider strider = (PacketEntityStrider) player.compensatedEntities.getSelf().getRiding();
return strider.movementSpeedAttribute * (strider.isShaking ? 0.23F : 0.55F);
return (float) strider.getAttribute(Attributes.GENERIC_MOVEMENT_SPEED).get() * (strider.isShaking ? 0.23F : 0.55F);
}

@Override
Expand Down
Loading

0 comments on commit 2df7c68

Please sign in to comment.