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
21#[doc(hidden)]
22pub use std::os::raw::c_void as __c_void;
23
24#[macro_export]
37macro_rules! export_mod {
38 ($mod_ty:ty) => {
39 #[no_mangle]
40 pub extern "C" fn yog_abi_version() -> u32 {
41 $crate::ABI_VERSION
42 }
43
44 #[no_mangle]
45 pub unsafe extern "C" fn yog_mod_register(
46 api: *const $crate::YogApi,
47 mod_id_ptr: *const ::std::os::raw::c_char,
48 ) {
49 let mod_id: &str = if mod_id_ptr.is_null() {
51 "unknown"
52 } else {
53 match ::std::ffi::CStr::from_ptr(mod_id_ptr).to_str() {
54 Ok(s) => s,
55 Err(_) => "unknown",
56 }
57 };
58 $crate::__set_current_mod_id(mod_id);
60
61 let outcome = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| {
64 let mut registry = unsafe { $crate::Registry::from_raw(api) };
67 <$mod_ty as $crate::Mod>::register(&mut registry);
68
69 for (name, ptr) in $crate::__yog_export_registry().lock().unwrap().iter() {
71 registry.interop().export(name, *ptr as *const ::std::os::raw::c_void);
72 }
73 }));
74 if outcome.is_err() {
75 $crate::error!("mod {} panicked during register", ::core::stringify!($mod_ty));
76 }
77 }
78 };
79}
80
81#[doc(hidden)]
85pub fn __set_current_mod_id(id: &str) {
86 CURRENT_MOD_ID.with(|cell| cell.replace(Some(id.to_string())));
87}
88
89#[doc(hidden)]
91pub fn __current_mod_id() -> Option<String> {
92 CURRENT_MOD_ID.with(|cell| cell.borrow().clone())
93}
94
95std::thread_local! {
96 static CURRENT_MOD_ID: std::cell::RefCell<Option<String>> = std::cell::RefCell::new(None);
97}
98
99#[doc(hidden)]
104pub fn __yog_export_registry() -> &'static std::sync::Mutex<Vec<(&'static str, usize)>> {
105 static REG: std::sync::LazyLock<std::sync::Mutex<Vec<(&'static str, usize)>>> =
106 std::sync::LazyLock::new(|| std::sync::Mutex::new(Vec::new()));
107 ®
108}
109
110pub use yog_command::CommandContext;
111pub use yog_core::{BlockPos, Server};
112pub use yog_event::{
113 AdvancementEvent, AttackEntityEvent, BlockBreakEvent, ChatEvent, ClientTickEvent,
114 ContainerCloseEvent, ContainerOpenEvent, CraftEvent, EntityDamageEvent, EntityDeathEvent,
115 EntityInteractEvent, EntitySpawnEvent, EventPhase, ExplosionEvent,
116 ItemPickupEvent, KeyPressEvent, PlaceBlockEvent, PlayerDeathEvent, PlayerJoinEvent,
117 PlayerLeaveEvent, PlayerMoveEvent, PlayerRespawnEvent, ProjectileHitEvent, ScreenEvent,
118 UseBlockEvent, UseItemEvent,
119};
120pub use yog_entity::Entity;
121pub use yog_network::{Packet, PacketEvent, PacketField};
122#[doc(inline)]
123pub use yog_network::packet;
124pub use yog_player::Player;
125pub use yog_registry::{BlockDef, FoodDef, FurnaceRecipe, ItemDef, ShapedRecipe, ShapelessRecipe, BookRecipe, ItemModifier, AdvancementReward, StartupGrant};
126pub use yog_config::Config;
127pub use yog_storage::{Storage, StorageScope, Value};
128pub use yog_world::World;
129pub use yog_book::{Book, BookCategory, BookEntry, BookPage, BookMacro, BookRegistry};
130pub use yog_book::{BookRenderer, BookFontRegistry};
131pub use yog_book::{text_page, text_page_titled, spotlight_page, crafting_page, smelting_page, image_page, entity_page, relations_page, pattern_page};
132pub use yog_ui::{UiRoot, LayoutNode, Rect, widget, Align, FlexDir, Dock, FocusStyle};
133pub use yog_inventory::{InventoryDef, SlotLayout};
134
135pub use yog_logging::{error, info, warn};
137
138pub mod core {
140 pub use yog_core::*;
141}
142
143pub mod event {
145 pub use yog_event::*;
146}
147
148pub mod world {
150 pub use yog_world::*;
151}
152
153pub mod entity {
155 pub use yog_entity::*;
156}
157
158pub mod player {
160 pub use yog_player::*;
161}
162
163pub mod content {
165 pub use yog_registry::*;
166}
167
168pub mod network {
170 pub use yog_network::*;
171}
172
173pub mod command {
175 pub use yog_command::*;
176}
177
178pub mod storage {
180 pub use yog_storage::*;
181}
182
183pub mod config {
185 pub use yog_config::*;
186}
187
188pub mod book {
190 pub use yog_book::*;
191}
192
193pub mod ui {
195 pub use yog_ui::*;
196}
197
198pub mod inventory {
201 pub use yog_inventory::*;
202}