Add ability to use callbacks.
This commit is contained in:
parent
0b81199965
commit
b3ca5acc3c
@ -59,8 +59,10 @@ bool exports_plugin_on_unload(plugin_own_context_t context_handle,
|
||||
void exports_plugin_handle_event(uint32_t event_id,
|
||||
plugin_own_server_instance_t server,
|
||||
plugin_event_t *event, plugin_event_t *ret) {
|
||||
// Basic event pass-through
|
||||
*ret = *event;
|
||||
pumpkin_event_handler_t handler =
|
||||
(pumpkin_event_handler_t)(uintptr_t)event_id;
|
||||
handler(server, ret);
|
||||
}
|
||||
|
||||
bool exports_plugin_handle_command(uint32_t command_id,
|
||||
@ -68,17 +70,78 @@ bool exports_plugin_handle_command(uint32_t command_id,
|
||||
plugin_own_server_instance_t server,
|
||||
plugin_own_consumed_args_t args,
|
||||
int32_t *ret, plugin_command_error_t *err) {
|
||||
err->tag = PUMPKIN_PLUGIN_COMMAND_COMMAND_ERROR_COMMAND_FAILED;
|
||||
pumpkin_command_handler_t handler =
|
||||
(pumpkin_command_handler_t)(uintptr_t)command_id;
|
||||
return handler(sender, server, args, ret, err);
|
||||
}
|
||||
|
||||
plugin_string_t str;
|
||||
plugin_string_set(&str, "Command not implemented");
|
||||
|
||||
pumpkin_plugin_text_own_text_component_t text =
|
||||
pumpkin_plugin_text_static_text_component_text(&str);
|
||||
err->val.command_failed = text;
|
||||
|
||||
return false;
|
||||
void exports_plugin_handle_command_suggestion(
|
||||
uint32_t handler_id, plugin_own_command_sender_t sender,
|
||||
plugin_own_server_instance_t server, plugin_suggestion_request_t *request,
|
||||
plugin_command_suggestions_t *ret) {
|
||||
pumpkin_command_suggestion_handler_t handler =
|
||||
(pumpkin_command_suggestion_handler_t)(uintptr_t)handler_id;
|
||||
handler(sender, server, request, ret);
|
||||
}
|
||||
|
||||
void exports_plugin_handle_task(uint32_t handler_id,
|
||||
plugin_own_server_instance_t server) {}
|
||||
plugin_own_server_instance_t server) {
|
||||
pumpkin_task_handler_t handler =
|
||||
(pumpkin_task_handler_t)(uintptr_t)handler_id;
|
||||
handler(server);
|
||||
}
|
||||
|
||||
bool exports_plugin_handle_ipc_message(plugin_plugin_id_t *sender,
|
||||
plugin_ipc_message_t *message,
|
||||
plugin_ipc_message_t *ret,
|
||||
plugin_string_t *err) {
|
||||
if (g_plugin.handle_ipc_message) {
|
||||
return g_plugin.handle_ipc_message(sender, message, ret, err);
|
||||
}
|
||||
|
||||
plugin_string_dup(err, "This plugin cannot recieve messages");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool exports_plugin_handle_ai_goal_can_start(
|
||||
uint32_t goal_id, plugin_own_server_instance_t server,
|
||||
plugin_own_entity_t entity) {
|
||||
pumpkin_ai_goal_t *goal = (pumpkin_ai_goal_t *)(uintptr_t)goal_id;
|
||||
return goal->can_start(server, entity);
|
||||
}
|
||||
|
||||
bool exports_plugin_handle_ai_goal_should_continue(
|
||||
uint32_t goal_id, plugin_own_server_instance_t server,
|
||||
plugin_own_entity_t entity) {
|
||||
pumpkin_ai_goal_t *goal = (pumpkin_ai_goal_t *)(uintptr_t)goal_id;
|
||||
return goal->should_continue(server, entity);
|
||||
}
|
||||
|
||||
void exports_plugin_handle_ai_goal_start(uint32_t goal_id,
|
||||
plugin_own_server_instance_t server,
|
||||
plugin_own_entity_t entity) {
|
||||
pumpkin_ai_goal_t *goal = (pumpkin_ai_goal_t *)(uintptr_t)goal_id;
|
||||
goal->start(server, entity);
|
||||
}
|
||||
|
||||
void exports_plugin_handle_ai_goal_tick(uint32_t goal_id,
|
||||
plugin_own_server_instance_t server,
|
||||
plugin_own_entity_t entity) {
|
||||
pumpkin_ai_goal_t *goal = (pumpkin_ai_goal_t *)(uintptr_t)goal_id;
|
||||
goal->tick(server, entity);
|
||||
}
|
||||
|
||||
void exports_plugin_handle_ai_goal_stop(uint32_t goal_id,
|
||||
plugin_own_server_instance_t server,
|
||||
plugin_own_entity_t entity) {
|
||||
pumpkin_ai_goal_t *goal = (pumpkin_ai_goal_t *)(uintptr_t)goal_id;
|
||||
goal->stop(server, entity);
|
||||
}
|
||||
|
||||
void exports_plugin_handle_generate_phase(uint32_t generator_id,
|
||||
plugin_generation_phase_t phase,
|
||||
plugin_own_chunk_buffer_t chunk) {
|
||||
pumpkin_chunk_generator_t handler =
|
||||
(pumpkin_chunk_generator_t)(uintptr_t)generator_id;
|
||||
handler(phase, chunk);
|
||||
}
|
||||
|
||||
@ -25,12 +25,43 @@ typedef struct {
|
||||
|
||||
typedef void (*pumpkin_on_load_t)(plugin_own_context_t ctx);
|
||||
typedef void (*pumpkin_on_unload_t)(plugin_own_context_t ctx);
|
||||
typedef bool (*pumpkin_ipc_message_handler_t)(plugin_plugin_id_t *sender,
|
||||
plugin_ipc_message_t *message,
|
||||
plugin_ipc_message_t *ret,
|
||||
plugin_string_t *err);
|
||||
typedef pumpkin_metadata_t (*pumpkin_get_metadata_t)(void);
|
||||
|
||||
typedef void (*pumpkin_event_handler_t)(plugin_own_server_instance_t server,
|
||||
plugin_event_t *event);
|
||||
typedef bool (*pumpkin_command_handler_t)(plugin_own_command_sender_t sender,
|
||||
plugin_own_server_instance_t server,
|
||||
plugin_own_consumed_args_t args,
|
||||
int32_t *ret,
|
||||
plugin_command_error_t *err);
|
||||
typedef void (*pumpkin_command_suggestion_handler_t)(
|
||||
plugin_own_command_sender_t sender, plugin_own_server_instance_t server,
|
||||
plugin_suggestion_request_t *request, plugin_command_suggestions_t *ret);
|
||||
typedef void (*pumpkin_task_handler_t)(plugin_own_server_instance_t server);
|
||||
typedef void (*pumpkin_chunk_generator_t)(plugin_generation_phase_t phase,
|
||||
plugin_own_chunk_buffer_t chunk);
|
||||
typedef bool (*pumpkin_ai_goal_predicate_t)(plugin_own_server_instance_t server,
|
||||
plugin_own_entity_t entity);
|
||||
typedef void (*pumpkin_ai_goal_action_t)(plugin_own_server_instance_t server,
|
||||
plugin_own_entity_t entity);
|
||||
|
||||
typedef struct {
|
||||
pumpkin_ai_goal_predicate_t can_start;
|
||||
pumpkin_ai_goal_predicate_t should_continue;
|
||||
pumpkin_ai_goal_action_t start;
|
||||
pumpkin_ai_goal_action_t tick;
|
||||
pumpkin_ai_goal_action_t stop;
|
||||
} pumpkin_ai_goal_t;
|
||||
|
||||
typedef struct {
|
||||
pumpkin_get_metadata_t get_metadata;
|
||||
pumpkin_on_load_t on_load;
|
||||
pumpkin_on_unload_t on_unload;
|
||||
pumpkin_ipc_message_handler_t handle_ipc_message;
|
||||
} pumpkin_plugin_t;
|
||||
|
||||
void pumpkin_register_plugin(pumpkin_plugin_t plugin);
|
||||
@ -38,6 +69,62 @@ void pumpkin_register_plugin(pumpkin_plugin_t plugin);
|
||||
#define REGISTER_PUMPKIN_PLUGIN(plugin) \
|
||||
void exports_plugin_init_plugin(void) { pumpkin_register_plugin(plugin); }
|
||||
|
||||
static inline void pumpkin_context_register_event(
|
||||
pumpkin_plugin_context_borrow_context_t self,
|
||||
pumpkin_event_handler_t handler,
|
||||
pumpkin_plugin_context_event_type_t event_type,
|
||||
pumpkin_plugin_context_event_priority_t event_priority, bool blocking) {
|
||||
pumpkin_plugin_context_method_context_register_event(
|
||||
self, (uint32_t)(uintptr_t)handler, event_type, event_priority, blocking);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
pumpkin_scheduler_schedule_delayed_task(pumpkin_task_handler_t handler,
|
||||
uint64_t delay_ticks) {
|
||||
return pumpkin_plugin_scheduler_schedule_delayed_task(
|
||||
(uint32_t)(uintptr_t)handler, delay_ticks);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
pumpkin_scheduler_schedule_repeating_task(pumpkin_task_handler_t handler,
|
||||
uint64_t delay_ticks,
|
||||
uint64_t period_ticks) {
|
||||
return pumpkin_plugin_scheduler_schedule_repeating_task(
|
||||
(uint32_t)(uintptr_t)handler, delay_ticks, period_ticks);
|
||||
}
|
||||
|
||||
static inline void pumpkin_scheduler_cancel_task(uint32_t task_id) {
|
||||
pumpkin_plugin_scheduler_cancel_task(task_id);
|
||||
}
|
||||
|
||||
static inline void pumpkin_command_node_execute_with_handler(
|
||||
pumpkin_plugin_command_borrow_command_node_t self,
|
||||
pumpkin_command_handler_t handler) {
|
||||
pumpkin_plugin_command_method_command_node_execute_with_handler_id(
|
||||
self, (uint32_t)(uintptr_t)handler);
|
||||
}
|
||||
|
||||
static inline void pumpkin_command_node_suggest_with_handler(
|
||||
pumpkin_plugin_command_borrow_command_node_t self,
|
||||
pumpkin_command_suggestion_handler_t handler) {
|
||||
pumpkin_plugin_command_method_command_node_suggest_with_handler_id(
|
||||
self, (uint32_t)(uintptr_t)handler);
|
||||
}
|
||||
|
||||
static inline void
|
||||
pumpkin_world_set_chunk_generator(pumpkin_plugin_world_borrow_world_t self,
|
||||
pumpkin_chunk_generator_t handler) {
|
||||
pumpkin_plugin_world_method_world_set_chunk_generator(
|
||||
self, (uint32_t)(uintptr_t)handler);
|
||||
}
|
||||
|
||||
static inline void
|
||||
pumpkin_mob_add_custom_ai_goal(pumpkin_plugin_world_borrow_mob_t self,
|
||||
uint8_t priority, pumpkin_ai_goal_t *goal) {
|
||||
pumpkin_plugin_world_method_mob_add_custom_ai_goal(self, priority,
|
||||
(uint32_t)(uintptr_t)goal);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Loading…
Reference in New Issue
Block a user