Item drops inherit player velocity, other stuff
This commit is contained in:
parent
ab03c224dd
commit
b51e174bdc
@ -10,5 +10,7 @@
|
|||||||
"minWireJitter" : 0.0,
|
"minWireJitter" : 0.0,
|
||||||
"minWireTrans" : 0.1,
|
"minWireTrans" : 0.1,
|
||||||
"maxWireTrans" : 0.4
|
"maxWireTrans" : 0.4
|
||||||
}
|
},
|
||||||
|
|
||||||
|
"swapDance" : null // Set this to a valid dance to trigger on character swap.
|
||||||
}
|
}
|
@ -425,6 +425,15 @@ Maybe<String> Humanoid::dance() const {
|
|||||||
return m_dance;
|
return m_dance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Humanoid::danceCyclicOrEnded() const {
|
||||||
|
if (!m_dance)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto danceDatabase = Root::singleton().danceDatabase();
|
||||||
|
auto dance = danceDatabase->getDance(*m_dance);
|
||||||
|
return dance->cyclic || m_danceTimer > dance->duration;
|
||||||
|
}
|
||||||
|
|
||||||
Direction Humanoid::facingDirection() const {
|
Direction Humanoid::facingDirection() const {
|
||||||
return m_facingDirection;
|
return m_facingDirection;
|
||||||
}
|
}
|
||||||
|
@ -169,6 +169,7 @@ public:
|
|||||||
State state() const;
|
State state() const;
|
||||||
HumanoidEmote emoteState() const;
|
HumanoidEmote emoteState() const;
|
||||||
Maybe<String> dance() const;
|
Maybe<String> dance() const;
|
||||||
|
bool danceCyclicOrEnded() const;
|
||||||
Direction facingDirection() const;
|
Direction facingDirection() const;
|
||||||
bool movingBackwards() const;
|
bool movingBackwards() const;
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ ItemDropPtr ItemDrop::createRandomizedDrop(ItemDescriptor const& descriptor, Vec
|
|||||||
return itemDrop;
|
return itemDrop;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemDropPtr ItemDrop::throwDrop(ItemPtr const& item, Vec2F const& position, Vec2F const& direction, bool eternal) {
|
ItemDropPtr ItemDrop::throwDrop(ItemPtr const& item, Vec2F const& position, Vec2F const& velocity, Vec2F const& direction, bool eternal) {
|
||||||
if (!item)
|
if (!item)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ ItemDropPtr ItemDrop::throwDrop(ItemPtr const& item, Vec2F const& position, Vec2
|
|||||||
ItemDropPtr itemDrop = make_shared<ItemDrop>(item);
|
ItemDropPtr itemDrop = make_shared<ItemDrop>(item);
|
||||||
itemDrop->setPosition(position);
|
itemDrop->setPosition(position);
|
||||||
if (direction != Vec2F())
|
if (direction != Vec2F())
|
||||||
itemDrop->setVelocity(vnorm(direction) * idconfig.getFloat("throwSpeed"));
|
itemDrop->setVelocity(velocity + vnorm(direction) * idconfig.getFloat("throwSpeed"));
|
||||||
|
|
||||||
itemDrop->setEternal(eternal);
|
itemDrop->setEternal(eternal);
|
||||||
itemDrop->setIntangibleTime(idconfig.getFloat("throwIntangibleTime"));
|
itemDrop->setIntangibleTime(idconfig.getFloat("throwIntangibleTime"));
|
||||||
@ -55,12 +55,12 @@ ItemDropPtr ItemDrop::throwDrop(ItemPtr const& item, Vec2F const& position, Vec2
|
|||||||
return itemDrop;
|
return itemDrop;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemDropPtr ItemDrop::throwDrop(ItemDescriptor const& itemDescriptor, Vec2F const& position, Vec2F const& direction, bool eternal) {
|
ItemDropPtr ItemDrop::throwDrop(ItemDescriptor const& itemDescriptor, Vec2F const& position, Vec2F const& velocity, Vec2F const& direction, bool eternal) {
|
||||||
if (!itemDescriptor || itemDescriptor.isEmpty())
|
if (!itemDescriptor || itemDescriptor.isEmpty())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
auto itemDatabase = Root::singleton().itemDatabase();
|
auto itemDatabase = Root::singleton().itemDatabase();
|
||||||
auto itemDrop = throwDrop(itemDatabase->item(itemDescriptor), position, direction);
|
auto itemDrop = throwDrop(itemDatabase->item(itemDescriptor), position, velocity, direction);
|
||||||
itemDrop->setEternal(eternal);
|
itemDrop->setEternal(eternal);
|
||||||
|
|
||||||
return itemDrop;
|
return itemDrop;
|
||||||
|
@ -23,8 +23,8 @@ public:
|
|||||||
// Create a drop and throw in the given direction with a hard-coded initial
|
// Create a drop and throw in the given direction with a hard-coded initial
|
||||||
// throw velocity (unrelated to magnitude of direction, direction is
|
// throw velocity (unrelated to magnitude of direction, direction is
|
||||||
// normalized first). Initially intangible for 1 second.
|
// normalized first). Initially intangible for 1 second.
|
||||||
static ItemDropPtr throwDrop(ItemPtr const& item, Vec2F const& position, Vec2F const& direction, bool eternal = false);
|
static ItemDropPtr throwDrop(ItemPtr const& item, Vec2F const& position, Vec2F const& velocity, Vec2F const& direction, bool eternal = false);
|
||||||
static ItemDropPtr throwDrop(ItemDescriptor const& itemDescriptor, Vec2F const& position, Vec2F const& direction, bool eternal = false);
|
static ItemDropPtr throwDrop(ItemDescriptor const& itemDescriptor, Vec2F const& position, Vec2F const& velocity, Vec2F const& direction, bool eternal = false);
|
||||||
|
|
||||||
ItemDrop(ItemPtr item);
|
ItemDrop(ItemPtr item);
|
||||||
ItemDrop(Json const& diskStore);
|
ItemDrop(Json const& diskStore);
|
||||||
|
@ -717,10 +717,11 @@ void Player::dropItem() {
|
|||||||
if (!canUseTool())
|
if (!canUseTool())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (auto throwSlot : {m_inventory->primaryHeldSlot(), m_inventory->secondaryHeldSlot()}) {
|
Vec2F throwDirection = world()->geometry().diff(aimPosition(), position());
|
||||||
|
for (auto& throwSlot : {m_inventory->primaryHeldSlot(), m_inventory->secondaryHeldSlot()}) {
|
||||||
if (throwSlot) {
|
if (throwSlot) {
|
||||||
if (auto drop = m_inventory->takeSlot(*throwSlot)) {
|
if (auto drop = m_inventory->takeSlot(*throwSlot)) {
|
||||||
world()->addEntity(ItemDrop::throwDrop(drop, position(), world()->geometry().diff(aimPosition(), position())));
|
world()->addEntity(ItemDrop::throwDrop(drop, position(), velocity(), throwDirection));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -979,17 +980,20 @@ void Player::update(float dt, uint64_t) {
|
|||||||
m_humanoid->setMovingBackwards(false);
|
m_humanoid->setMovingBackwards(false);
|
||||||
m_humanoid->setRotation(m_movementController->rotation());
|
m_humanoid->setRotation(m_movementController->rotation());
|
||||||
|
|
||||||
|
bool suppressedItems = !canUseTool();
|
||||||
|
|
||||||
auto loungeAnchor = as<LoungeAnchor>(m_movementController->entityAnchor());
|
auto loungeAnchor = as<LoungeAnchor>(m_movementController->entityAnchor());
|
||||||
if (loungeAnchor && loungeAnchor->dance)
|
if (loungeAnchor && loungeAnchor->dance)
|
||||||
m_humanoid->setDance(*loungeAnchor->dance);
|
m_humanoid->setDance(*loungeAnchor->dance);
|
||||||
else
|
else if ((!suppressedItems && (m_tools->primaryHandItem() || m_tools->altHandItem()))
|
||||||
|
|| m_humanoid->danceCyclicOrEnded() || m_movementController->running())
|
||||||
m_humanoid->setDance({});
|
m_humanoid->setDance({});
|
||||||
|
|
||||||
bool isClient = world()->isClient();
|
bool isClient = world()->isClient();
|
||||||
if (isClient)
|
if (isClient)
|
||||||
m_armor->setupHumanoidClothingDrawables(*m_humanoid, forceNude());
|
m_armor->setupHumanoidClothingDrawables(*m_humanoid, forceNude());
|
||||||
|
|
||||||
m_tools->suppressItems(!canUseTool());
|
m_tools->suppressItems(suppressedItems);
|
||||||
m_tools->tick(dt, m_shifting, m_pendingMoves);
|
m_tools->tick(dt, m_shifting, m_pendingMoves);
|
||||||
|
|
||||||
if (auto overrideFacingDirection = m_tools->setupHumanoidHandItems(*m_humanoid, position(), aimPosition()))
|
if (auto overrideFacingDirection = m_tools->setupHumanoidHandItems(*m_humanoid, position(), aimPosition()))
|
||||||
@ -2348,7 +2352,7 @@ void Player::dropSelectedItems(function<bool(ItemPtr)> filter) {
|
|||||||
|
|
||||||
m_inventory->forEveryItem([&](InventorySlot const&, ItemPtr& item) {
|
m_inventory->forEveryItem([&](InventorySlot const&, ItemPtr& item) {
|
||||||
if (item && (!filter || filter(item)))
|
if (item && (!filter || filter(item)))
|
||||||
world()->addEntity(ItemDrop::throwDrop(take(item), position(), Vec2F::withAngle(Random::randf(-Constants::pi, Constants::pi)), true));
|
world()->addEntity(ItemDrop::throwDrop(take(item), position(), velocity(), Vec2F::withAngle(Random::randf(-Constants::pi, Constants::pi)), true));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -551,9 +551,15 @@ bool UniverseClient::reloadPlayer(Json const& data, Uuid const& uuid, bool reset
|
|||||||
bool UniverseClient::switchPlayer(Uuid const& uuid) {
|
bool UniverseClient::switchPlayer(Uuid const& uuid) {
|
||||||
if (uuid == mainPlayer()->uuid())
|
if (uuid == mainPlayer()->uuid())
|
||||||
return false;
|
return false;
|
||||||
else if (auto data = m_playerStorage->maybeGetPlayerData(uuid))
|
else if (auto data = m_playerStorage->maybeGetPlayerData(uuid)) {
|
||||||
return reloadPlayer(*data, uuid, true, true);
|
if (reloadPlayer(*data, uuid, true, true)) {
|
||||||
else
|
auto dance = Root::singleton().assets()->json("/player.config:swapDance");
|
||||||
|
if (dance.isType(Json::Type::String))
|
||||||
|
m_mainPlayer->humanoid()->setDance(dance.toString());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user