2019-12-22 20:04:07 +00:00
|
|
|
#include "Runtime/CRelayTracker.hpp"
|
|
|
|
|
|
|
|
#include "Runtime/CSaveWorld.hpp"
|
|
|
|
#include "Runtime/CStateManager.hpp"
|
|
|
|
#include "Runtime/World/CWorld.hpp"
|
|
|
|
|
2016-07-24 23:14:58 +00:00
|
|
|
#include <algorithm>
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
namespace urde {
|
|
|
|
|
2020-03-25 19:53:45 +00:00
|
|
|
CRelayTracker::CRelayTracker(CBitStreamReader& in, const CSaveWorld& saveWorld) {
|
|
|
|
const u32 relayCount = saveWorld.GetRelayCount();
|
|
|
|
if (saveWorld.GetRelayCount()) {
|
|
|
|
std::vector<bool> relayStates(saveWorld.GetRelayCount());
|
|
|
|
for (u32 i = 0; i < relayCount; ++i) {
|
2018-12-08 05:30:43 +00:00
|
|
|
relayStates[i] = in.ReadEncoded(1);
|
2020-03-25 19:53:45 +00:00
|
|
|
}
|
2018-12-08 05:30:43 +00:00
|
|
|
|
|
|
|
for (u32 i = 0; i < relayCount; ++i) {
|
2020-03-25 19:53:45 +00:00
|
|
|
if (!relayStates[i]) {
|
2018-12-08 05:30:43 +00:00
|
|
|
continue;
|
2020-03-25 19:53:45 +00:00
|
|
|
}
|
|
|
|
x0_relayStates.push_back(saveWorld.GetRelayEditorId(i));
|
2016-07-24 23:14:58 +00:00
|
|
|
}
|
2018-12-08 05:30:43 +00:00
|
|
|
}
|
2016-07-24 23:14:58 +00:00
|
|
|
}
|
|
|
|
|
2020-03-18 05:03:32 +00:00
|
|
|
bool CRelayTracker::HasRelay(TEditorId id) const {
|
|
|
|
return std::find(x0_relayStates.cbegin(), x0_relayStates.cend(), id) != x0_relayStates.cend();
|
2016-07-24 23:14:58 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void CRelayTracker::AddRelay(TEditorId id) {
|
2020-03-18 05:03:32 +00:00
|
|
|
if (HasRelay(id)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
x0_relayStates.push_back(id);
|
2016-07-24 23:14:58 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void CRelayTracker::RemoveRelay(TEditorId id) {
|
2020-03-18 05:03:32 +00:00
|
|
|
if (!HasRelay(id)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
x0_relayStates.erase(std::remove(x0_relayStates.begin(), x0_relayStates.end(), id), x0_relayStates.end());
|
2016-07-24 23:14:58 +00:00
|
|
|
}
|
|
|
|
|
2019-02-10 04:41:35 +00:00
|
|
|
void CRelayTracker::SendMsgs(TAreaId areaId, CStateManager& stateMgr) {
|
2019-08-14 14:58:54 +00:00
|
|
|
const CWorld* world = stateMgr.GetWorld();
|
2018-12-08 05:30:43 +00:00
|
|
|
u32 relayCount = world->GetRelayCount();
|
2016-07-24 23:14:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
bool hasActiveRelays = false;
|
|
|
|
for (u32 i = 0; i < relayCount; ++i) {
|
|
|
|
const CWorld::CRelay& relay = world->GetRelay(i);
|
|
|
|
if (relay.GetTargetId().AreaNum() != areaId)
|
|
|
|
continue;
|
2016-07-24 23:14:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
if (!HasRelay(relay.GetRelayId()))
|
|
|
|
continue;
|
2016-07-24 23:14:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
stateMgr.SendScriptMsg(kInvalidUniqueId, relay.GetTargetId(), EScriptObjectMessage(relay.GetMessage()),
|
|
|
|
EScriptObjectState::Any);
|
|
|
|
if (relay.GetActive())
|
|
|
|
hasActiveRelays = true;
|
|
|
|
}
|
2016-07-24 23:14:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
if (!hasActiveRelays)
|
|
|
|
return;
|
2016-07-24 23:14:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
for (u32 i = 0; i < relayCount; ++i) {
|
|
|
|
const CWorld::CRelay& relay = world->GetRelay(i);
|
|
|
|
if (relay.GetTargetId().AreaNum() != areaId)
|
|
|
|
continue;
|
2016-07-24 23:14:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
if (!HasRelay(relay.GetRelayId()) || !relay.GetActive())
|
|
|
|
continue;
|
2016-07-24 23:14:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
RemoveRelay(relay.GetRelayId());
|
|
|
|
}
|
2016-07-24 23:14:58 +00:00
|
|
|
}
|
|
|
|
|
2020-03-25 19:53:45 +00:00
|
|
|
void CRelayTracker::PutTo(CBitStreamWriter& out, const CSaveWorld& saveWorld) {
|
|
|
|
const u32 relayCount = saveWorld.GetRelayCount();
|
2018-12-08 05:30:43 +00:00
|
|
|
std::vector<bool> relays(relayCount);
|
|
|
|
|
2019-02-10 04:41:35 +00:00
|
|
|
for (const TEditorId& id : x0_relayStates) {
|
2020-03-25 19:53:45 +00:00
|
|
|
const s32 idx = saveWorld.GetRelayIndex(id);
|
|
|
|
if (idx >= 0) {
|
2019-02-10 04:41:35 +00:00
|
|
|
relays[idx] = true;
|
2020-03-25 19:53:45 +00:00
|
|
|
}
|
2019-02-10 04:41:35 +00:00
|
|
|
}
|
2018-12-08 05:30:43 +00:00
|
|
|
|
2020-03-25 19:53:45 +00:00
|
|
|
for (u32 i = 0; i < relayCount; ++i) {
|
2018-12-08 05:30:43 +00:00
|
|
|
out.WriteEncoded(u32(relays[i]), 1);
|
2020-03-25 19:53:45 +00:00
|
|
|
}
|
2016-07-24 23:14:58 +00:00
|
|
|
}
|
2018-12-08 05:30:43 +00:00
|
|
|
|
|
|
|
} // namespace urde
|