1mod interop;
9mod registry;
10
11pub use interop::Interop;
12pub use registry::{installed_mods, open_ui, server, CServer, Mod, ModInfo, Registry};
13pub use yog_gfx::{GfxContext, core as gfx_core, gl as gfx_gl, draw2d as gfx_draw2d};
14
15pub use yog_abi::{ABI_VERSION, YogApi};
17
18pub use yog_interop::{yog_export, import};
20
21pub use rkyv;
25
26#[doc(hidden)]
27pub use std::os::raw::c_void as __c_void;
28
29#[macro_export]
42macro_rules! export_mod {
43 ($mod_ty:ty) => {
44 #[no_mangle]
45 pub extern "C" fn yog_abi_version() -> u32 {
46 $crate::ABI_VERSION
47 }
48
49 #[no_mangle]
50 pub unsafe extern "C" fn yog_mod_register(
51 api: *const $crate::YogApi,
52 mod_id_ptr: *const ::std::os::raw::c_char,
53 ) {
54 let mod_id: &str = if mod_id_ptr.is_null() {
56 "unknown"
57 } else {
58 match ::std::ffi::CStr::from_ptr(mod_id_ptr).to_str() {
59 Ok(s) => s,
60 Err(_) => "unknown",
61 }
62 };
63 $crate::__set_current_mod_id(mod_id);
65
66 let outcome = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| {
69 let mut registry = unsafe { $crate::Registry::from_raw(api) };
72 <$mod_ty as $crate::Mod>::register(&mut registry);
73
74 for entry in $crate::YOG_EXPORTS.iter() {
76 registry.interop().export(entry.name, entry.ptr as *const ::std::os::raw::c_void);
77 }
78
79 $crate::__yog_resolve_pending_imports(®istry);
82 }));
83 if outcome.is_err() {
84 $crate::error!("mod {} panicked during register", ::core::stringify!($mod_ty));
85 }
86 }
87
88 #[no_mangle]
91 pub unsafe extern "C" fn __yog_resolve_imports_final(
92 api: *const $crate::YogApi,
93 ) {
94 let registry = unsafe { $crate::Registry::from_raw(api) };
95 $crate::__yog_resolve_pending_imports(®istry);
96 }
97 };
98}
99
100#[doc(hidden)]
104pub fn __set_current_mod_id(id: &str) {
105 CURRENT_MOD_ID.with(|cell| cell.replace(Some(id.to_string())));
106}
107
108#[doc(hidden)]
110pub fn __current_mod_id() -> Option<String> {
111 CURRENT_MOD_ID.with(|cell| cell.borrow().clone())
112}
113
114std::thread_local! {
115 static CURRENT_MOD_ID: std::cell::RefCell<Option<String>> = std::cell::RefCell::new(None);
116}
117
118#[doc(hidden)]
123pub struct YogExportEntry {
124 pub name: &'static str,
125 pub ptr: usize,
126}
127
128#[doc(hidden)]
130#[linkme::distributed_slice]
131pub static YOG_EXPORTS: [YogExportEntry] = [..];
132
133#[doc(hidden)]
135pub struct YogImportEntry {
136 pub mod_id: &'static str,
137 pub symbol: &'static str,
138 pub bind_fn: usize,
139}
140
141#[doc(hidden)]
143#[linkme::distributed_slice]
144pub static YOG_IMPORTS: [YogImportEntry] = [..];
145
146#[doc(hidden)]
150pub unsafe fn __yog_resolve_pending_imports(registry: &crate::Registry) {
151 let interop = registry.interop();
152 for entry in YOG_IMPORTS.iter() {
153 if let Some(ptr) = interop.import_raw(entry.mod_id, entry.symbol) {
154 let bind: unsafe extern "C" fn(*const std::ffi::c_void) = std::mem::transmute(entry.bind_fn);
155 bind(ptr);
156 }
157 }
158}
159
160pub use yog_command::CommandContext;
161pub use yog_core::{BlockPos, Server};
162pub use yog_event::{
163 AdvancementEvent, AttackEntityEvent, BlockBreakEvent, ChatEvent, ClientTickEvent,
164 ContainerCloseEvent, ContainerOpenEvent, CraftEvent, EntityDamageEvent, EntityDeathEvent,
165 EntityInteractEvent, EntitySpawnEvent, EventPhase, ExplosionEvent,
166 ItemPickupEvent, KeyPressEvent, PlaceBlockEvent, PlayerDeathEvent, PlayerJoinEvent,
167 PlayerLeaveEvent, PlayerMoveEvent, PlayerRespawnEvent, ProjectileHitEvent, ScreenEvent,
168 UseBlockEvent, UseItemEvent,
169};
170pub use yog_entity::Entity;
171pub use yog_network::{Packet, PacketEvent, PacketField};
172#[doc(inline)]
173pub use yog_network::packet;
174pub use yog_player::Player;
175pub use yog_registry::{BlockDef, FoodDef, FurnaceRecipe, ItemDef, ShapedRecipe, ShapelessRecipe, BookRecipe, ItemModifier, AdvancementReward, StartupGrant};
176pub use yog_config::Config;
177pub use yog_storage::{Storage, StorageScope, Value};
178pub use yog_world::World;
179pub use yog_book::{Book, BookCategory, BookEntry, BookPage, BookMacro, BookRegistry};
180pub use yog_book::{BookRenderer, BookFontRegistry};
181pub use yog_book::{text_page, text_page_titled, spotlight_page, crafting_page, smelting_page, image_page, entity_page, relations_page, pattern_page};
182pub use yog_ui::{UiRoot, LayoutNode, Rect, widget, Align, FlexDir, Dock, FocusStyle};
183pub use yog_inventory::{InventoryDef, SlotLayout};
184
185pub use yog_logging::{error, info, warn};
187
188pub mod core {
190 pub use yog_core::*;
191}
192
193pub mod event {
195 pub use yog_event::*;
196}
197
198pub mod world {
200 pub use yog_world::*;
201}
202
203pub mod entity {
205 pub use yog_entity::*;
206}
207
208pub mod player {
210 pub use yog_player::*;
211}
212
213pub mod content {
215 pub use yog_registry::*;
216}
217
218pub mod network {
220 pub use yog_network::*;
221}
222
223pub mod command {
225 pub use yog_command::*;
226}
227
228pub mod storage {
230 pub use yog_storage::*;
231}
232
233pub mod config {
235 pub use yog_config::*;
236}
237
238pub mod book {
240 pub use yog_book::*;
241}
242
243pub mod ui {
245 pub use yog_ui::*;
246}
247
248pub mod inventory {
251 pub use yog_inventory::*;
252}