@Override
    public boolean equals(final Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof UserLocation other)) {
            return super.equals(obj);
        }

        if (Float.floatToIntBits(getLatitude()) != Float.floatToIntBits(other.getLatitude())) {
            return false;
        }
        if (Float.floatToIntBits(getLongitude()) != Float.floatToIntBits(other.getLongitude())) {
            return false;
        }
        if (hasTimestamp() != other.hasTimestamp()) {
            return false;
        }
        if (hasTimestamp()) {
            if (getTimestamp() != other.getTimestamp()) {
                return false;
            }
        }
        return internalGetDetails().equals(other.internalGetDetails())
                && getCustomAttributesList().equals(other.getCustomAttributesList())
                && getUnknownFields().equals(other.getUnknownFields());
    }
<code>repeated .im.turms.proto.Value custom_attributes = 15;</code>
turms-server-common/src/main/java/im/turms/server/common/access/client/dto/model/user/UserLocation.java