#ifndef MSP_GAME_REMOTECALL_H_
#define MSP_GAME_REMOTECALL_H_
+#include <concepts>
#include <functional>
#include <stdexcept>
#include <msp/net/receiver.h>
namespace Msp::Game {
+template<typename P>
+concept HasEntityIdField = requires(P p) { { (p.entity_id) } -> std::same_as<std::uint32_t &>; };
+
template<typename P, typename F = void(const P &)>
class RemoteCallBase: protected Net::PacketReceiver<P>
{
template<typename P, typename E = Entity>
- requires std::is_base_of_v<Entity, E>
+ requires std::is_base_of_v<Entity, E> && HasEntityIdField<P>
class RemoteEntityCallBase: protected RemoteCallBase<P, void(Handle<E>, const P &)>
{
protected:
template<typename P, typename E>
- requires std::is_base_of_v<Entity, E>
+ requires std::is_base_of_v<Entity, E> && HasEntityIdField<P>
void RemoteEntityCallBase<P, E>::prepare(Handle<E> entity, P &packet)
{
Handle<Zygote> zygote = entity->template get_component<Zygote>();
}
template<typename P, typename E>
- requires std::is_base_of_v<Entity, E>
+ requires std::is_base_of_v<Entity, E> && HasEntityIdField<P>
void RemoteEntityCallBase<P, E>::call(const P &packet)
{
Handle<Entity> entity = this->replicator->find_entity(packet.entity_id);