diff --git a/src/client/entity/EntityTracker.cpp b/src/client/entity/EntityTracker.cpp index 0b657e4..e5a37cb 100644 --- a/src/client/entity/EntityTracker.cpp +++ b/src/client/entity/EntityTracker.cpp @@ -309,8 +309,10 @@ namespace perlin::entity { PERLIN_ENTITY_SET(SetBoundingBox(uint64_t rid, float width, float height), e.boxWidth = width; e.boxHeight = height) PERLIN_ENTITY_SET(SetNameTag(uint64_t rid, const std::string& nameTag), e.nameTag = nameTag) - PERLIN_ENTITY_SET(SetVariant(uint64_t rid, int variant, int markVariant, int color), e.variant = variant; - e.markVariant = markVariant; e.color = color) + PERLIN_ENTITY_SET(SetVariant(uint64_t rid, std::optional variant, std::optional markVariant, + std::optional color), + if (variant) e.variant = *variant; + if (markVariant) e.markVariant = *markVariant; if (color) e.color = *color) PERLIN_ENTITY_SET(SetHealth(uint64_t rid, float health), e.health = health; if (health <= 0.0f && !e.isItem) e.dying = true; else if (health > 0.0f) e.dying = false) diff --git a/src/client/entity/EntityTracker.hpp b/src/client/entity/EntityTracker.hpp index e51fc60..39af6eb 100644 --- a/src/client/entity/EntityTracker.hpp +++ b/src/client/entity/EntityTracker.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include #include @@ -193,7 +194,9 @@ namespace perlin::entity { void SetScale(uint64_t rid, float scale); void SetBoundingBox(uint64_t rid, float width, float height); void SetNameTag(uint64_t rid, const std::string& nameTag); - void SetVariant(uint64_t rid, int variant, int markVariant, int color); + // an update that leaves a field out keeps its value: servers resend only what changed + void SetVariant(uint64_t rid, std::optional variant, std::optional markVariant, + std::optional color); void SetHealth(uint64_t rid, float health); void SetAttribute(uint64_t rid, const std::string& name, float min, float value, float max); void SetOwner(uint64_t rid, int64_t ownerUid); diff --git a/src/client/multiplayer/BedrockHandlers.cpp b/src/client/multiplayer/BedrockHandlers.cpp index d7a6af4..25eae3e 100644 --- a/src/client/multiplayer/BedrockHandlers.cpp +++ b/src/client/multiplayer/BedrockHandlers.cpp @@ -108,7 +108,7 @@ namespace perlin { void ApplyMetadata(entity::EntityTracker& tracker, uint64_t rid, const std::vector& metadata) { - int variant = -1, mark = -1, color = -1; + std::optional variant, mark, color; float boxWidth = 0.0f, boxHeight = 0.0f; static const bool debugTags = std::getenv("PERLIN_DEBUG_NAMETAGS") != nullptr; for (const MetadataDictionaryEntry& m : metadata) { @@ -191,8 +191,9 @@ namespace perlin { break; } } - if (variant >= 0 || mark >= 0 || color >= 0) - tracker.SetVariant(rid, std::max(variant, 0), std::max(mark, 0), std::max(color, 0)); + const auto clamp = [](std::optional v) { return v ? std::optional(std::max(*v, 0)) : v; }; + if (variant || mark || color) + tracker.SetVariant(rid, clamp(variant), clamp(mark), clamp(color)); if (boxWidth > 0.0f && boxHeight > 0.0f) tracker.SetBoundingBox(rid, boxWidth, boxHeight); }