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

summaryrefslogtreecommitdiff
path: root/source/game/StarPlayer.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2024-12-26 20:53:06 +1100
committerKae <80987908+Novaenia@users.noreply.github.com>2024-12-26 20:53:06 +1100
commit0a1a82b18b86362263c8fa9ce8919c6d3b36d85c (patch)
tree888f0c8ae4ae87bfb8f5c5aaec669e8ebaf68482 /source/game/StarPlayer.cpp
parent3df5cb78da86912c30b6281f4eafeddd4ba56f32 (diff)
Head Rotation
(way too hardcoded, not ideal but it will do in the meantime as many have been asking for it)
Diffstat (limited to 'source/game/StarPlayer.cpp')
-rw-r--r--source/game/StarPlayer.cpp40
1 files changed, 35 insertions, 5 deletions
diff --git a/source/game/StarPlayer.cpp b/source/game/StarPlayer.cpp
index 2f89ff3..24a3c16 100644
--- a/source/game/StarPlayer.cpp
+++ b/source/game/StarPlayer.cpp
@@ -1021,16 +1021,16 @@ void Player::update(float dt, uint64_t) {
|| m_humanoid->danceCyclicOrEnded() || m_movementController->running())
m_humanoid->setDance({});
- bool isClient = world()->isClient();
- if (isClient)
- m_armor->setupHumanoidClothingDrawables(*m_humanoid, forceNude());
-
m_tools->suppressItems(suppressedItems);
m_tools->tick(dt, m_shifting, m_pendingMoves);
-
+
if (auto overrideFacingDirection = m_tools->setupHumanoidHandItems(*m_humanoid, position(), aimPosition()))
m_movementController->controlFace(*overrideFacingDirection);
+ bool isClient = world()->isClient();
+ if (isClient)
+ m_armor->setupHumanoidClothingDrawables(*m_humanoid, forceNude());
+
m_effectsAnimator->resetTransformationGroup("flip");
if (m_movementController->facingDirection() == Direction::Left)
m_effectsAnimator->scaleTransformationGroup("flip", Vec2F(-1, 1));
@@ -1075,6 +1075,35 @@ void Player::update(float dt, uint64_t) {
m_effectEmitter->tick(dt, *entityMode());
+ if (isClient) {
+ bool calculateHeadRotation = isMaster();
+ if (!calculateHeadRotation) {
+ auto headRotationProperty = getSecretProperty("humanoid.headRotation");
+ if (headRotationProperty.isType(Json::Type::Float)) {
+ m_humanoid->setHeadRotation(headRotationProperty.toFloat());
+ } else
+ calculateHeadRotation = true;
+ }
+ if (calculateHeadRotation) { // master or not an OpenStarbound player
+ float headRotation = 0.f;
+ if (m_humanoid->primaryHandHoldingItem() || m_humanoid->altHandHoldingItem()) {
+ auto primary = m_tools->primaryHandItem();
+ auto alt = m_tools->altHandItem();
+ String const disableFlag = "disableHeadRotation";
+ auto statusFlag = m_statusController->statusProperty(disableFlag);
+ if (!(statusFlag.isType(Json::Type::Bool) && statusFlag.toBool())
+ && !(primary && primary->instanceValue(disableFlag))
+ && !(alt && alt->instanceValue(disableFlag))) {
+ auto diff = world()->geometry().diff(aimPosition(), mouthPosition());
+ diff.setX(fabsf(diff.x()));
+ headRotation = diff.angle() * .25f * numericalDirection(m_humanoid->facingDirection());
+ }
+ }
+ m_humanoid->setHeadRotation(headRotation);
+ setSecretProperty("humanoid.headRotation", headRotation);
+ }
+ }
+
m_humanoid->setFacingDirection(m_movementController->facingDirection());
m_humanoid->setMovingBackwards(m_movementController->facingDirection() != m_movementController->movingDirection());
@@ -2610,6 +2639,7 @@ Maybe<StringView> Player::getSecretPropertyView(String const& name) const {
return {};
}
+
Json Player::getSecretProperty(String const& name, Json defaultValue) const {
if (auto tag = m_effectsAnimator->globalTagPtr(secretProprefix + name)) {
DataStreamExternalBuffer buffer(tag->utf8Ptr(), tag->utf8Size());