4#include <simplesquirrel/simplesquirrel.hpp>
12void callScriptFn(
const ssq::Object&
fn,
const std::string& arg) {
13 if (
fn.isEmpty())
return;
14 ssq::Function
f =
fn.toFunction();
15 if (
f.isEmpty())
return;
17 SQInteger top = sq_gettop(raw);
18 sq_pushobject(raw,
f.getRaw());
19 sq_pushroottable(raw);
21 if (SQ_SUCCEEDED(sq_call(raw, 2, SQFalse, SQTrue))) {
42void NetRpc::call(uint16_t msgId,
const void* data,
size_t n,
bool reliable) {
43 if (!link_ || (
data ==
nullptr &&
n > 0))
return;
44 std::vector<char> env;
45 env.push_back(
static_cast<char>(msgId & 0xff));
46 env.push_back(
static_cast<char>((msgId >> 8) & 0xff));
47 const char*
p =
static_cast<const char*
>(
data);
48 env.insert(env.end(),
p,
p +
n);
50 env.data(), env.size());
54 if (!link_)
return false;
55 call(msgId, payload.data(), payload.size(), reliable);
60 handlers_[msgId] = std::move(
h);
64 if (
fn.isEmpty())
return;
65 scriptHandlers_[msgId] =
fn;
69 const char* data,
size_t n) {
71 if (channel != 0 ||
n < 2)
return;
72 const uint16_t msgId =
static_cast<uint16_t
>(uint8_t(data[0])) |
73 (
static_cast<uint16_t
>(uint8_t(data[1])) << 8);
74 const char* payload =
data + 2;
75 const size_t payloadLen =
n - 2;
77 auto sit = scriptHandlers_.find(msgId);
78 if (sit != scriptHandlers_.end()) {
79 callScriptFn(sit->second, std::string(payload, payloadLen));
82 auto it = handlers_.find(msgId);
83 if (it == handlers_.end())
return;
84 NetReader reader(payload, payloadLen);
struct SQVM * HSQUIRRELVM
SettlementPipeline::Stage fn
void registerScript(uint16_t msgId, ssq::Object fn)
void registerHandler(uint16_t msgId, Handler h)
bool callString(uint16_t msgId, const std::string &payload, bool reliable=true)
std::function< void(NetReader &)> Handler
void call(uint16_t msgId, const void *data, size_t n, bool reliable=true)
void send(MsgType type, uint8_t channel, const void *data, size_t n)
void setMessageHandler(MessageHandler h)
void pushValue(HSQUIRRELVM vm, const eve::rx::Value &v)