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 (name, ptr) in $crate::__yog_export_registry().lock().unwrap().iter() {
76 registry.interop().export(name, *ptr as *const ::std::os::raw::c_void);
77 }
78 }));
79 if outcome.is_err() {
80 $crate::error!("mod {} panicked during register", ::core::stringify!($mod_ty));
81 }
82 }
83 };
84}
85
86#[doc(hidden)]
90pub fn __set_current_mod_id(id: &str) {
91 CURRENT_MOD_ID.with(|cell| cell.replace(Some(id.to_string())));
92}
93
94#[doc(hidden)]
96pub fn __current_mod_id() -> Option<String> {
97 CURRENT_MOD_ID.with(|cell| cell.borrow().clone())
98}
99
100std::thread_local! {
101 static CURRENT_MOD_ID: std::cell::RefCell<Option<String>> = std::cell::RefCell::new(None);
102}
103
104#[doc(hidden)]
109pub fn __yog_export_registry() -> &'static std::sync::Mutex<Vec<(&'static str, usize)>> {
110 static REG: std::sync::LazyLock<std::sync::Mutex<Vec<(&'static str, usize)>>> =
111 std::sync::LazyLock::new(|| std::sync::Mutex::new(Vec::new()));
112 ®
113}
114
115pub use yog_command::CommandContext;
116pub use yog_core::{BlockPos, Server};
117pub use yog_event::{
118 AdvancementEvent, AttackEntityEvent, BlockBreakEvent, ChatEvent, ClientTickEvent,
119 ContainerCloseEvent, ContainerOpenEvent, CraftEvent, EntityDamageEvent, EntityDeathEvent,
120 EntityInteractEvent, EntitySpawnEvent, EventPhase, ExplosionEvent,
121 ItemPickupEvent, KeyPressEvent, PlaceBlockEvent, PlayerDeathEvent, PlayerJoinEvent,
122 PlayerLeaveEvent, PlayerMoveEvent, PlayerRespawnEvent, ProjectileHitEvent, ScreenEvent,
123 UseBlockEvent, UseItemEvent,
124};
125pub use yog_entity::Entity;
126pub use yog_network::{Packet, PacketEvent, PacketField};
127#[doc(inline)]
128pub use yog_network::packet;
129pub use yog_player::Player;
130pub use yog_registry::{BlockDef, FoodDef, FurnaceRecipe, ItemDef, ShapedRecipe, ShapelessRecipe, BookRecipe, ItemModifier, AdvancementReward, StartupGrant};
131pub use yog_config::Config;
132pub use yog_storage::{Storage, StorageScope, Value};
133pub use yog_world::World;
134pub use yog_book::{Book, BookCategory, BookEntry, BookPage, BookMacro, BookRegistry};
135pub use yog_book::{BookRenderer, BookFontRegistry};
136pub use yog_book::{text_page, text_page_titled, spotlight_page, crafting_page, smelting_page, image_page, entity_page, relations_page, pattern_page};
137pub use yog_ui::{UiRoot, LayoutNode, Rect, widget, Align, FlexDir, Dock, FocusStyle};
138pub use yog_inventory::{InventoryDef, SlotLayout};
139
140pub use yog_logging::{error, info, warn};
142
143pub mod core {
145 pub use yog_core::*;
146}
147
148pub mod event {
150 pub use yog_event::*;
151}
152
153pub mod world {
155 pub use yog_world::*;
156}
157
158pub mod entity {
160 pub use yog_entity::*;
161}
162
163pub mod player {
165 pub use yog_player::*;
166}
167
168pub mod content {
170 pub use yog_registry::*;
171}
172
173pub mod network {
175 pub use yog_network::*;
176}
177
178pub mod command {
180 pub use yog_command::*;
181}
182
183pub mod storage {
185 pub use yog_storage::*;
186}
187
188pub mod config {
190 pub use yog_config::*;
191}
192
193pub mod book {
195 pub use yog_book::*;
196}
197
198pub mod ui {
200 pub use yog_ui::*;
201}
202
203pub mod inventory {
206 pub use yog_inventory::*;
207}