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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-08-21 21:18:27 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-08-21 21:18:27 +1000
commitce6cadd2a0fe344251f53fc64c859b2ad078d45f (patch)
tree933b94dbd63ccf29b6ec2ce0f0b99457c5c64d19
parentbd4b1ed45c373a77cb717936a87f9515817a6a05 (diff)
Store material item settings in player secret properties instead of parameters
-rw-r--r--source/game/items/StarMaterialItem.cpp39
-rw-r--r--source/game/items/StarMaterialItem.hpp1
2 files changed, 29 insertions, 11 deletions
diff --git a/source/game/items/StarMaterialItem.cpp b/source/game/items/StarMaterialItem.cpp
index ca7b2de..f3b955c 100644
--- a/source/game/items/StarMaterialItem.cpp
+++ b/source/game/items/StarMaterialItem.cpp
@@ -9,10 +9,14 @@
#include "StarWorldTemplate.hpp"
#include "StarInput.hpp"
#include "StarTileDrawer.hpp"
+#include "StarPlayer.hpp"
namespace Star {
constexpr int BlockRadiusLimit = 16;
+const String BlockRadiusPropertyKey = "building.blockRadius";
+const String AltBlockRadiusPropertyKey = "building.altBlockRadius";
+const String CollisionOverridePropertyKey = "building.collisionOverride";
MaterialItem::MaterialItem(Json const& config, String const& directory, Json const& settings)
: Item(config, directory, settings), FireableItem(config), BeamItem(config) {
@@ -64,6 +68,7 @@ void MaterialItem::init(ToolUserEntity* owner, ToolHand hand) {
FireableItem::init(owner, hand);
BeamItem::init(owner, hand);
owner->addSound(Random::randValueFrom(m_placeSounds), 1.0f, 2.0f);
+ updateProperties();
}
void MaterialItem::uninit() {
@@ -91,32 +96,28 @@ void MaterialItem::update(float dt, FireMode fireMode, bool shifting, HashSet<Mo
if (collisionKindFromOverride(m_collisionOverride) != baseKind)
break;
}
+ if (auto player = as<Player>(owner()))
+ player->setSecretProperty(CollisionOverridePropertyKey, TileCollisionOverrideNames.getRight(m_collisionOverride));
}
owner()->addSound("/sfx/tools/cyclematcollision.ogg", 1.0f, Random::randf(0.9f, 1.1f));
}
if (auto presses = input.bindDown("opensb", "buildingRadiusGrow")) {
m_blockRadius = min(BlockRadiusLimit, int(m_blockRadius + *presses));
+ if (auto player = as<Player>(owner()))
+ player->setSecretProperty(BlockRadiusPropertyKey, m_blockRadius);
owner()->addSound("/sfx/tools/buildradiusgrow.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit);
}
if (auto presses = input.bindDown("opensb", "buildingRadiusShrink")) {
m_blockRadius = max(1, int(m_blockRadius - *presses));
+ if (auto player = as<Player>(owner()))
+ player->setSecretProperty(BlockRadiusPropertyKey, m_blockRadius);
owner()->addSound("/sfx/tools/buildradiusshrink.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit);
}
}
else {
- auto blockRadius = instanceValue("blockRadius");
- if (blockRadius.isType(Json::Type::Float))
- m_blockRadius = blockRadius.toFloat();
-
- auto altBlockRadius = instanceValue("altBlockRadius");
- if (altBlockRadius.isType(Json::Type::Float))
- m_altBlockRadius = altBlockRadius.toFloat();
-
- auto collisionOverride = instanceValue("collisionOverride");
- if (collisionOverride.isType(Json::Type::String))
- m_collisionOverride = TileCollisionOverrideNames.maybeLeft(collisionOverride.toString()).value(TileCollisionOverride::None);
+ updateProperties();
}
}
@@ -268,6 +269,22 @@ List<Drawable> const& MaterialItem::generatedPreview(Vec2I position) const {
return *m_generatedPreviewCache;
}
+void MaterialItem::updateProperties() {
+ if (auto player = as<Player>(owner())) {
+ auto blockRadius = player->getSecretProperty(BlockRadiusPropertyKey);
+ if (blockRadius.isType(Json::Type::Float))
+ m_blockRadius = blockRadius.toFloat();
+
+ auto altBlockRadius = player->getSecretProperty(AltBlockRadiusPropertyKey);
+ if (altBlockRadius.isType(Json::Type::Float))
+ m_altBlockRadius = altBlockRadius.toFloat();
+
+ auto collisionOverride = player->getSecretProperty(CollisionOverridePropertyKey);
+ if (collisionOverride.isType(Json::Type::String))
+ m_collisionOverride = TileCollisionOverrideNames.maybeLeft(collisionOverride.toString()).value(TileCollisionOverride::None);
+ }
+}
+
float MaterialItem::calcRadius(bool shifting) const {
if (!multiplaceEnabled())
return 1;
diff --git a/source/game/items/StarMaterialItem.hpp b/source/game/items/StarMaterialItem.hpp
index 363d248..9d397eb 100644
--- a/source/game/items/StarMaterialItem.hpp
+++ b/source/game/items/StarMaterialItem.hpp
@@ -47,6 +47,7 @@ public:
List<PreviewTile> previewTiles(bool shifting) const override;
List<Drawable> const& generatedPreview(Vec2I position = {}) const;
private:
+ void updateProperties();
float calcRadius(bool shifting) const;
List<Vec2I>& tileArea(float radius, Vec2F const& position) const;
MaterialHue placementHueShift(Vec2I const& position) const;