Various improvements
You can now right click empty slots to insert one from swap. Added unique sounds for the swap slot count incrementing/decrementing. Material placement now plays sounds.
This commit is contained in:
parent
cd36a269fd
commit
f6f91b18e8
@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"paneLayout" : {
|
"paneLayout" : { "portrait" : { "renderHumanoid" : true } },
|
||||||
"portrait" : {
|
|
||||||
"renderHumanoid" : true
|
"sounds" : {
|
||||||
}
|
"someup" : [ "/sfx/interface/inventory_someup.ogg" ],
|
||||||
|
"somedown" : [ "/sfx/interface/inventory_somedown.ogg" ]
|
||||||
}
|
}
|
||||||
}
|
}
|
BIN
assets/opensb/sfx/interface/inventory_somedown.ogg
Normal file
BIN
assets/opensb/sfx/interface/inventory_somedown.ogg
Normal file
Binary file not shown.
BIN
assets/opensb/sfx/interface/inventory_someup.ogg
Normal file
BIN
assets/opensb/sfx/interface/inventory_someup.ogg
Normal file
Binary file not shown.
@ -35,27 +35,29 @@ InventoryPane::InventoryPane(MainInterface* parent, PlayerPtr player, ContainerI
|
|||||||
auto itemGrid = convert<ItemGridWidget>(widget);
|
auto itemGrid = convert<ItemGridWidget>(widget);
|
||||||
InventorySlot inventorySlot = BagSlot(bagType, itemGrid->selectedIndex());
|
InventorySlot inventorySlot = BagSlot(bagType, itemGrid->selectedIndex());
|
||||||
|
|
||||||
|
auto inventory = m_player->inventory();
|
||||||
if (context()->shiftHeld()) {
|
if (context()->shiftHeld()) {
|
||||||
if (auto sourceItem = itemGrid->selectedItem()) {
|
if (auto sourceItem = itemGrid->selectedItem()) {
|
||||||
if (auto activeMerchantPane = m_parent->activeMerchantPane()) {
|
if (auto activeMerchantPane = m_parent->activeMerchantPane()) {
|
||||||
auto remainder = activeMerchantPane->addItems(m_player->inventory()->takeSlot(inventorySlot));
|
auto remainder = activeMerchantPane->addItems(inventory->takeSlot(inventorySlot));
|
||||||
if (remainder && !remainder->empty())
|
if (remainder && !remainder->empty())
|
||||||
m_player->inventory()->setItem(inventorySlot, remainder);
|
inventory->setItem(inventorySlot, remainder);
|
||||||
} else if (m_containerInteractor->containerOpen()) {
|
} else if (m_containerInteractor->containerOpen()) {
|
||||||
m_player->inventory()->takeSlot(inventorySlot);
|
inventory->takeSlot(inventorySlot);
|
||||||
m_containerInteractor->addToContainer(sourceItem);
|
m_containerInteractor->addToContainer(sourceItem);
|
||||||
m_containerSource = inventorySlot;
|
m_containerSource = inventorySlot;
|
||||||
m_expectingSwap = true;
|
m_expectingSwap = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_player->inventory()->shiftSwap(inventorySlot);
|
inventory->shiftSwap(inventorySlot);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto rightClickCallback = [this](InventorySlot slot) {
|
auto rightClickCallback = [this](InventorySlot slot) {
|
||||||
if (ItemPtr slotItem = m_player->inventory()->itemsAt(slot)) {
|
auto inventory = m_player->inventory();
|
||||||
auto swapItem = m_player->inventory()->swapSlotItem();
|
if (ItemPtr slotItem = inventory->itemsAt(slot)) {
|
||||||
|
auto swapItem = inventory->swapSlotItem();
|
||||||
if (!swapItem || swapItem->empty() || swapItem->couldStack(slotItem)) {
|
if (!swapItem || swapItem->empty() || swapItem->couldStack(slotItem)) {
|
||||||
uint64_t count = swapItem ? swapItem->couldStack(slotItem) : slotItem->maxStack();
|
uint64_t count = swapItem ? swapItem->couldStack(slotItem) : slotItem->maxStack();
|
||||||
if (context()->shiftHeld())
|
if (context()->shiftHeld())
|
||||||
@ -67,14 +69,27 @@ InventoryPane::InventoryPane(MainInterface* parent, PlayerPtr player, ContainerI
|
|||||||
if (swapItem)
|
if (swapItem)
|
||||||
swapItem->stackWith(taken);
|
swapItem->stackWith(taken);
|
||||||
else
|
else
|
||||||
m_player->inventory()->setSwapSlotItem(taken);
|
inventory->setSwapSlotItem(taken);
|
||||||
}
|
}
|
||||||
} else if (auto augment = as<AugmentItem>(swapItem)) {
|
} else if (auto augment = as<AugmentItem>(swapItem)) {
|
||||||
if (auto augmented = augment->applyTo(slotItem))
|
if (auto augmented = augment->applyTo(slotItem))
|
||||||
m_player->inventory()->setItem(slot, augmented);
|
inventory->setItem(slot, augmented);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
auto swapSlot = inventory->swapSlotItem();
|
||||||
|
if (auto es = slot.ptr<EquipmentSlot>()) {
|
||||||
|
if (inventory->itemAllowedAsEquipment(swapSlot, *es))
|
||||||
|
inventory->setItem(slot, swapSlot->take(1));
|
||||||
|
} else if (slot.is<TrashSlot>()) {
|
||||||
|
inventory->setItem(slot, swapSlot->take(1));
|
||||||
|
} else if (auto bs = slot.ptr<BagSlot>()) {
|
||||||
|
if (inventory->itemAllowedInBag(swapSlot, bs->first))
|
||||||
|
inventory->setItem(slot, swapSlot->take(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto bagGridCallback = [rightClickCallback](String const& bagType, Widget* widget) {
|
auto bagGridCallback = [rightClickCallback](String const& bagType, Widget* widget) {
|
||||||
auto slot = BagSlot(bagType, convert<ItemGridWidget>(widget)->selectedIndex());
|
auto slot = BagSlot(bagType, convert<ItemGridWidget>(widget)->selectedIndex());
|
||||||
rightClickCallback(slot);
|
rightClickCallback(slot);
|
||||||
@ -163,6 +178,8 @@ InventoryPane::InventoryPane(MainInterface* parent, PlayerPtr player, ContainerI
|
|||||||
m_currentSwapSlotItem = item->descriptor();
|
m_currentSwapSlotItem = item->descriptor();
|
||||||
m_pickUpSounds = jsonToStringList(config.get("sounds").get("pickup"));
|
m_pickUpSounds = jsonToStringList(config.get("sounds").get("pickup"));
|
||||||
m_putDownSounds = jsonToStringList(config.get("sounds").get("putdown"));
|
m_putDownSounds = jsonToStringList(config.get("sounds").get("putdown"));
|
||||||
|
m_someUpSounds = jsonToStringList(config.get("sounds").get("someup"));
|
||||||
|
m_someDownSounds = jsonToStringList(config.get("sounds").get("somedown"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void InventoryPane::displayed() {
|
void InventoryPane::displayed() {
|
||||||
@ -406,10 +423,12 @@ void InventoryPane::update(float dt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (auto item = inventory->swapSlotItem()) {
|
if (auto item = inventory->swapSlotItem()) {
|
||||||
if (!m_currentSwapSlotItem || !item->matches(*m_currentSwapSlotItem, true) || item->count() > m_currentSwapSlotItem->count())
|
if (!m_currentSwapSlotItem || !item->matches(*m_currentSwapSlotItem, true))
|
||||||
context->playAudio(RandomSource().randFrom(m_pickUpSounds));
|
context->playAudio(RandomSource().randFrom(m_pickUpSounds));
|
||||||
|
else if (item->count() > m_currentSwapSlotItem->count())
|
||||||
|
context->playAudio(RandomSource().randFrom(m_someUpSounds));
|
||||||
else if (item->count() < m_currentSwapSlotItem->count())
|
else if (item->count() < m_currentSwapSlotItem->count())
|
||||||
context->playAudio(RandomSource().randFrom(m_putDownSounds));
|
context->playAudio(RandomSource().randFrom(m_someDownSounds));
|
||||||
|
|
||||||
m_currentSwapSlotItem = item->descriptor();
|
m_currentSwapSlotItem = item->descriptor();
|
||||||
} else {
|
} else {
|
||||||
|
@ -58,6 +58,8 @@ private:
|
|||||||
|
|
||||||
StringList m_pickUpSounds;
|
StringList m_pickUpSounds;
|
||||||
StringList m_putDownSounds;
|
StringList m_putDownSounds;
|
||||||
|
StringList m_someUpSounds;
|
||||||
|
StringList m_someDownSounds;
|
||||||
Maybe<ItemDescriptor> m_currentSwapSlotItem;
|
Maybe<ItemDescriptor> m_currentSwapSlotItem;
|
||||||
|
|
||||||
List<ImageWidgetPtr> m_disabledTechOverlays;
|
List<ImageWidgetPtr> m_disabledTechOverlays;
|
||||||
|
@ -1024,7 +1024,7 @@ float Npc::beamGunRadius() const {
|
|||||||
|
|
||||||
void Npc::addParticles(List<Particle> const&) {}
|
void Npc::addParticles(List<Particle> const&) {}
|
||||||
|
|
||||||
void Npc::addSound(String const&, float) {}
|
void Npc::addSound(String const&, float, float) {}
|
||||||
|
|
||||||
bool Npc::inToolRange() const {
|
bool Npc::inToolRange() const {
|
||||||
return true;
|
return true;
|
||||||
|
@ -147,7 +147,7 @@ public:
|
|||||||
Vec4B favoriteColor() const override;
|
Vec4B favoriteColor() const override;
|
||||||
float beamGunRadius() const override;
|
float beamGunRadius() const override;
|
||||||
void addParticles(List<Particle> const& particles) override;
|
void addParticles(List<Particle> const& particles) override;
|
||||||
void addSound(String const& sound, float volume = 1.0f) override;
|
void addSound(String const& sound, float volume = 1.0f, float pitch = 1.0f) override;
|
||||||
bool inToolRange() const override;
|
bool inToolRange() const override;
|
||||||
bool inToolRange(Vec2F const& position) const override;
|
bool inToolRange(Vec2F const& position) const override;
|
||||||
void addEphemeralStatusEffects(List<EphemeralStatusEffect> const& statusEffects) override;
|
void addEphemeralStatusEffects(List<EphemeralStatusEffect> const& statusEffects) override;
|
||||||
|
@ -412,8 +412,8 @@ void Player::addParticles(List<Particle> const& particles) {
|
|||||||
m_callbackParticles.appendAll(particles);
|
m_callbackParticles.appendAll(particles);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::addSound(String const& sound, float volume) {
|
void Player::addSound(String const& sound, float volume, float pitch) {
|
||||||
m_callbackSounds.append({sound, volume});
|
m_callbackSounds.emplaceAppend(sound, volume, pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::addEphemeralStatusEffects(List<EphemeralStatusEffect> const& statusEffects) {
|
void Player::addEphemeralStatusEffects(List<EphemeralStatusEffect> const& statusEffects) {
|
||||||
@ -1100,8 +1100,9 @@ void Player::render(RenderCallback* renderCallback) {
|
|||||||
renderCallback->addAudios(m_statusController->pullNewAudios());
|
renderCallback->addAudios(m_statusController->pullNewAudios());
|
||||||
|
|
||||||
for (auto const& p : take(m_callbackSounds)) {
|
for (auto const& p : take(m_callbackSounds)) {
|
||||||
auto audio = make_shared<AudioInstance>(*Root::singleton().assets()->audio(p.first));
|
auto audio = make_shared<AudioInstance>(*Root::singleton().assets()->audio(get<0>(p)));
|
||||||
audio->setVolume(p.second);
|
audio->setVolume(get<1>(p));
|
||||||
|
audio->setPitchMultiplier(get<2>(p));
|
||||||
audio->setPosition(position());
|
audio->setPosition(position());
|
||||||
renderCallback->addAudio(move(audio));
|
renderCallback->addAudio(move(audio));
|
||||||
}
|
}
|
||||||
|
@ -342,7 +342,7 @@ public:
|
|||||||
bool inInteractionRange(Vec2F aimPos) const;
|
bool inInteractionRange(Vec2F aimPos) const;
|
||||||
|
|
||||||
void addParticles(List<Particle> const& particles) override;
|
void addParticles(List<Particle> const& particles) override;
|
||||||
void addSound(String const& sound, float volume = 1.0f) override;
|
void addSound(String const& sound, float volume = 1.0f, float pitch = 1.0f) override;
|
||||||
|
|
||||||
bool wireToolInUse() const;
|
bool wireToolInUse() const;
|
||||||
void setWireConnector(WireConnector* wireConnector) const;
|
void setWireConnector(WireConnector* wireConnector) const;
|
||||||
@ -611,7 +611,7 @@ private:
|
|||||||
List<RpcPromise<InteractAction>> m_pendingInteractActions;
|
List<RpcPromise<InteractAction>> m_pendingInteractActions;
|
||||||
|
|
||||||
List<Particle> m_callbackParticles;
|
List<Particle> m_callbackParticles;
|
||||||
List<pair<String, float>> m_callbackSounds;
|
List<tuple<String, float, float>> m_callbackSounds;
|
||||||
|
|
||||||
List<String> m_queuedMessages;
|
List<String> m_queuedMessages;
|
||||||
List<ItemPtr> m_queuedItemPickups;
|
List<ItemPtr> m_queuedItemPickups;
|
||||||
|
@ -1126,6 +1126,7 @@ void WorldClient::update(float dt) {
|
|||||||
if (itemDrop->canTake() && !m_requestedDrops.contains(itemDrop->entityId()) && distSquared < square(DropDist)) {
|
if (itemDrop->canTake() && !m_requestedDrops.contains(itemDrop->entityId()) && distSquared < square(DropDist)) {
|
||||||
m_requestedDrops.add(itemDrop->entityId());
|
m_requestedDrops.add(itemDrop->entityId());
|
||||||
if (m_mainPlayer->itemsCanHold(itemDrop->item()) != 0) {
|
if (m_mainPlayer->itemsCanHold(itemDrop->item()) != 0) {
|
||||||
|
m_startupHiddenEntities.erase(itemDrop->entityId());
|
||||||
itemDrop->takeBy(m_mainPlayer->entityId(), (float)m_latency / 1000);
|
itemDrop->takeBy(m_mainPlayer->entityId(), (float)m_latency / 1000);
|
||||||
m_outgoingPackets.append(make_shared<RequestDropPacket>(itemDrop->entityId()));
|
m_outgoingPackets.append(make_shared<RequestDropPacket>(itemDrop->entityId()));
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ public:
|
|||||||
// FIXME: This is a dumb way of getting limited animation support
|
// FIXME: This is a dumb way of getting limited animation support
|
||||||
virtual void addEffectEmitters(StringSet const& emitters) = 0;
|
virtual void addEffectEmitters(StringSet const& emitters) = 0;
|
||||||
virtual void addParticles(List<Particle> const& particles) = 0;
|
virtual void addParticles(List<Particle> const& particles) = 0;
|
||||||
virtual void addSound(String const& sound, float volume = 1.0f) = 0;
|
virtual void addSound(String const& sound, float volume = 1.0f, float pitch = 1.0f) = 0;
|
||||||
|
|
||||||
virtual void setCameraFocusEntity(Maybe<EntityId> const& cameraFocusEntity) = 0;
|
virtual void setCameraFocusEntity(Maybe<EntityId> const& cameraFocusEntity) = 0;
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "StarMaterialItem.hpp"
|
#include "StarMaterialItem.hpp"
|
||||||
#include "StarJson.hpp"
|
#include "StarJson.hpp"
|
||||||
|
#include "StarJsonExtra.hpp"
|
||||||
#include "StarMaterialDatabase.hpp"
|
#include "StarMaterialDatabase.hpp"
|
||||||
#include "StarRoot.hpp"
|
#include "StarRoot.hpp"
|
||||||
#include "StarAssets.hpp"
|
#include "StarAssets.hpp"
|
||||||
@ -31,8 +32,20 @@ MaterialItem::MaterialItem(Json const& config, String const& directory, Json con
|
|||||||
setCooldownTime(config.queryFloat("materialItems.cooldown", defaultParameters.queryFloat("materialItems.cooldown")));
|
setCooldownTime(config.queryFloat("materialItems.cooldown", defaultParameters.queryFloat("materialItems.cooldown")));
|
||||||
m_blockRadius = config.getFloat("blockRadius", defaultParameters.getFloat("blockRadius"));
|
m_blockRadius = config.getFloat("blockRadius", defaultParameters.getFloat("blockRadius"));
|
||||||
m_altBlockRadius = config.getFloat("altBlockRadius", defaultParameters.getFloat("altBlockRadius"));
|
m_altBlockRadius = config.getFloat("altBlockRadius", defaultParameters.getFloat("altBlockRadius"));
|
||||||
m_multiplace = config.getBool("allowMultiplace", BlockCollisionSet.contains(Root::singleton().materialDatabase()->materialCollisionKind(m_material)));
|
|
||||||
|
|
||||||
|
auto materialDatabase = Root::singleton().materialDatabase();
|
||||||
|
m_multiplace = config.getBool("allowMultiplace", BlockCollisionSet.contains(materialDatabase->materialCollisionKind(m_material)));
|
||||||
|
m_placeSounds = jsonToStringList(config.get("placeSounds", JsonArray()));
|
||||||
|
if (m_placeSounds.empty()) {
|
||||||
|
auto miningSound = materialDatabase->miningSound(m_material);
|
||||||
|
if (!miningSound.empty())
|
||||||
|
m_placeSounds.append(move(miningSound));
|
||||||
|
auto stepSound = materialDatabase->footstepSound(m_material);
|
||||||
|
if (!stepSound.empty())
|
||||||
|
m_placeSounds.append(move(stepSound));
|
||||||
|
else if (m_placeSounds.empty())
|
||||||
|
m_placeSounds.append(materialDatabase->defaultFootstepSound());
|
||||||
|
}
|
||||||
m_shifting = false;
|
m_shifting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,6 +111,7 @@ void MaterialItem::fire(FireMode mode, bool shifting, bool edgeTriggered) {
|
|||||||
steps = (int)ceil(magnitude);
|
steps = (int)ceil(magnitude);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned total = 0;
|
||||||
bool fail = true;
|
bool fail = true;
|
||||||
for (int i = 0; i != steps; ++i) {
|
for (int i = 0; i != steps; ++i) {
|
||||||
auto placementOrigin = aimPosition + diff * ((float)i / steps);
|
auto placementOrigin = aimPosition + diff * ((float)i / steps);
|
||||||
@ -110,12 +124,20 @@ void MaterialItem::fire(FireMode mode, bool shifting, bool edgeTriggered) {
|
|||||||
size_t failed = world()->applyTileModifications(modifications, false).size();
|
size_t failed = world()->applyTileModifications(modifications, false).size();
|
||||||
if (failed < modifications.size()) {
|
if (failed < modifications.size()) {
|
||||||
fail = false;
|
fail = false;
|
||||||
consume(modifications.size() - failed);
|
unsigned placed = modifications.size() - failed;
|
||||||
|
consume(placed);
|
||||||
|
total += placed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fail)
|
if (!fail) {
|
||||||
|
auto sound = Random::randValueFrom(m_placeSounds, "");
|
||||||
|
if (total && !sound.empty()) {
|
||||||
|
float intensity = clamp((float)total / 20, 0.0f, 1.0f);
|
||||||
|
owner()->addSound(sound, 1.0f + intensity, (1.25f - intensity * 0.75f) * Random::randf(0.9f, 1.1f));
|
||||||
|
}
|
||||||
FireableItem::fire(mode, shifting, edgeTriggered);
|
FireableItem::fire(mode, shifting, edgeTriggered);
|
||||||
|
}
|
||||||
|
|
||||||
m_lastAimPosition = aimPosition;
|
m_lastAimPosition = aimPosition;
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@ private:
|
|||||||
float m_altBlockRadius;
|
float m_altBlockRadius;
|
||||||
bool m_shifting;
|
bool m_shifting;
|
||||||
bool m_multiplace;
|
bool m_multiplace;
|
||||||
|
StringList m_placeSounds;
|
||||||
Maybe<Vec2F> m_lastAimPosition;
|
Maybe<Vec2F> m_lastAimPosition;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -421,11 +421,12 @@ void GuiContext::playAudio(AudioInstancePtr audioInstance) {
|
|||||||
m_mixer->play(audioInstance);
|
m_mixer->play(audioInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiContext::playAudio(String const& audioAsset, int loops, float volume) {
|
void GuiContext::playAudio(String const& audioAsset, int loops, float volume, float pitch) {
|
||||||
auto assets = Root::singleton().assets();
|
auto assets = Root::singleton().assets();
|
||||||
auto config = Root::singleton().configuration();
|
auto config = Root::singleton().configuration();
|
||||||
auto audioInstance = make_shared<AudioInstance>(*assets->audio(audioAsset));
|
auto audioInstance = make_shared<AudioInstance>(*assets->audio(audioAsset));
|
||||||
audioInstance->setVolume(volume);
|
audioInstance->setVolume(volume);
|
||||||
|
audioInstance->setPitchMultiplier(pitch);
|
||||||
audioInstance->setLoops(loops);
|
audioInstance->setLoops(loops);
|
||||||
m_mixer->play(move(audioInstance));
|
m_mixer->play(move(audioInstance));
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ public:
|
|||||||
StringList wrapInterfaceText(String const& s, Maybe<unsigned> wrapWidth);
|
StringList wrapInterfaceText(String const& s, Maybe<unsigned> wrapWidth);
|
||||||
|
|
||||||
void playAudio(AudioInstancePtr audioInstance);
|
void playAudio(AudioInstancePtr audioInstance);
|
||||||
void playAudio(String const& audioAsset, int loops = 0, float volume = 1);
|
void playAudio(String const& audioAsset, int loops = 0, float volume = 1.0f, float pitch = 1.0f);
|
||||||
|
|
||||||
bool shiftHeld() const;
|
bool shiftHeld() const;
|
||||||
void setShiftHeld(bool held);
|
void setShiftHeld(bool held);
|
||||||
|
Loading…
Reference in New Issue
Block a user