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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-29 05:58:24 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-29 05:58:24 +1000
commitfb0ab850891ad345d75c32fd9c161ed1bf9a18ee (patch)
tree4b5c7eb91a6674b4102cd63f80d1f7b1e9293d8b
parent8a2de03b0fa88fa378e1aeee683497745e6e3417 (diff)
Lua: player.* identity getters and setters
-rw-r--r--source/core/StarDirectives.cpp5
-rw-r--r--source/core/StarLua.hpp11
-rw-r--r--source/frontend/StarCharCreation.cpp3
-rw-r--r--source/game/StarHumanoid.cpp26
-rw-r--r--source/game/StarHumanoid.hpp13
-rw-r--r--source/game/StarNpcDatabase.cpp2
-rw-r--r--source/game/StarPlayer.cpp93
-rw-r--r--source/game/StarPlayer.hpp22
-rw-r--r--source/game/StarSpeciesDatabase.cpp2
-rw-r--r--source/game/scripting/StarPlayerLuaBindings.cpp91
10 files changed, 216 insertions, 52 deletions
diff --git a/source/core/StarDirectives.cpp b/source/core/StarDirectives.cpp
index bf3dcc1..3381f1f 100644
--- a/source/core/StarDirectives.cpp
+++ b/source/core/StarDirectives.cpp
@@ -162,10 +162,7 @@ bool Directives::empty() const {
return !shared || shared->empty();
}
-Directives::operator bool() const {
- return !empty();
-}
-
+Directives::operator bool() const { return !empty(); }
DataStream& operator>>(DataStream& ds, Directives& directives) {
String string;
diff --git a/source/core/StarLua.hpp b/source/core/StarLua.hpp
index 9241ec4..2c108ef 100644
--- a/source/core/StarLua.hpp
+++ b/source/core/StarLua.hpp
@@ -9,6 +9,7 @@
#include "StarString.hpp"
#include "StarJson.hpp"
#include "StarRefPtr.hpp"
+#include "StarDirectives.hpp"
namespace Star {
@@ -826,6 +827,16 @@ struct LuaConverter<char[s]> {
};
template <>
+struct LuaConverter<Directives> {
+ static LuaValue from(LuaEngine& engine, Directives const& v) {
+ if (String const* ptr = v.stringPtr())
+ return engine.createString(*ptr);
+ else
+ return engine.createString("");
+ }
+};
+
+template <>
struct LuaConverter<LuaString> {
static LuaValue from(LuaEngine&, LuaString v) {
return LuaValue(move(v));
diff --git a/source/frontend/StarCharCreation.cpp b/source/frontend/StarCharCreation.cpp
index c1e0f1d..7d05712 100644
--- a/source/frontend/StarCharCreation.cpp
+++ b/source/frontend/StarCharCreation.cpp
@@ -354,7 +354,8 @@ void CharCreationPane::changed() {
m_previewPlayer->setGender(GenderNames.getLeft(gender.name));
- m_previewPlayer->setHairType(gender.hairGroup, hair);
+ m_previewPlayer->setHairGroup(gender.hairGroup);
+ m_previewPlayer->setHairType(hair);
m_previewPlayer->setHairDirectives(hairColor);
m_previewPlayer->setEmoteDirectives(bodyColor + altColor);
diff --git a/source/game/StarHumanoid.cpp b/source/game/StarHumanoid.cpp
index d296842..e814ade 100644
--- a/source/game/StarHumanoid.cpp
+++ b/source/game/StarHumanoid.cpp
@@ -27,10 +27,34 @@ extern EnumMap<HumanoidEmote> const HumanoidEmoteNames{
{HumanoidEmote::Sleep, "Sleep"}
};
-Personality parsePersonality(Json const& config) {
+Personality parsePersonalityArray(Json const& config) {
return Personality{config.getString(0), config.getString(1), jsonToVec2F(config.get(2)), jsonToVec2F(config.get(3))};
}
+Personality& parsePersonality(Personality& personality, Json const& config) {
+ if (auto idle = config.get("idle"))
+ personality.idle = idle.toString();
+ if (auto armIdle = config.get("armIdle"))
+ personality.idle = armIdle.toString();
+ if (auto headOffset = config.get("headOffset"))
+ personality.headOffset = jsonToVec2F(headOffset);
+ if (auto armOffset = config.get("armOffset"))
+ personality.armOffset = jsonToVec2F(armOffset);
+}
+
+Personality parsePersonality(Json const& config) {
+ return parsePersonality(Personality(), config);
+}
+
+Json jsonFromPersonality(Personality const& personality) {
+ return JsonObject{
+ { "idle", personality.idle },
+ { "armIdle", personality.armIdle },
+ { "headOffset", jsonFromVec2F(personality.headOffset) },
+ { "armOffset", jsonFromVec2F(personality.armOffset) }
+ };
+}
+
HumanoidIdentity::HumanoidIdentity(Json config) {
if (config.isNull())
config = JsonObject();
diff --git a/source/game/StarHumanoid.hpp b/source/game/StarHumanoid.hpp
index 17cdbda..8d3fe5b 100644
--- a/source/game/StarHumanoid.hpp
+++ b/source/game/StarHumanoid.hpp
@@ -38,14 +38,19 @@ extern EnumMap<HumanoidEmote> const HumanoidEmoteNames;
size_t const EmoteSize = 14;
struct Personality {
- String idle;
- String armIdle;
- Vec2F headOffset;
- Vec2F armOffset;
+ String idle = "idle.1";
+ String armIdle = "idle.1";
+ Vec2F headOffset = Vec2F();
+ Vec2F armOffset = Vec2F();
};
+Personality parsePersonalityArray(Json const& config);
+
+Personality& parsePersonality(Personality& personality, Json const& config);
Personality parsePersonality(Json const& config);
+Json jsonFromPersonality(Personality const& personality);
+
struct HumanoidIdentity {
explicit HumanoidIdentity(Json config = Json());
diff --git a/source/game/StarNpcDatabase.cpp b/source/game/StarNpcDatabase.cpp
index 8f2e820..f7b14de 100644
--- a/source/game/StarNpcDatabase.cpp
+++ b/source/game/StarNpcDatabase.cpp
@@ -75,7 +75,7 @@ NpcVariant NpcDatabase::generateNpcVariant(
jsonToStringList(config.get("nameGen"))[(int)identity.gender], randSource);
}
- identity.personality = parsePersonality(randSource.randFrom(variant.humanoidConfig.getArray("personalities")));
+ identity.personality = parsePersonalityArray(randSource.randFrom(variant.humanoidConfig.getArray("personalities")));
if (config.contains("identity"))
identity = HumanoidIdentity(jsonMerge(identity.toJson(), config.get("identity")));
diff --git a/source/game/StarPlayer.cpp b/source/game/StarPlayer.cpp
index 872443f..93c05ae 100644
--- a/source/game/StarPlayer.cpp
+++ b/source/game/StarPlayer.cpp
@@ -1843,8 +1843,7 @@ bool Player::isAdmin() const {
void Player::setFavoriteColor(Vec4B color) {
m_identity.color = color;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ updateIdentity();
}
Vec4B Player::favoriteColor() const {
@@ -1951,8 +1950,7 @@ String Player::name() const {
void Player::setName(String const& name) {
m_identity.name = name;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ updateIdentity();
}
Maybe<String> Player::statusText() const {
@@ -1972,51 +1970,66 @@ Vec2F Player::nametagOrigin() const {
return mouthPosition(false);
}
-void Player::setBodyDirectives(String const& directives) {
- m_identity.bodyDirectives = directives;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
-}
+void Player::updateIdentity()
+{ m_identityUpdated = true; m_humanoid->setIdentity(m_identity); }
+
+void Player::setBodyDirectives(String const& directives)
+{ m_identity.bodyDirectives = directives; updateIdentity(); }
+
+void Player::setEmoteDirectives(String const& directives)
+{ m_identity.emoteDirectives = directives; updateIdentity(); }
+
+void Player::setHairGroup(String const& group)
+{ m_identity.hairGroup = group; updateIdentity(); }
+
+void Player::setHairType(String const& type)
+{ m_identity.hairType = type; updateIdentity(); }
+
+void Player::setHairDirectives(String const& directives)
+{ m_identity.hairDirectives = directives; updateIdentity(); }
-void Player::setHairType(String const& group, String const& type) {
+void Player::setFacialHairGroup(String const& group)
+{ m_identity.facialHairGroup = group; updateIdentity(); }
+
+void Player::setFacialHairType(String const& type)
+{ m_identity.facialHairType = type; updateIdentity(); }
+
+void Player::setFacialHairDirectives(String const& directives)
+{ m_identity.facialHairDirectives = directives; updateIdentity(); }
+
+void Player::setFacialMaskGroup(String const& group)
+{ m_identity.facialMaskGroup = group; updateIdentity(); }
+
+void Player::setFacialMaskType(String const& type)
+{ m_identity.facialMaskType = type; updateIdentity(); }
+
+void Player::setFacialMaskDirectives(String const& directives)
+{ m_identity.facialMaskDirectives = directives; updateIdentity(); }
+
+void Player::setHair(String const& group, String const& type, String const& directives) {
m_identity.hairGroup = group;
m_identity.hairType = type;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ m_identity.hairDirectives = directives;
+ updateIdentity();
}
void Player::setFacialHair(String const& group, String const& type, String const& directives) {
m_identity.facialHairGroup = group;
m_identity.facialHairType = type;
m_identity.facialHairDirectives = directives;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ updateIdentity();
}
void Player::setFacialMask(String const& group, String const& type, String const& directives) {
m_identity.facialMaskGroup = group;
m_identity.facialMaskType = type;
m_identity.facialMaskDirectives = directives;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
-}
-
-void Player::setHairDirectives(String const& directives) {
- m_identity.hairDirectives = directives;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
-}
-
-void Player::setEmoteDirectives(String const& directives) {
- m_identity.emoteDirectives = directives;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ updateIdentity();
}
void Player::setSpecies(String const& species) {
m_identity.species = species;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ updateIdentity();
}
Gender Player::gender() const {
@@ -2025,8 +2038,7 @@ Gender Player::gender() const {
void Player::setGender(Gender const& gender) {
m_identity.gender = gender;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ updateIdentity();
}
String Player::species() const {
@@ -2035,14 +2047,27 @@ String Player::species() const {
void Player::setPersonality(Personality const& personality) {
m_identity.personality = personality;
- m_identityUpdated = true;
- m_humanoid->setIdentity(m_identity);
+ updateIdentity();
+}
+
+void Player::setImagePath(Maybe<String> const& imagePath) {
+ m_identity.imagePath = imagePath;
+ updateIdentity();
}
HumanoidPtr Player::humanoid() {
return m_humanoid;
}
+HumanoidIdentity const& Player::identity() const {
+ return m_identity;
+}
+
+void Player::setIdentity(HumanoidIdentity identity) {
+ m_identity = move(identity);
+ updateIdentity();
+}
+
List<String> Player::pullQueuedMessages() {
return take(m_queuedMessages);
}
diff --git a/source/game/StarPlayer.hpp b/source/game/StarPlayer.hpp
index f989a77..88582a2 100644
--- a/source/game/StarPlayer.hpp
+++ b/source/game/StarPlayer.hpp
@@ -288,10 +288,24 @@ public:
Vec3B nametagColor() const override;
Vec2F nametagOrigin() const override;
+ void updateIdentity();
+
void setBodyDirectives(String const& directives);
- void setHairType(String const& group, String const& type);
- void setHairDirectives(String const& directives);
void setEmoteDirectives(String const& directives);
+
+ void setHairGroup(String const& group);
+ void setHairType(String const& type);
+ void setHairDirectives(String const& directives);
+
+ void setFacialHairGroup(String const& group);
+ void setFacialHairType(String const& type);
+ void setFacialHairDirectives(String const& directives);
+
+ void setFacialMaskGroup(String const& group);
+ void setFacialMaskType(String const& type);
+ void setFacialMaskDirectives(String const& directives);
+
+ void setHair (String const& group, String const& type, String const& directives);
void setFacialHair(String const& group, String const& type, String const& directives);
void setFacialMask(String const& group, String const& type, String const& directives);
@@ -300,8 +314,12 @@ public:
Gender gender() const;
void setGender(Gender const& gender);
void setPersonality(Personality const& personality);
+ void setImagePath(Maybe<String> const& imagePath);
HumanoidPtr humanoid();
+ HumanoidIdentity const& identity() const;
+
+ void setIdentity(HumanoidIdentity identity);
void setAdmin(bool isAdmin);
bool isAdmin() const override;
diff --git a/source/game/StarSpeciesDatabase.cpp b/source/game/StarSpeciesDatabase.cpp
index fe0fdef..c3f2ead 100644
--- a/source/game/StarSpeciesDatabase.cpp
+++ b/source/game/StarSpeciesDatabase.cpp
@@ -72,7 +72,7 @@ SpeciesDefinition::SpeciesDefinition(Json const& config) {
auto personalities = humanoidConfig().getArray("personalities");
for (auto personality : personalities) {
- m_personalities.push_back(parsePersonality(personality));
+ m_personalities.push_back(parsePersonalityArray(personality));
}
m_statusEffects = config.getArray("statusEffects", {}).transformed(jsonToPersistentStatusEffect);
diff --git a/source/game/scripting/StarPlayerLuaBindings.cpp b/source/game/scripting/StarPlayerLuaBindings.cpp
index 6cefe39..c6639d5 100644
--- a/source/game/scripting/StarPlayerLuaBindings.cpp
+++ b/source/game/scripting/StarPlayerLuaBindings.cpp
@@ -17,11 +17,94 @@ namespace Star {
LuaCallbacks LuaBindings::makePlayerCallbacks(Player* player) {
LuaCallbacks callbacks;
- callbacks.registerCallback("id", [player]() { return player->entityId(); });
+ callbacks.registerCallback("humanoidIdentity", [player]() { return player->humanoid()->identity().toJson(); });
+ callbacks.registerCallback("setHumanoidIdentity", [player](Json const& id) { player->setIdentity(HumanoidIdentity(id)); });
+
+ callbacks.registerCallback("bodyDirectives", [player]() { return player->identity().bodyDirectives; });
+ callbacks.registerCallback("setBodyDirectives", [player](String const& str) { player->setBodyDirectives(str); });
+
+ callbacks.registerCallback("emoteDirectives", [player]() { return player->identity().emoteDirectives; });
+ callbacks.registerCallback("setEmoteDirectives", [player](String const& str) { player->setEmoteDirectives(str); });
+
+ callbacks.registerCallback("hairGroup", [player]() { return player->identity().hairGroup; });
+ callbacks.registerCallback("setHairGroup", [player](String const& str) { player->setHairGroup(str); });
+ callbacks.registerCallback("hairType", [player]() { return player->identity().hairType; });
+ callbacks.registerCallback("setHairType", [player](String const& str) { player->setHairType(str); });
+ callbacks.registerCallback("hairDirectives", [player]() { return player->identity().hairDirectives; });
+ callbacks.registerCallback("setHairDirectives", [player](String const& str) { player->setHairDirectives(str); });
+
+ callbacks.registerCallback("facialHairGroup", [player]() { return player->identity().facialHairGroup; });
+ callbacks.registerCallback("setFacialHairGroup", [player](String const& str) { player->setFacialHairGroup(str); });
+ callbacks.registerCallback("facialHairType", [player]() { return player->identity().facialHairType; });
+ callbacks.registerCallback("setFacialHairType", [player](String const& str) { player->setFacialHairType(str); });
+ callbacks.registerCallback("facialHairDirectives", [player]() { return player->identity().facialHairDirectives; });
+ callbacks.registerCallback("setFacialHairDirectives", [player](String const& str) { player->setFacialHairDirectives(str); });
+
+ callbacks.registerCallback("hair", [player]() {
+ HumanoidIdentity const& identity = player->identity();
+ return luaTupleReturn(identity.hairGroup, identity.hairType, identity.hairDirectives);
+ });
+
+ callbacks.registerCallback("facialHair", [player]() {
+ HumanoidIdentity const& identity = player->identity();
+ return luaTupleReturn(identity.facialHairGroup, identity.facialHairType, identity.facialHairDirectives);
+ });
+
+ callbacks.registerCallback("facialMask", [player]() {
+ HumanoidIdentity const& identity = player->identity();
+ return luaTupleReturn(identity.facialMaskGroup, identity.facialMaskType, identity.facialMaskDirectives);
+ });
+
+ callbacks.registerCallback("setFacialHair", [player](Maybe<String> const& group, Maybe<String> const& type, Maybe<String> const& directives) {
+ if (group && type && directives)
+ player->setFacialHair(*group, *type, *directives);
+ else {
+ if (group) player->setFacialHairGroup(*group);
+ if (type) player->setFacialHairType(*type);
+ if (directives) player->setFacialHairDirectives(*directives);
+ }
+ });
+
+ callbacks.registerCallback("setFacialMask", [player](Maybe<String> const& group, Maybe<String> const& type, Maybe<String> const& directives) {
+ if (group && type && directives)
+ player->setFacialMask(*group, *type, *directives);
+ else {
+ if (group) player->setFacialMaskGroup(*group);
+ if (type) player->setFacialMaskType(*type);
+ if (directives) player->setFacialMaskDirectives(*directives);
+ }
+ });
+
+ callbacks.registerCallback("setHair", [player](Maybe<String> const& group, Maybe<String> const& type, Maybe<String> const& directives) {
+ if (group && type && directives)
+ player->setHair(*group, *type, *directives);
+ else {
+ if (group) player->setHairGroup(*group);
+ if (type) player->setHairType(*type);
+ if (directives) player->setHairDirectives(*directives);
+ }
+ });
+
+ callbacks.registerCallback("species", [player]() { return player->species(); });
+ callbacks.registerCallback("setSpecies", [player](String const& species) { player->setSpecies(species); });
+
+ callbacks.registerCallback("imagePath", [player]() { return player->identity().imagePath; });
+ callbacks.registerCallback("setImagePath", [player](Maybe<String> const& imagePath) { player->setImagePath(imagePath); });
+
+ callbacks.registerCallback("gender", [player]() { return GenderNames.getRight(player->gender()); });
+ callbacks.registerCallback("setGender", [player](String const& gender) { player->setGender(GenderNames.getLeft(gender)); });
+
+ callbacks.registerCallback("personality", [player]() { return jsonFromPersonality(player->identity().personality); });
+ callbacks.registerCallback("setPersonality", [player](Json const& personalityConfig) {
+ Personality const& oldPersonality = player->identity().personality;
+ player->setPersonality(parsePersonality(Personality(oldPersonality), personalityConfig));
+ });
+
+ void setPersonality(Personality const& personality);
+
+ callbacks.registerCallback("id", [player]() { return player->entityId(); });
callbacks.registerCallback("uniqueId", [player]() { return player->uniqueId(); });
- callbacks.registerCallback("species", [player]() { return player->species(); });
- callbacks.registerCallback("gender", [player]() { return GenderNames.getRight(player->gender()); });
- callbacks.registerCallback("isAdmin", [player]() { return player->isAdmin(); });
+ callbacks.registerCallback("isAdmin", [player]() { return player->isAdmin(); });
callbacks.registerCallback("interact", [player](String const& type, Json const& configData, Maybe<EntityId> const& sourceEntityId) {
player->interact(InteractAction(type, sourceEntityId.value(NullEntityId), configData));