Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2025-01-21 09:07:37 +1100
committerKae <80987908+Novaenia@users.noreply.github.com>2025-01-21 09:07:37 +1100
commit3f8b480b21538a97e6256ad7a0fcb95cb1b27e46 (patch)
tree9c0353ebb114127fd9ca11d1339e478b994fb434
parent449d05d195cf7b3215a2338afa593bfcef052796 (diff)
let chest and leg armor override humanoid config values
-rw-r--r--source/game/StarArmorWearer.cpp84
-rw-r--r--source/game/StarHumanoid.cpp10
-rw-r--r--source/game/StarHumanoid.hpp5
3 files changed, 51 insertions, 48 deletions
diff --git a/source/game/StarArmorWearer.cpp b/source/game/StarArmorWearer.cpp
index 89bebe3..f4dba55 100644
--- a/source/game/StarArmorWearer.cpp
+++ b/source/game/StarArmorWearer.cpp
@@ -40,79 +40,73 @@ void ArmorWearer::setupHumanoidClothingDrawables(Humanoid& humanoid, bool forceN
bool backNeedsSync = nudeChanged || m_backNeedsSync;
bool bodyHidden = false;
- if (m_headCosmeticItem && !forceNude) {
+ HeadArmorPtr const& headArmor = m_headCosmeticItem ? m_headCosmeticItem : m_headItem;
+ if (headArmor && !forceNude) {
if (headNeedsSync) {
- humanoid.setHeadArmorFrameset(m_headCosmeticItem->frameset(humanoid.identity().gender));
- humanoid.setHeadArmorDirectives(m_headCosmeticItem->directives());
- humanoid.setHelmetMaskDirectives(m_headCosmeticItem->maskDirectives());
+ humanoid.setHeadArmorFrameset(headArmor->frameset(humanoid.identity().gender));
+ humanoid.setHeadArmorDirectives(headArmor->directives());
+ humanoid.setHelmetMaskDirectives(headArmor->maskDirectives());
}
- bodyHidden = bodyHidden || m_headCosmeticItem->hideBody();
- } else if (m_headItem && !forceNude) {
- if (headNeedsSync) {
- humanoid.setHeadArmorFrameset(m_headItem->frameset(humanoid.identity().gender));
- humanoid.setHeadArmorDirectives(m_headItem->directives());
- humanoid.setHelmetMaskDirectives(m_headItem->maskDirectives());
- }
- bodyHidden = bodyHidden || m_headItem->hideBody();
+ bodyHidden = bodyHidden || headArmor->hideBody();
} else {
humanoid.setHeadArmorFrameset("");
humanoid.setHelmetMaskDirectives("");
}
- if (m_chestCosmeticItem && !forceNude) {
- if (chestNeedsSync) {
- humanoid.setBackSleeveFrameset(m_chestCosmeticItem->backSleeveFrameset(humanoid.identity().gender));
- humanoid.setFrontSleeveFrameset(m_chestCosmeticItem->frontSleeveFrameset(humanoid.identity().gender));
- humanoid.setChestArmorFrameset(m_chestCosmeticItem->bodyFrameset(humanoid.identity().gender));
- humanoid.setChestArmorDirectives(m_chestCosmeticItem->directives());
+ Json humanoidConfig;
+
+ auto addHumanoidConfig = [&](Item const& item) {
+ auto newConfig = item.instanceValue("humanoidConfig");
+ if (newConfig.isType(Json::Type::Object)) {
+ if (!humanoidConfig)
+ humanoidConfig = JsonObject();
+ humanoidConfig = jsonMerge(humanoidConfig, newConfig);
}
- bodyHidden = bodyHidden || m_chestCosmeticItem->hideBody();
- } else if (m_chestItem && !forceNude) {
+ };
+
+ ChestArmorPtr const& chestArmor = m_chestCosmeticItem ? m_chestCosmeticItem : m_chestItem;
+ if (chestArmor && !forceNude) {
if (chestNeedsSync) {
- humanoid.setBackSleeveFrameset(m_chestItem->backSleeveFrameset(humanoid.identity().gender));
- humanoid.setFrontSleeveFrameset(m_chestItem->frontSleeveFrameset(humanoid.identity().gender));
- humanoid.setChestArmorFrameset(m_chestItem->bodyFrameset(humanoid.identity().gender));
- humanoid.setChestArmorDirectives(m_chestItem->directives());
+ humanoid.setBackSleeveFrameset(chestArmor->backSleeveFrameset(humanoid.identity().gender));
+ humanoid.setFrontSleeveFrameset(chestArmor->frontSleeveFrameset(humanoid.identity().gender));
+ humanoid.setChestArmorFrameset(chestArmor->bodyFrameset(humanoid.identity().gender));
+ humanoid.setChestArmorDirectives(chestArmor->directives());
+ addHumanoidConfig(*chestArmor);
}
- bodyHidden = bodyHidden || m_chestItem->hideBody();
+ bodyHidden = bodyHidden || chestArmor->hideBody();
} else {
humanoid.setBackSleeveFrameset("");
humanoid.setFrontSleeveFrameset("");
humanoid.setChestArmorFrameset("");
}
- if (m_legsCosmeticItem && !forceNude) {
+ LegsArmorPtr const& legsArmor = m_legsCosmeticItem ? m_legsCosmeticItem : m_legsItem;
+ if (legsArmor && !forceNude) {
if (legsNeedsSync) {
- humanoid.setLegsArmorFrameset(m_legsCosmeticItem->frameset(humanoid.identity().gender));
- humanoid.setLegsArmorDirectives(m_legsCosmeticItem->directives());
+ humanoid.setLegsArmorFrameset(legsArmor->frameset(humanoid.identity().gender));
+ humanoid.setLegsArmorDirectives(legsArmor->directives());
+ addHumanoidConfig(*chestArmor);
}
- bodyHidden = bodyHidden || m_legsCosmeticItem->hideBody();
- } else if (m_legsItem && !forceNude) {
- if (legsNeedsSync) {
- humanoid.setLegsArmorFrameset(m_legsItem->frameset(humanoid.identity().gender));
- humanoid.setLegsArmorDirectives(m_legsItem->directives());
- }
- bodyHidden = bodyHidden || m_legsItem->hideBody();
+ bodyHidden = bodyHidden || legsArmor->hideBody();
} else {
humanoid.setLegsArmorFrameset("");
}
- if (m_backCosmeticItem && !forceNude) {
- if (backNeedsSync) {
- humanoid.setBackArmorFrameset(m_backCosmeticItem->frameset(humanoid.identity().gender));
- humanoid.setBackArmorDirectives(m_backCosmeticItem->directives());
- }
- bodyHidden = bodyHidden || m_backCosmeticItem->hideBody();
- } else if (m_backItem && !forceNude) {
+ BackArmorPtr const& backArmor = m_backCosmeticItem ? m_backCosmeticItem : m_backItem;
+ if (backArmor && !forceNude) {
if (backNeedsSync) {
- humanoid.setBackArmorFrameset(m_backItem->frameset(humanoid.identity().gender));
- humanoid.setBackArmorDirectives(m_backItem->directives());
+ humanoid.setBackArmorFrameset(backArmor->frameset(humanoid.identity().gender));
+ humanoid.setBackArmorDirectives(backArmor->directives());
}
- bodyHidden = bodyHidden || m_backItem->hideBody();
+ bodyHidden = bodyHidden || backArmor->hideBody();
} else {
humanoid.setBackArmorFrameset("");
}
+ if (chestNeedsSync || legsNeedsSync) {
+ humanoid.loadConfig(humanoidConfig);
+ }
+
m_headNeedsSync = m_chestNeedsSync = m_legsNeedsSync = m_backNeedsSync = false;
humanoid.setBodyHidden(bodyHidden);
diff --git a/source/game/StarHumanoid.cpp b/source/game/StarHumanoid.cpp
index 2acc632..e446142 100644
--- a/source/game/StarHumanoid.cpp
+++ b/source/game/StarHumanoid.cpp
@@ -251,7 +251,8 @@ bool& Humanoid::globalHeadRotation() {
};
Humanoid::Humanoid(Json const& config) {
- loadConfig(config);
+ m_baseConfig = config;
+ loadConfig(JsonObject());
m_twoHanded = false;
m_primaryHand.holdingItem = false;
@@ -293,7 +294,12 @@ HumanoidIdentity const& Humanoid::identity() const {
return m_identity;
}
-void Humanoid::loadConfig(Json const& config) {
+void Humanoid::loadConfig(Json merger) {
+ if (m_mergeConfig == merger)
+ return;
+
+ m_mergeConfig = merger;
+ auto config = jsonMerge(m_baseConfig, merger);
m_timing = HumanoidTiming(config.getObject("humanoidTiming"));
m_globalOffset = jsonToVec2F(config.get("globalOffset")) / TilePixels;
diff --git a/source/game/StarHumanoid.hpp b/source/game/StarHumanoid.hpp
index d43c5ef..d11de1d 100644
--- a/source/game/StarHumanoid.hpp
+++ b/source/game/StarHumanoid.hpp
@@ -127,7 +127,7 @@ public:
void setIdentity(HumanoidIdentity const& identity);
HumanoidIdentity const& identity() const;
- void loadConfig(Json const& config);
+ void loadConfig(Json merger = JsonObject());
// All of the image identifiers here are meant to be image *base* names, with
// a collection of frames specific to each piece. If an image is set to
@@ -308,6 +308,9 @@ private:
Maybe<DancePtr> getDance() const;
+ Json m_baseConfig;
+ Json m_mergeConfig;
+
Vec2F m_globalOffset;
Vec2F m_headRunOffset;
Vec2F m_headSwimOffset;