载入中...
搜索中...
未找到
VehicleOrderQueueAdapter.cpp
浏览该文件的文档.
2
4
5#include <unordered_map>
6#include <utility>
7
8namespace eve::vehicle {
9
10namespace {
11
12} // namespace
13
16 std::unordered_map<std::string, VehicleOrder> payloads;
17};
18
19void VehicleOrderQueueAdapter::pruneTerminalPayloads() {
20 for (auto it = impl_->payloads.begin(); it != impl_->payloads.end();) {
21 auto recordRef = impl_->queue.find(it->first);
22 const orders::Order* record = recordRef ? &recordRef->get() : nullptr;
23 if (record == nullptr ||
25 it = impl_->payloads.erase(it);
26 } else {
27 ++it;
28 }
29 }
30}
31
33
35
37 : impl_(std::make_unique<Impl>(*other.impl_)) {}
38
40 if (this != &other) *impl_ = *other.impl_;
41 return *this;
42}
43
45
47
49 double timeoutSeconds) {
50 auto id = impl_->queue.append(vehicleOrderTypeName(order.type), priority, timeoutSeconds);
51 if (!id) return id;
52 const std::string key = std::move(id).takeValue();
53 impl_->payloads.emplace(key, order);
55}
56
58 double timeoutSeconds) {
59 auto id = impl_->queue.replace(vehicleOrderTypeName(order.type), priority, timeoutSeconds);
60 if (!id) return id;
61 const std::string key = std::move(id).takeValue();
62 pruneTerminalPayloads();
63 impl_->payloads.emplace(key, order);
65}
66
68 double timeoutSeconds) {
69 auto id = impl_->queue.interrupt(vehicleOrderTypeName(order.type), priority, timeoutSeconds);
70 if (!id) return id;
71 const std::string key = std::move(id).takeValue();
72 pruneTerminalPayloads();
73 impl_->payloads.emplace(key, order);
75}
76
78 auto currentRef = impl_->queue.current();
79 orders::Order* current = currentRef ? &currentRef->get() : nullptr;
80 if (current == nullptr)
82 eve::DiagnosticCode::Conflict, "vehicle order queue has no active order", "order", {}, "vehicle.orders"));
83 auto completed = impl_->queue.complete(current->id);
84 if (completed) pruneTerminalPayloads();
85 return completed;
86}
87
89 auto currentRef = impl_->queue.current();
90 orders::Order* current = currentRef ? &currentRef->get() : nullptr;
91 if (current == nullptr)
93 eve::DiagnosticCode::Conflict, "vehicle order queue has no active order", "order", {}, "vehicle.orders"));
94 auto failed = impl_->queue.fail(current->id, reason);
95 if (failed) pruneTerminalPayloads();
96 return failed;
97}
98
99eve::Result<void> VehicleOrderQueueAdapter::cancel(const std::string& id, const std::string& reason) {
100 auto cancelled = impl_->queue.cancel(id, reason);
101 if (cancelled) pruneTerminalPayloads();
102 return cancelled;
103}
104
105void VehicleOrderQueueAdapter::update(double dtSeconds) {
106 auto updated = impl_->queue.update(dtSeconds);
107 updated.ignore("VehicleOrderQueueAdapter exposes a legacy void update boundary");
108 pruneTerminalPayloads();
109}
110
112 impl_->queue.clear();
113 impl_->payloads.clear();
114}
115
117 auto recordRef = impl_->queue.current();
118 const orders::Order* record = recordRef ? &recordRef->get() : nullptr;
119 if (record == nullptr) return nullptr;
120 const auto it = impl_->payloads.find(record->id);
121 return it == impl_->payloads.end() ? nullptr : &it->second;
122}
123
125 int count = 0;
126 for (int i = 0; i < impl_->queue.orderCount(); ++i) {
127 auto recordRef = impl_->queue.orderAt(i);
128 const orders::Order* record = recordRef ? &recordRef->get() : nullptr;
129 if (record != nullptr &&
131 ++count;
132 }
133 }
134 return count;
135}
136
138 legacy.queue.clear();
139 legacy.current = -1;
140 for (int i = 0; i < impl_->queue.orderCount(); ++i) {
141 auto recordRef = impl_->queue.orderAt(i);
142 const orders::Order* record = recordRef ? &recordRef->get() : nullptr;
143 if (record == nullptr ||
145 continue;
146 }
147 const auto it = impl_->payloads.find(record->id);
148 if (it == impl_->payloads.end()) continue;
149 if (record->state == orders::OrderState::Active) legacy.current = static_cast<int>(legacy.queue.size());
150 legacy.queue.push_back(it->second);
151 }
152}
153
155
157
159 : queue(other.queue),
160 current(other.current),
161 adapter(other.adapter == nullptr ? std::make_unique<VehicleOrderQueueAdapter>()
162 : std::make_unique<VehicleOrderQueueAdapter>(*other.adapter)) {}
163
165 if (this == &other) return *this;
166 queue = other.queue;
167 current = other.current;
168 if (other.adapter == nullptr) {
169 adapter = std::make_unique<VehicleOrderQueueAdapter>();
170 } else if (adapter == nullptr) {
171 adapter = std::make_unique<VehicleOrderQueueAdapter>(*other.adapter);
172 } else {
173 *adapter = *other.adapter;
174 }
175 return *this;
176}
177
178VehicleEntity::Orders::Orders(Orders&&) noexcept = default;
179
180VehicleEntity::Orders& VehicleEntity::Orders::operator=(Orders&&) noexcept = default;
181
182} // namespace eve::vehicle
int priority
std::uint32_t key
std::vector< std::int32_t > order
std::array< std::uint64_t, kPixelChunkSize *kPixelChunkSize > updated
std::string id
Definition PlayHost.cpp:108
double current
std::uint32_t count
std::string_view adapter
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Generic priority order queue with no gameplay or entity semantics.
载具实体:数据全部在组件里,行为在 VehicleSystem。
Maps VehicleOrder domain payloads onto an orders::CommandQueue.
void syncCompatibility(VehicleEntity::Orders &legacy) const
Refreshes the legacy component projection.
const VehicleOrder * current() const
Returns the Vehicle payload for the active generic order, or null.
eve::Result< std::string > replace(const VehicleOrder &order, int priority=0, double timeoutSeconds=0.0)
Cancels unfinished orders and starts a replacement.
eve::Result< std::string > interrupt(const VehicleOrder &order, int priority=0, double timeoutSeconds=0.0)
Interrupts the active order when the generic priority permits.
int activeOrQueuedCount() const
Returns the number of active and queued Vehicle orders.
~VehicleOrderQueueAdapter()
Releases the owned generic queue and domain payloads.
void update(double dtSeconds)
Advances generic timeout handling.
eve::Result< void > failCurrent(const std::string &reason)
Fails the current generic order and activates the next one.
VehicleOrderQueueAdapter & operator=(const VehicleOrderQueueAdapter &)
Deep-copies generic lifecycle state and Vehicle payloads.
VehicleOrderQueueAdapter()
Creates an empty adapter with an owned generic queue.
eve::Result< void > cancel(const std::string &id, const std::string &reason="cancelled")
Cancels an active or queued generic order by stable id.
eve::Result< std::string > append(const VehicleOrder &order, int priority=0, double timeoutSeconds=0.0)
Appends a Vehicle domain order to the generic queue.
eve::Result< void > completeCurrent()
Completes the current generic order and activates the next one.
void clear()
Clears generic queue history and Vehicle domain payloads.
驾驶者接口与玩家控制状态。
const char * vehicleOrderTypeName(VehicleOrderType type)
命令类型的字符串名("move" | "attack_move" | ...)。
Definition Vehicle.cpp:79
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
One entity-agnostic command and its lifecycle metadata.
Vehicle order lifecycle adapter and compatibility projection.
std::unique_ptr< VehicleOrderQueueAdapter > adapter
Orders & operator=(const Orders &other)
Deep-copies the queue and domain payload projection for ECS staging.
Orders()
Creates an empty adapter-backed order component.
std::vector< VehicleOrder > queue
~Orders()
Releases the adapter-owned generic queue.
std::unordered_map< std::string, VehicleOrder > payloads
一条 Vehicle 领域命令(生命周期由 Vehicle order adapter 执行)。