Skip to content

Commit 4053563

Browse files
committed
UwU ta' gonico
1 parent fe9aee0 commit 4053563

File tree

3 files changed

+90
-71
lines changed

3 files changed

+90
-71
lines changed

rust/macros/src/bind.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,18 @@ fn bind_def_class(
214214
})
215215
.collect_vec();
216216

217+
let constructor = quote_spanned! {class.span() =>
218+
#[allow(dead_code)]
219+
pub fn default<'local>(env: &mut ::jni::JNIEnv<'local>) -> Self {
220+
let instance: ::rosttasse::prelude::Instance = env
221+
.new_object(<Self as ::rosttasse::prelude::JSignature>::CLASS, "()V", &[])
222+
.unwrap()
223+
.into();
224+
225+
<Self as ::rosttasse::prelude::JavaClass>::from_raw(instance)
226+
}
227+
};
228+
217229
let sig = generate_signature(&class, package);
218230

219231
let other_fields = props
@@ -238,6 +250,7 @@ fn bind_def_class(
238250
);
239251

240252
quote! {
253+
#[derive(Clone, Copy)]
241254
pub struct #class {
242255
raw: ::rosttasse::prelude::Instance,
243256

@@ -251,6 +264,8 @@ fn bind_def_class(
251264
impl #class {
252265
#(#static_props)*
253266

267+
#constructor
268+
254269
#(#methods)*
255270
}
256271
}
@@ -351,10 +366,13 @@ struct MethodInfo {
351366
def_args: proc_macro2::TokenStream,
352367
extern_name: proc_macro2::TokenStream,
353368
get_sig_args: proc_macro2::TokenStream,
369+
is_contructor: bool,
354370
ret: proc_macro2::TokenStream,
355371
}
356372

357373
fn prepare_method(method: &BindFieldMethod) -> MethodInfo {
374+
let is_contructor = get_attribute(&"constructor", &method.attributes).is_some();
375+
358376
let extern_name = method.name.to_string().as_str().to_camel_lowercase();
359377
let extern_name = quote!(#extern_name);
360378

@@ -391,8 +409,11 @@ fn prepare_method(method: &BindFieldMethod) -> MethodInfo {
391409
syn::ReturnType::Type(_, ty) => quote_spanned! {ty.span() => #ty},
392410
};
393411

394-
let out_ty_sig =
395-
quote_spanned! {out_ty.span() => <#out_ty as ::rosttasse::prelude::JSignature>::sig()};
412+
let out_ty_sig = if is_contructor {
413+
quote_spanned! {out_ty.span() => "V"}
414+
} else {
415+
quote_spanned! {out_ty.span() => &<#out_ty as ::rosttasse::prelude::JSignature>::sig()}
416+
};
396417
let get_sig_args = quote! {
397418
#[allow(unused_mut)]
398419
let mut sig_args = String::from("(");
@@ -418,6 +439,7 @@ fn prepare_method(method: &BindFieldMethod) -> MethodInfo {
418439
def_args,
419440
extern_name,
420441
get_sig_args,
442+
is_contructor,
421443
ret,
422444
}
423445
}

rust/mod/src/java/mc/item.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::java::mc::registry::RegistryKey;
2-
use crate::{RustBridge, SerjioItem};
2+
use crate::RustBridge;
33
use jni::JNIEnv;
44
use rosttasse::prelude::Function;
55
use rosttasse::JSignature;
@@ -27,12 +27,12 @@ rosttasse::bind! {
2727
}
2828

2929
impl Items {
30-
pub fn register<'local>(
30+
pub fn register<'local, ITEM: JSignature>(
3131
key: RegistryKey,
3232
settings: ItemSettings,
3333
env: &mut JNIEnv<'local>,
3434
) -> Item {
35-
let factory = RustBridge::item_factory(SerjioItem::class(env), env);
35+
let factory = RustBridge::item_factory(ITEM::class(env), env);
3636

3737
Self::register_raw(key, factory, settings, env)
3838
}

rust/mod/src/lib.rs

Lines changed: 63 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
mod java;
2-
// mod mc;
3-
4-
// use java::mc::entity::passive::WolfEntity;
5-
// use java::mc::entity::player::PlayerEntity;
6-
// use java::mc::entity::EntityType;
7-
// use java::mc::text::Text;
8-
// use java::mc::util::{ActionResult, Hand};
9-
// use java::mc::world::World;
10-
use java::{mc::item::Item, Event};
11-
// use jni::JNIEnv;
12-
13-
// use jni::objects::JClass;
14-
// use mc::entity::passive::WolfEntity;
15-
// use mc::entity::player::PlayerEntity;
16-
// use mc::entity::EntityType;
17-
// use mc::util::{ActionResult, Hand};
18-
// use mc::world::World;
192

20-
// use rosttasse::conversion::IntoJValue;
3+
use java::{mc::item::Item, Event};
4+
use jni::objects::{JClass as JNIClass, JObject as JNIObject};
5+
use jni::JNIEnv;
6+
use rosttasse::prelude::IntoJValue as _;
217
use rosttasse::primitives::{Function, JClass};
8+
use rosttasse::JavaClass as _;
9+
10+
use crate::java::mc::entity::passive::WolfEntity;
11+
use crate::java::mc::entity::player::PlayerEntity;
12+
use crate::java::mc::entity::EntityType;
13+
use crate::java::mc::item::{ItemGroups, ItemSettings, Items};
14+
use crate::java::mc::registry::RegistryKeys;
15+
use crate::java::mc::text::Text;
16+
use crate::java::mc::util::{ActionResult, Hand};
17+
use crate::java::mc::world::World;
18+
use crate::java::ItemGroupEvents;
2219

2320
const MOD_ID: &str = "apikaprobe";
2421

@@ -72,51 +69,51 @@ rosttasse::bind! {
7269
// }
7370
// }
7471

75-
// #[no_mangle]
76-
// pub extern "system" fn Java_me_apika_apikaprobe_RustBridge_main<'local>(
77-
// mut env: JNIEnv<'local>,
78-
// _class: JClass<'local>,
79-
// ) {
80-
// let env = &mut env;
81-
//
82-
// let settings = ItemSettings::new(env);
83-
// let item = register_item(env, "serjio", RegistryKeys::ITEM, settings);
84-
//
85-
// ItemGroupEvents::modify_entries_event(env, ItemGroups::REDSTONE).register(env, item);
86-
// }
87-
//
88-
// #[no_mangle]
89-
// pub extern "system" fn Java_me_apika_apikaprobe_SerjioItem_use<'local>(
90-
// mut env: JNIEnv<'local>,
91-
// _class: JClass<'local>,
92-
// world: JObject<'local>,
93-
// user: JObject<'local>,
94-
// hand: JObject<'local>,
95-
// ) -> JObject<'local> {
96-
// let env = &mut env;
97-
//
98-
// let world = World::from_instance(world.into());
99-
// let user = PlayerEntity::from_instance(user.into());
100-
// let _hand = Hand::from_instance(hand.into());
101-
//
102-
// // Ensure we don't spawn the lightning only on the client.
103-
// // This is to prevent desync.
104-
// if world.is_client.get(env) {
105-
// return ActionResult::PASS.get_raw(env).l().unwrap();
106-
// }
107-
//
108-
// let player_pos = user.get_block_pos(env).to_center_pos(env);
109-
// let pos = user
110-
// .get_rotation_vector(env)
111-
// .scale(env, 5.0)
112-
// .add_vec(env, player_pos);
113-
//
114-
// let wolf = WolfEntity::new(env, EntityType::WOLF, world);
115-
//
116-
// wolf.set_position(env, pos);
117-
// let name = Text::of(env, "Serjio".to_string());
118-
// wolf.set_custom_name(env, name);
119-
// world.spawn_entity(env, wolf.cast());
120-
//
121-
// ActionResult::SUCCESS.into_jvalue(env).l().unwrap()
122-
// }
72+
#[no_mangle]
73+
pub extern "system" fn Java_me_apika_apikaprobe_RustBridge_main<'local>(
74+
mut env: JNIEnv<'local>,
75+
_class: JNIClass<'local>,
76+
) {
77+
let env = &mut env;
78+
79+
let item =
80+
Items::register::<SerjioItem>(RegistryKeys::ITEM.get(env), ItemSettings::default(env), env);
81+
82+
ItemGroupEvents::modify_entries_event(ItemGroups::REDSTONE, env).register(item, env);
83+
}
84+
85+
#[no_mangle]
86+
pub extern "system" fn Java_me_apika_apikaprobe_SerjioItem_use<'local>(
87+
mut env: JNIEnv<'local>,
88+
_class: JNIClass<'local>,
89+
world: JNIObject<'local>,
90+
user: JNIObject<'local>,
91+
hand: JNIObject<'local>,
92+
) -> JNIObject<'local> {
93+
let env = &mut env;
94+
95+
let world = World::from_raw(world.into());
96+
let user = PlayerEntity::from_raw(user.into());
97+
let _hand = Hand::from_raw(hand.into());
98+
99+
// Ensure we don't spawn the lightning only on the client.
100+
// This is to prevent desync.
101+
if world.is_client.get(env) {
102+
return ActionResult::PASS.get_raw(env).l().unwrap();
103+
}
104+
105+
let player_pos = user.get_block_pos(env).to_center_pos(env);
106+
let pos = user
107+
.get_rotation_vector(env)
108+
.scale(5.0, env)
109+
.add_vec(player_pos, env);
110+
111+
let wolf = WolfEntity::new(EntityType::WOLF, world, env);
112+
113+
wolf.set_position(pos, env);
114+
let name = Text::of("Serjio".to_string(), env);
115+
wolf.set_custom_name(name, env);
116+
world.spawn_entity(wolf.cast(), env);
117+
118+
ActionResult::SUCCESS.into_jvalue(env).l().unwrap()
119+
}

0 commit comments

Comments
 (0)