@EventHandler
public void onPlayerPlace(BlockPlaceEvent e) {
if(e.isCancelled()) {
return;
}
List<String> meta = e.getItemInHand().getItemMeta().getLore();
for (String i : meta) {
if(i.toLowerCase().contains("vật phẩm này không thể đặt")) {
e.setCancelled(true);
}
}
}
}
Hoặc có plugin nào mà có lore:blabla thì item đó sẽ không đặt được xuống đất
cho xin luôn chứ code mệt
Hầu hết các thanh niên code hiện nay đều mắc 1 lỗi vô cùng đơn giản là getItemMeta nhưng không check null, Item mà không có tên (tên mặc định của minecraft), không lore, không enchant thì khi getItemMeta 100% sẽ get null, tức là không có ItemMeta.
Giải pháp:
+ Đầu tiên khai var ItemStack, sau đó check ItemStack không có ItemMeta thì return
Mã:
ItemStack i = e.getItemInHand();
if (!i.hasItemMeta()) return;
+ Sau khi đã vượt khỏi bài kiểm tra có ItemMeta rồi (có 1 trong 3 thứ: tên item, lore, enchant) thì kiểm tra tiếp ItemMeta có lore hay không, không có thì return
Mã:
ItemMeta im = i.getItemMeta();
if (!im.hasLore()) return;
+ Vượt được bài kiểm tra lore, thì đến lúc kiểm tra yêu cầu cuối cùng:
+ Có 2 kiểu kiểm tra lore ở đây, loại 1 là trong dòng lore có chữ "abc", loại 2 là dòng lore là "abc" (phân biệt contains (1) và equals (2) cho rõ), theo như thấy ở #1 thì
code nên chạy kiểu 2
Tối ưu:
+ Loại 1 lag hơn vì phải kiểm tra từng dòng lore, ít không ít nhưng nếu chạy 100, 200, 500 cái cùng lúc thì có thể gây lag tps
+ Loại 2 KHÔNG LAG
Dễ nhận dạng:
+ Loại 1 dễ nhận dạng hơn vì có var riêng 1 dòng lore rồi, có thể toLowerCase (chữ in hoa -> thường), stripColor (xóa hết code màu), ..., dễ trùng với kết quả kiểm tra hơn VD: Đi học thằng anh sinh đôi bảo thằng em điểm danh hộ, ông thầy thấy giống thằng anh nên cho qua.
+ Loại 2 khó nhận dạng hơn, bắt buộc lore cần kiểm tra phải GIỐNG HOÀN TOÀN lore trong list VD: Đăng nhập tài khoản, yêu cầu mật khẩu mà bạn nhập phải GIỐNG HOÀN TOÀN mật khẩu đã đăng ký
Mã:
List<String lorelist = im.getLore();
if (lorelist.contains(<Dòng lore chính xác từng chi tiết io>)) {
e.setCancelled(true);
}
Bổ sung thêm:
thêm (ignoreCancelled=true) ở phía sau @EventHandler thì nó sẽ tự động return nếu event bị cancel (không catch event bị cancel)
Mã:
@EventHandler(ignoreCancelled=true)
Code giống như đi thi vậy, không làm bài thi ai cho đậu ?
Hầu hết các thanh niên code hiện nay đều mắc 1 lỗi vô cùng đơn giản là getItemMeta nhưng không check null, Item mà không có tên (tên mặc định của minecraft), không lore, không enchant thì khi getItemMeta 100% sẽ get null, tức là không có ItemMeta.
Giải pháp:
+ Đầu tiên khai var ItemStack, sau đó check ItemStack không có ItemMeta thì return
Mã:
ItemStack i = e.getItemInHand();
if (!i.hasItemMeta()) return;
+ Sau khi đã vượt khỏi bài kiểm tra có ItemMeta rồi (có 1 trong 3 thứ: tên item, lore, enchant) thì kiểm tra tiếp ItemMeta có lore hay không, không có thì return
Mã:
ItemMeta im = i.getItemMeta();
if (!im.hasLore()) return;
+ Vượt được bài kiểm tra lore, thì đến lúc kiểm tra yêu cầu cuối cùng:
+ Có 2 kiểu kiểm tra lore ở đây, loại 1 là trong dòng lore có chữ "abc", loại 2 là dòng lore là "abc" (phân biệt contains (1) và equals (2) cho rõ), theo như thấy ở #1 thì
code nên chạy kiểu 2
Tối ưu:
+ Loại 1 lag hơn vì phải kiểm tra từng dòng lore, ít không ít nhưng nếu chạy 100, 200, 500 cái cùng lúc thì có thể gây lag tps
+ Loại 2 KHÔNG LAG
Dễ nhận dạng:
+ Loại 1 dễ nhận dạng hơn vì có var riêng 1 dòng lore rồi, có thể toLowerCase (chữ in hoa -> thường), stripColor (xóa hết code màu), ..., dễ trùng với kết quả kiểm tra hơn VD: Đi học thằng anh sinh đôi bảo thằng em điểm danh hộ, ông thầy thấy giống thằng anh nên cho qua.
+ Loại 2 khó nhận dạng hơn, bắt buộc lore cần kiểm tra phải GIỐNG HOÀN TOÀN lore trong list VD: Đăng nhập tài khoản, yêu cầu mật khẩu mà bạn nhập phải GIỐNG HOÀN TOÀN mật khẩu đã đăng ký
Mã:
List<String lorelist = im.getLore();
if (lorelist.contains(<Dòng lore chính xác từng chi tiết io>)) {
e.setCancelled(true);
}
Bổ sung thêm:
thêm (ignoreCancelled=true) ở phía sau @EventHandler thì nó sẽ tự động return nếu event bị cancel (không catch event bị cancel)
Mã:
@EventHandler(ignoreCancelled=true)
Code giống như đi thi vậy, không làm bài thi ai cho đậu ?
Hầu hết các thanh niên code hiện nay đều mắc 1 lỗi vô cùng đơn giản là getItemMeta nhưng không check null, Item mà không có tên (tên mặc định của minecraft), không lore, không enchant thì khi getItemMeta 100% sẽ get null, tức là không có ItemMeta.
Giải pháp:
+ Đầu tiên khai var ItemStack, sau đó check ItemStack không có ItemMeta thì return
Mã:
ItemStack i = e.getItemInHand();
if (!i.hasItemMeta()) return;
+ Sau khi đã vượt khỏi bài kiểm tra có ItemMeta rồi (có 1 trong 3 thứ: tên item, lore, enchant) thì kiểm tra tiếp ItemMeta có lore hay không, không có thì return
Mã:
ItemMeta im = i.getItemMeta();
if (!im.hasLore()) return;
+ Vượt được bài kiểm tra lore, thì đến lúc kiểm tra yêu cầu cuối cùng:
+ Có 2 kiểu kiểm tra lore ở đây, loại 1 là trong dòng lore có chữ "abc", loại 2 là dòng lore là "abc" (phân biệt contains (1) và equals (2) cho rõ), theo như thấy ở #1 thì
code nên chạy kiểu 2
Tối ưu:
+ Loại 1 lag hơn vì phải kiểm tra từng dòng lore, ít không ít nhưng nếu chạy 100, 200, 500 cái cùng lúc thì có thể gây lag tps
+ Loại 2 KHÔNG LAG
Dễ nhận dạng:
+ Loại 1 dễ nhận dạng hơn vì có var riêng 1 dòng lore rồi, có thể toLowerCase (chữ in hoa -> thường), stripColor (xóa hết code màu), ..., dễ trùng với kết quả kiểm tra hơn VD: Đi học thằng anh sinh đôi bảo thằng em điểm danh hộ, ông thầy thấy giống thằng anh nên cho qua.
+ Loại 2 khó nhận dạng hơn, bắt buộc lore cần kiểm tra phải GIỐNG HOÀN TOÀN lore trong list VD: Đăng nhập tài khoản, yêu cầu mật khẩu mà bạn nhập phải GIỐNG HOÀN TOÀN mật khẩu đã đăng ký
Mã:
List<String lorelist = im.getLore();
if (lorelist.contains(<Dòng lore chính xác từng chi tiết io>)) {
e.setCancelled(true);
}
Bổ sung thêm:
thêm (ignoreCancelled=true) ở phía sau @EventHandler thì nó sẽ tự động return nếu event bị cancel (không catch event bị cancel)
Mã:
@EventHandler(ignoreCancelled=true)
Code giống như đi thi vậy, không làm bài thi ai cho đậu ?