Make CircularQueue
This commit is contained in:
parent
1ff1ceaff8
commit
2ea637581d
@ -110,32 +110,34 @@ struct ChatEvent {
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr int EVENT_SIZE = 50;
|
constexpr int EVENT_SIZE = 50;
|
||||||
static int hit_events_at = 0, hit_events_start = 0;
|
template <typename T, int SIZE = EVENT_SIZE>
|
||||||
static ProjectileHitEvent hitEvents[EVENT_SIZE];
|
struct CircularQueue {
|
||||||
static int chat_events_at = 0, chat_events_start = 0;
|
int at = 0;
|
||||||
static ChatEvent chatEvents[EVENT_SIZE];
|
int start = 0;
|
||||||
|
T buf[SIZE];
|
||||||
|
|
||||||
template <typename T>
|
void push(T event) {
|
||||||
static void push_circular_queue(T event, T events[], int &start, int &at) {
|
buf[at] = event;
|
||||||
events[at] = event;
|
at++;
|
||||||
at++;
|
at %= SIZE;
|
||||||
at %= EVENT_SIZE;
|
if (at == start) {
|
||||||
if (at == start) {
|
start++;
|
||||||
|
start %= SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
T pop() {
|
||||||
|
if (start == at) {
|
||||||
|
ERR("Over popped projectile hit events!");
|
||||||
|
}
|
||||||
|
T ret = buf[start];
|
||||||
start++;
|
start++;
|
||||||
start %= EVENT_SIZE;
|
start %= EVENT_SIZE;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
CircularQueue<ProjectileHitEvent> hitEvents{};
|
||||||
template <typename T>
|
CircularQueue<ChatEvent> chatEvents{};
|
||||||
static T pop_circular_queue(T events[], int &start, int &at) {
|
|
||||||
if (start == at) {
|
|
||||||
ERR("Over popped projectile hit events!");
|
|
||||||
}
|
|
||||||
T ret = events[start];
|
|
||||||
start++;
|
|
||||||
start %= EVENT_SIZE;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const std::string fail = "Fail\n";
|
static const std::string fail = "Fail\n";
|
||||||
std::unordered_map<int, int> modern_entity_id_mapping = {
|
std::unordered_map<int, int> modern_entity_id_mapping = {
|
||||||
@ -232,8 +234,8 @@ std::string CommandServer_parse_injection(CommandServer_parse_t old, CommandServ
|
|||||||
return std::to_string(removed) + "\n";
|
return std::to_string(removed) + "\n";
|
||||||
} else if (cmd == "events.chat.posts") {
|
} else if (cmd == "events.chat.posts") {
|
||||||
std::string ret = "";
|
std::string ret = "";
|
||||||
while (chat_events_at != chat_events_start) {
|
while (chatEvents.at != chatEvents.start) {
|
||||||
ChatEvent ce = pop_circular_queue(chatEvents, chat_events_start, chat_events_at);
|
ChatEvent ce = chatEvents.pop();
|
||||||
std::string message = ce.toString();
|
std::string message = ce.toString();
|
||||||
if (compat_mode) std::replace(message.begin(), message.end(), '|', '\\');
|
if (compat_mode) std::replace(message.begin(), message.end(), '|', '\\');
|
||||||
else message = misc_base64_encode(message);
|
else message = misc_base64_encode(message);
|
||||||
@ -243,8 +245,8 @@ std::string CommandServer_parse_injection(CommandServer_parse_t old, CommandServ
|
|||||||
return ret + "\n";
|
return ret + "\n";
|
||||||
} else if (cmd == "player.events.chat.posts") {
|
} else if (cmd == "player.events.chat.posts") {
|
||||||
std::string ret = "";
|
std::string ret = "";
|
||||||
while (chat_events_at != chat_events_start) {
|
while (chatEvents.at != chatEvents.start) {
|
||||||
ChatEvent ce = pop_circular_queue(chatEvents, chat_events_start, chat_events_at);
|
ChatEvent ce = chatEvents.pop();
|
||||||
if (ce.from_player) {
|
if (ce.from_player) {
|
||||||
std::string message = ce.toString();
|
std::string message = ce.toString();
|
||||||
if (compat_mode) std::replace(message.begin(), message.end(), '|', '\\');
|
if (compat_mode) std::replace(message.begin(), message.end(), '|', '\\');
|
||||||
@ -256,8 +258,8 @@ std::string CommandServer_parse_injection(CommandServer_parse_t old, CommandServ
|
|||||||
return ret + "\n";
|
return ret + "\n";
|
||||||
} else if (cmd == "events.projectile.hits") {
|
} else if (cmd == "events.projectile.hits") {
|
||||||
std::string result = "";
|
std::string result = "";
|
||||||
while (hit_events_at != hit_events_start) {
|
while (hitEvents.at != hitEvents.start) {
|
||||||
result += pop_circular_queue(hitEvents, hit_events_start, hit_events_at).toString(commandserver) + "|";
|
result += hitEvents.pop().toString(commandserver) + "|";
|
||||||
}
|
}
|
||||||
if (result.size() > 1) result.pop_back();
|
if (result.size() > 1) result.pop_back();
|
||||||
return result + "\n";
|
return result + "\n";
|
||||||
@ -479,13 +481,13 @@ static HitResult *Arrow_tick_HitResult_constructor_injection(HitResult *self, En
|
|||||||
self->constructor(target);
|
self->constructor(target);
|
||||||
// Add event
|
// Add event
|
||||||
if (shooter && shooter->isPlayer()) {
|
if (shooter && shooter->isPlayer()) {
|
||||||
push_circular_queue(ProjectileHitEvent{
|
hitEvents.push(ProjectileHitEvent{
|
||||||
.x = (int) target->x,
|
.x = (int) target->x,
|
||||||
.y = (int) target->y,
|
.y = (int) target->y,
|
||||||
.z = (int) target->z,
|
.z = (int) target->z,
|
||||||
.owner = misc_get_player_username((Player *) shooter),
|
.owner = misc_get_player_username((Player *) shooter),
|
||||||
.targetId = target->id
|
.targetId = target->id
|
||||||
}, hitEvents, hit_events_start, hit_events_at);
|
});
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@ -498,13 +500,13 @@ static void Arrow_tick_injection(Arrow_tick_t old, Arrow *self) {
|
|||||||
if (self && !self->pending_removal && self->grounded && oldFlightTime != self->flight_time) {
|
if (self && !self->pending_removal && self->grounded && oldFlightTime != self->flight_time) {
|
||||||
if (shooter && shooter->isPlayer()) {
|
if (shooter && shooter->isPlayer()) {
|
||||||
// Hit! Get the data
|
// Hit! Get the data
|
||||||
push_circular_queue(ProjectileHitEvent{
|
hitEvents.push(ProjectileHitEvent{
|
||||||
.x = self->hit_x,
|
.x = self->hit_x,
|
||||||
.y = self->hit_y,
|
.y = self->hit_y,
|
||||||
.z = self->hit_z,
|
.z = self->hit_z,
|
||||||
.owner = misc_get_player_username((Player *) shooter),
|
.owner = misc_get_player_username((Player *) shooter),
|
||||||
.targetId = 0
|
.targetId = 0
|
||||||
}, hitEvents, hit_events_start, hit_events_at);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -534,7 +536,7 @@ static void Throwable_tick_Throwable_onHit_injection(Throwable *self, HitResult
|
|||||||
.targetId = 0
|
.targetId = 0
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
push_circular_queue(event, hitEvents, hit_events_start, hit_events_at);
|
hitEvents.push(event);
|
||||||
self->onHit(res);
|
self->onHit(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,10 +545,10 @@ static void Gui_addMessage_injection(Gui_addMessage_t original, Gui *gui, const
|
|||||||
if (recursing) {
|
if (recursing) {
|
||||||
original(gui, text);
|
original(gui, text);
|
||||||
} else {
|
} else {
|
||||||
push_circular_queue(ChatEvent{
|
chatEvents.push(ChatEvent{
|
||||||
text,
|
text,
|
||||||
chat_is_sending()
|
chat_is_sending()
|
||||||
}, chatEvents, chat_events_start, chat_events_at);
|
});
|
||||||
recursing = true;
|
recursing = true;
|
||||||
original(gui, text);
|
original(gui, text);
|
||||||
recursing = false;
|
recursing = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user