naia_shared/world/component/
property.rs1use log::warn;
2use std::ops::{Deref, DerefMut};
3
4use naia_serde::{BitReader, BitWrite, BitWriter, Serde, SerdeErr};
5
6use crate::world::{
7 component::property_mutate::PropertyMutator, delegation::auth_channel::EntityAuthAccessor,
8};
9
10#[derive(Clone)]
11enum PropertyImpl<T: Serde> {
12 HostOwned(HostOwnedProperty<T>),
13 RemoteOwned(RemoteOwnedProperty<T>),
14 RemotePublic(RemotePublicProperty<T>),
15 Delegated(DelegatedProperty<T>),
16 Local(LocalProperty<T>),
17}
18
19impl<T: Serde> PropertyImpl<T> {
20 fn name(&self) -> &str {
21 match self {
22 PropertyImpl::HostOwned(_) => "HostOwned",
23 PropertyImpl::RemoteOwned(_) => "RemoteOwned",
24 PropertyImpl::RemotePublic(_) => "RemotePublic",
25 PropertyImpl::Delegated(_) => "Delegated",
26 PropertyImpl::Local(_) => "Local",
27 }
28 }
29}
30
31#[derive(Clone)]
34pub struct Property<T: Serde> {
35 inner: PropertyImpl<T>,
36}
37
38impl<T: Serde> Property<T> {
40 pub fn new_local(value: T) -> Self {
42 Self {
43 inner: PropertyImpl::Local(LocalProperty::new(value)),
44 }
45 }
46
47 pub fn host_owned(value: T, mutator_index: u8) -> Self {
49 Self {
50 inner: PropertyImpl::HostOwned(HostOwnedProperty::new(value, mutator_index)),
51 }
52 }
53
54 pub fn new_read(reader: &mut BitReader) -> Result<Self, SerdeErr> {
57 let inner_value = Self::read_inner(reader)?;
58
59 Ok(Self {
60 inner: PropertyImpl::RemoteOwned(RemoteOwnedProperty::new(inner_value)),
61 })
62 }
63
64 pub fn set_mutator(&mut self, mutator: &PropertyMutator) {
66 match &mut self.inner {
67 PropertyImpl::HostOwned(inner) => {
68 inner.set_mutator(mutator);
69 }
70 PropertyImpl::RemoteOwned(_) | PropertyImpl::RemotePublic(_) => {
71 panic!("Remote Property should never call set_mutator().");
72 }
73 PropertyImpl::Delegated(_) => {
74 panic!("Delegated Property should never call set_mutator().");
75 }
76 PropertyImpl::Local(_) => {
77 panic!("Local Property should never have a mutator.");
78 }
79 }
80 }
81
82 pub fn write(&self, writer: &mut dyn BitWrite) {
86 match &self.inner {
87 PropertyImpl::HostOwned(inner) => {
88 inner.write(writer);
89 }
90 PropertyImpl::RemoteOwned(_) => {
91 panic!("Remote Private Property should never be written.");
92 }
93 PropertyImpl::RemotePublic(inner) => {
94 inner.write(writer);
95 }
96 PropertyImpl::Local(_) => {
97 panic!("Local Property should never be written.");
98 }
99 PropertyImpl::Delegated(inner) => {
100 inner.write(writer);
101 }
102 }
103 }
104
105 pub fn read_write(reader: &mut BitReader, writer: &mut BitWriter) -> Result<(), SerdeErr> {
108 T::de(reader)?.ser(writer);
109 Ok(())
110 }
111
112 pub fn read(&mut self, reader: &mut BitReader) -> Result<(), SerdeErr> {
115 match &mut self.inner {
116 PropertyImpl::HostOwned(_) => {
117 panic!("Host Property should never read.");
118 }
119 PropertyImpl::RemoteOwned(inner) => {
120 inner.read(reader)?;
121 }
122 PropertyImpl::RemotePublic(inner) => {
123 inner.read(reader)?;
124 }
125 PropertyImpl::Local(_) => {
126 panic!("Local Property should never read.");
127 }
128 PropertyImpl::Delegated(inner) => {
129 inner.read(reader)?;
130 }
131 }
132 Ok(())
133 }
134
135 fn read_inner(reader: &mut BitReader) -> Result<T, SerdeErr> {
136 T::de(reader)
137 }
138
139 fn inner(&self) -> &T {
142 match &self.inner {
143 PropertyImpl::HostOwned(inner) => &inner.inner,
144 PropertyImpl::RemoteOwned(inner) => &inner.inner,
145 PropertyImpl::RemotePublic(inner) => &inner.inner,
146 PropertyImpl::Local(inner) => &inner.inner,
147 PropertyImpl::Delegated(inner) => &inner.inner,
148 }
149 }
150
151 pub fn equals(&self, other: &Self) -> bool {
153 self.inner() == other.inner()
154 }
155
156 pub fn mirror(&mut self, other: &Self) {
159 let other_inner = other.inner();
160 match &mut self.inner {
161 PropertyImpl::HostOwned(inner) => {
162 inner.mirror(other_inner);
163 }
164 PropertyImpl::RemoteOwned(_) | PropertyImpl::RemotePublic(_) => {
165 panic!("Remote Property should never be set manually.");
166 }
167 PropertyImpl::Delegated(inner) => {
168 inner.mirror(other_inner);
169 }
170 PropertyImpl::Local(inner) => {
171 inner.mirror(other_inner);
172 }
173 }
174 }
175
176 pub fn remote_publish(&mut self, mutator_index: u8, mutator: &PropertyMutator) {
178 match &mut self.inner {
179 PropertyImpl::HostOwned(_) => {
180 panic!("Host Property should never be made public.");
181 }
182 PropertyImpl::RemoteOwned(inner) => {
183 let inner_value = inner.inner.clone();
184 self.inner = PropertyImpl::RemotePublic(RemotePublicProperty::new(
185 inner_value,
186 mutator_index,
187 mutator,
188 ));
189 }
190 PropertyImpl::RemotePublic(_) => {
191 panic!("Remote Property should never be made public twice.");
192 }
193 PropertyImpl::Local(_) => {
194 panic!("Local Property should never be made public.");
195 }
196 PropertyImpl::Delegated(_) => {
197 panic!("Delegated Property should never be made public.");
198 }
199 }
200 }
201
202 pub fn remote_unpublish(&mut self) {
204 match &mut self.inner {
205 PropertyImpl::HostOwned(_) => {
206 panic!("Host Property should never be unpublished.");
207 }
208 PropertyImpl::RemoteOwned(_) => {
209 panic!("Private Remote Property should never be unpublished.");
210 }
211 PropertyImpl::RemotePublic(inner) => {
212 let inner_value = inner.inner.clone();
213 self.inner = PropertyImpl::RemoteOwned(RemoteOwnedProperty::new(inner_value));
214 }
215 PropertyImpl::Local(_) => {
216 panic!("Local Property should never be unpublished.");
217 }
218 PropertyImpl::Delegated(_) => {
219 panic!("Delegated Property should never be unpublished.");
220 }
221 }
222 }
223
224 pub fn enable_delegation(
226 &mut self,
227 accessor: &EntityAuthAccessor,
228 mutator_opt: Option<(u8, &PropertyMutator)>,
229 ) {
230 let value = self.inner().clone();
231
232 let (mutator_index, mutator) = {
233 if let Some((mutator_index, mutator)) = mutator_opt {
234 match &mut self.inner {
235 PropertyImpl::RemoteOwned(_) => (mutator_index, mutator),
236 PropertyImpl::Local(_)
237 | PropertyImpl::RemotePublic(_)
238 | PropertyImpl::HostOwned(_)
239 | PropertyImpl::Delegated(_) => {
240 panic!(
241 "Property of type `{:?}` should never enable delegation this way",
242 self.inner.name()
243 );
244 }
245 }
246 } else {
247 match &mut self.inner {
248 PropertyImpl::HostOwned(inner) => (
249 inner.index,
250 inner
251 .mutator
252 .as_ref()
253 .expect("should have a mutator by now"),
254 ),
255 PropertyImpl::RemotePublic(inner) => (inner.index, &inner.mutator),
256 PropertyImpl::RemoteOwned(_)
257 | PropertyImpl::Delegated(_)
258 | PropertyImpl::Local(_) => {
259 panic!(
260 "Property of type `{:?}` should never enable delegation this way",
261 self.inner.name()
262 );
263 }
264 }
265 }
266 };
267
268 self.inner = PropertyImpl::Delegated(DelegatedProperty::new(
269 value,
270 accessor,
271 mutator,
272 mutator_index,
273 ));
274 }
275
276 pub fn disable_delegation(&mut self) {
278 match &mut self.inner {
279 PropertyImpl::HostOwned(_) => {
280 panic!("Host Property should never disable delegation.");
281 }
282 PropertyImpl::RemoteOwned(_) => {
283 panic!("Private Remote Property should never disable delegation.");
284 }
285 PropertyImpl::RemotePublic(_) => {
286 panic!("Public Remote Property should never disable delegation.");
287 }
288 PropertyImpl::Local(_) => {
289 panic!("Local Property should never disable delegation.");
290 }
291 PropertyImpl::Delegated(inner) => {
292 let inner_value = inner.inner.clone();
293 let mut new_inner = HostOwnedProperty::new(inner_value, inner.index);
294 new_inner.set_mutator(&inner.mutator);
295 self.inner = PropertyImpl::HostOwned(new_inner);
296 }
297 }
298 }
299
300 pub fn localize(&mut self) {
302 match &mut self.inner {
303 PropertyImpl::HostOwned(inner) => {
304 let inner_value = inner.inner.clone();
305 self.inner = PropertyImpl::Local(LocalProperty::new(inner_value));
306 }
307 PropertyImpl::RemoteOwned(_) | PropertyImpl::RemotePublic(_) => {
308 panic!("Remote Property should never be made local.");
309 }
310 PropertyImpl::Local(_) => {
311 panic!("Local Property should never be made local twice.");
312 }
313 PropertyImpl::Delegated(_) => {
314 panic!("Delegated Property should never be made local.");
315 }
316 }
317 }
318}
319
320impl<T: Serde> Deref for Property<T> {
323 type Target = T;
324
325 fn deref(&self) -> &Self::Target {
326 self.inner()
327 }
328}
329
330impl<T: Serde> DerefMut for Property<T> {
331 fn deref_mut(&mut self) -> &mut Self::Target {
332 match &mut self.inner {
334 PropertyImpl::HostOwned(inner) => {
335 inner.mutate();
336 &mut inner.inner
337 }
338 PropertyImpl::Delegated(inner) => {
339 inner.mutate();
340 &mut inner.inner
341 }
342 PropertyImpl::RemoteOwned(inner) => &mut inner.inner,
343 PropertyImpl::RemotePublic(inner) => &mut inner.inner,
344 PropertyImpl::Local(inner) => &mut inner.inner,
345 }
346 }
347}
348
349#[derive(Clone)]
350pub struct HostOwnedProperty<T: Serde> {
351 inner: T,
352 mutator: Option<PropertyMutator>,
353 index: u8,
354}
355
356impl<T: Serde> HostOwnedProperty<T> {
357 pub fn new(value: T, mutator_index: u8) -> Self {
359 Self {
360 inner: value,
361 mutator: None,
362 index: mutator_index,
363 }
364 }
365
366 pub fn set_mutator(&mut self, mutator: &PropertyMutator) {
367 self.mutator = Some(mutator.clone_new());
368 }
369
370 pub fn write(&self, writer: &mut dyn BitWrite) {
371 self.inner.ser(writer);
372 }
373
374 pub fn mirror(&mut self, other: &T) {
375 self.mutate();
376 self.inner = other.clone();
377 }
378
379 pub fn mutate(&mut self) {
380 let Some(mutator) = &mut self.mutator else {
381 warn!("Host Property should have a mutator immediately after creation.");
382 return;
383 };
384 mutator.mutate(self.index);
385 }
386}
387
388#[derive(Clone)]
389pub struct LocalProperty<T: Serde> {
390 inner: T,
391}
392
393impl<T: Serde> LocalProperty<T> {
394 pub fn new(value: T) -> Self {
396 Self { inner: value }
397 }
398
399 pub fn mirror(&mut self, other: &T) {
400 self.inner = other.clone();
401 }
402}
403
404#[derive(Clone)]
405pub struct RemoteOwnedProperty<T: Serde> {
406 inner: T,
407}
408
409impl<T: Serde> RemoteOwnedProperty<T> {
410 pub fn new(value: T) -> Self {
412 Self { inner: value }
413 }
414
415 pub fn read(&mut self, reader: &mut BitReader) -> Result<(), SerdeErr> {
416 self.inner = Property::read_inner(reader)?;
417 Ok(())
418 }
419}
420
421#[derive(Clone)]
422pub struct RemotePublicProperty<T: Serde> {
423 inner: T,
424 mutator: PropertyMutator,
425 index: u8,
426}
427
428impl<T: Serde> RemotePublicProperty<T> {
429 pub fn new(value: T, mutator_index: u8, mutator: &PropertyMutator) -> Self {
431 Self {
432 inner: value,
433 mutator: mutator.clone_new(),
434 index: mutator_index,
435 }
436 }
437
438 pub fn read(&mut self, reader: &mut BitReader) -> Result<(), SerdeErr> {
439 self.inner = Property::read_inner(reader)?;
440 self.mutate();
441 Ok(())
442 }
443
444 pub fn write(&self, writer: &mut dyn BitWrite) {
445 self.inner.ser(writer);
446 }
447
448 fn mutate(&mut self) {
449 let _success = self.mutator.mutate(self.index);
450 }
451}
452
453#[derive(Clone)]
454pub struct DelegatedProperty<T: Serde> {
455 inner: T,
456 auth_accessor: EntityAuthAccessor,
457 mutator: PropertyMutator,
458 index: u8,
459}
460
461impl<T: Serde> DelegatedProperty<T> {
462 pub fn new(
464 value: T,
465 auth_accessor: &EntityAuthAccessor,
466 mutator: &PropertyMutator,
467 index: u8,
468 ) -> Self {
469 Self {
470 inner: value,
471 auth_accessor: auth_accessor.clone(),
472 mutator: mutator.clone_new(),
473 index,
474 }
475 }
476
477 pub fn read(&mut self, reader: &mut BitReader) -> Result<(), SerdeErr> {
478 let value = Property::read_inner(reader)?;
479
480 if self.can_read() {
481 self.inner = value;
482 if self.can_mutate() {
483 self.mutate();
484 }
485 }
486
487 Ok(())
488 }
489
490 pub fn write(&self, writer: &mut dyn BitWrite) {
491 if !self.can_write() {
492 panic!("Must have Authority over Entity before performing this operation. Current Authority: {:?}", self.auth_accessor.auth_status());
493 }
494 self.inner.ser(writer);
495 }
496
497 pub fn mirror(&mut self, other: &T) {
498 self.mutate();
499 self.inner = other.clone();
500 }
501
502 fn mutate(&mut self) {
503 if !self.can_mutate() {
504 panic!("Must request authority to mutate a Delegated Property.");
505 }
506 let _success = self.mutator.mutate(self.index);
507 }
508
509 fn can_mutate(&self) -> bool {
510 self.auth_accessor.auth_status().can_mutate()
511 }
512
513 fn can_read(&self) -> bool {
514 self.auth_accessor.auth_status().can_read()
515 }
516
517 fn can_write(&self) -> bool {
518 self.auth_accessor.auth_status().can_write()
519 }
520}