Skip to content

Commit aba0fc5

Browse files
committed
tweaks: some more fixes to prevent crashes
1 parent 6982156 commit aba0fc5

File tree

4 files changed

+54
-43
lines changed

4 files changed

+54
-43
lines changed

Code/client/Games/Skyrim/Actor.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1371,7 +1371,10 @@ void Actor::DropOrPickUpObject(const Inventory::Entry& arEntry, NiPoint3* apLoca
13711371

13721372
if (!pDroppedRef)
13731373
{
1374-
spdlog::warn("Object to pick up not found near target location, {:X}:{:X}.", arEntry.BaseId.ModId, arEntry.BaseId.BaseId);
1374+
spdlog::warn("Object to pick up not found near target location, {:X}:{:X}. Falling back to inventory add.", arEntry.BaseId.ModId, arEntry.BaseId.BaseId);
1375+
1376+
ScopedInventoryOverride _;
1377+
AddOrRemoveItem(arEntry, true);
13751378
return;
13761379
}
13771380

Code/client/Services/Generic/InventoryService.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ void InventoryService::OnEquipmentChangeEvent(const EquipmentChangeEvent& acEven
129129
if (!modSystem.GetServerModId(acEvent.ItemId, request.ItemId))
130130
return;
131131

132-
request.Count = acEvent.Count;
132+
const int32_t cEffectiveCount = acEvent.Count == 0 ? 1 : acEvent.Count;
133+
request.Count = cEffectiveCount;
133134
request.Unequip = acEvent.Unequip;
134135
request.IsSpell = acEvent.IsSpell;
135136
request.IsShout = acEvent.IsShout;
@@ -138,7 +139,7 @@ void InventoryService::OnEquipmentChangeEvent(const EquipmentChangeEvent& acEven
138139

139140
m_transport.Send(request);
140141

141-
spdlog::info("Sending equipment request, item: {:X}, count: {}, target object: {:X}", acEvent.ItemId, acEvent.Count, acEvent.ActorId);
142+
spdlog::info("Sending equipment request, item: {:X}, count: {}, target object: {:X}", acEvent.ItemId, cEffectiveCount, acEvent.ActorId);
142143
}
143144

144145
void InventoryService::OnNotifyInventoryChanges(const NotifyInventoryChanges& acMessage) noexcept
@@ -324,9 +325,11 @@ void InventoryService::ApplyEquipmentChange(Actor* pActor, const NotifyEquipment
324325
auto* pObject = Cast<TESBoundObject>(pItem);
325326

326327
// TODO: ExtraData necessary? probably
328+
const int32_t count = acMessage.Count == 0 ? 1 : acMessage.Count;
329+
327330
if (acMessage.Unequip)
328331
{
329-
pEquipManager->UnEquip(pActor, pItem, nullptr, acMessage.Count, pEquipSlot, false, true, false, false, nullptr);
332+
pEquipManager->UnEquip(pActor, pItem, nullptr, count, pEquipSlot, false, true, false, false, nullptr);
330333
}
331334
else
332335
{
@@ -344,7 +347,7 @@ void InventoryService::ApplyEquipmentChange(Actor* pActor, const NotifyEquipment
344347
}
345348
}
346349

347-
pEquipManager->Equip(pActor, pItem, nullptr, acMessage.Count, pEquipSlot, false, true, false, false);
350+
pEquipManager->Equip(pActor, pItem, nullptr, count, pEquipSlot, false, true, false, false);
348351

349352
for (const auto& armor : wornArmor.Entries)
350353
{

Code/client/Services/Generic/QuestService.cpp

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -150,47 +150,50 @@ BSTEventResult QuestService::OnEvent(const TESQuestStageEvent* apEvent, const Ev
150150

151151
void QuestService::OnQuestUpdate(const NotifyQuestUpdate& aUpdate) noexcept
152152
{
153-
ModSystem& modSystem = World::Get().GetModSystem();
154-
uint32_t formId = modSystem.GetGameId(aUpdate.Id);
155-
TESQuest* pQuest = Cast<TESQuest>(TESForm::GetById(formId));
156-
if (!pQuest)
153+
m_world.GetRunner().Queue([this, update = aUpdate]()
157154
{
158-
spdlog::error("Failed to find quest, base id: {:X}, mod id: {:X}", aUpdate.Id.BaseId, aUpdate.Id.ModId);
159-
return;
160-
}
155+
ModSystem& modSystem = World::Get().GetModSystem();
156+
uint32_t formId = modSystem.GetGameId(update.Id);
157+
TESQuest* pQuest = Cast<TESQuest>(TESForm::GetById(formId));
158+
if (!pQuest)
159+
{
160+
spdlog::error("Failed to find quest, base id: {:X}, mod id: {:X}", update.Id.BaseId, update.Id.ModId);
161+
return;
162+
}
161163

162-
if (pQuest->type == TESQuest::Type::None || pQuest->type == TESQuest::Type::Miscellaneous)
163-
{
164-
spdlog::info(__FUNCTION__ ": receiving type none/misc quest update gameId {:X} questStage {} questStatus {} questType {} formId {:X} name {}",
165-
aUpdate.Id.LogFormat(), aUpdate.Stage, aUpdate.Status,
166-
aUpdate.ClientQuestType, formId, pQuest->fullName.value.AsAscii());
167-
}
164+
if (pQuest->type == TESQuest::Type::None || pQuest->type == TESQuest::Type::Miscellaneous)
165+
{
166+
spdlog::info(__FUNCTION__ ": receiving type none/misc quest update gameId {:X} questStage {} questStatus {} questType {} formId {:X} name {}",
167+
update.Id.LogFormat(), update.Stage, update.Status,
168+
update.ClientQuestType, formId, pQuest->fullName.value.AsAscii());
169+
}
168170

169-
bool bResult = false;
170-
switch (aUpdate.Status)
171-
{
172-
case NotifyQuestUpdate::Started:
173-
{
174-
pQuest->ScriptSetStage(aUpdate.Stage);
175-
pQuest->SetActive(true);
176-
bResult = true;
177-
spdlog::info("Remote quest started: {:X}, stage: {}", formId, aUpdate.Stage);
178-
break;
179-
}
180-
case NotifyQuestUpdate::StageUpdate:
181-
pQuest->ScriptSetStage(aUpdate.Stage);
182-
bResult = true;
183-
spdlog::info("Remote quest updated: {:X}, stage: {}", formId, aUpdate.Stage);
184-
break;
185-
case NotifyQuestUpdate::Stopped:
186-
bResult = StopQuest(formId);
187-
spdlog::info("Remote quest stopped: {:X}, stage: {}", formId, aUpdate.Stage);
188-
break;
189-
default: break;
190-
}
171+
bool bResult = false;
172+
switch (update.Status)
173+
{
174+
case NotifyQuestUpdate::Started:
175+
{
176+
pQuest->ScriptSetStage(update.Stage);
177+
pQuest->SetActive(true);
178+
bResult = true;
179+
spdlog::info("Remote quest started: {:X}, stage: {}", formId, update.Stage);
180+
break;
181+
}
182+
case NotifyQuestUpdate::StageUpdate:
183+
pQuest->ScriptSetStage(update.Stage);
184+
bResult = true;
185+
spdlog::info("Remote quest updated: {:X}, stage: {}", formId, update.Stage);
186+
break;
187+
case NotifyQuestUpdate::Stopped:
188+
bResult = StopQuest(formId);
189+
spdlog::info("Remote quest stopped: {:X}, stage: {}", formId, update.Stage);
190+
break;
191+
default: break;
192+
}
191193

192-
if (!bResult)
193-
spdlog::error("Failed to update the client quest state, quest: {:X}, stage: {}, status: {}", formId, aUpdate.Stage, aUpdate.Status);
194+
if (!bResult)
195+
spdlog::error("Failed to update the client quest state, quest: {:X}, stage: {}, status: {}", formId, update.Stage, update.Status);
196+
});
194197
}
195198

196199
bool QuestService::StopQuest(uint32_t aformId)

Code/server/Services/InventoryService.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,13 @@ void InventoryService::OnEquipmentChanges(const PacketEvent<RequestEquipmentChan
118118
return;
119119
}
120120

121+
const auto effectiveCount = message.Count == 0 ? 1 : message.Count;
122+
121123
NotifyEquipmentChanges notify;
122124
notify.ServerId = message.ServerId;
123125
notify.ItemId = message.ItemId;
124126
notify.EquipSlotId = message.EquipSlotId;
125-
notify.Count = message.Count;
127+
notify.Count = effectiveCount;
126128
notify.Unequip = message.Unequip;
127129
notify.IsSpell = message.IsSpell;
128130
notify.IsShout = message.IsShout;

0 commit comments

Comments
 (0)