- Tham gia
- 18/09/2016
- Bài viết
- 3,165
Lấy ý tưởng từ mienstrike (nạp đạn thì có animation ở thanh exp).
Nay share ae code tạo animation đó khi giữ shift liên tục
Đã test, hoạt động 100%
Lưu ý: tốc độ càng nhanh/thời gian càng lâu thì càng lag. Còn tốc độ chậm thì sẽ ko mượt cho lắm :/
Nay share ae code tạo animation đó khi giữ shift liên tục

Đã test, hoạt động 100%
Lưu ý: tốc độ càng nhanh/thời gian càng lâu thì càng lag. Còn tốc độ chậm thì sẽ ko mượt cho lắm :/
Mã:
package org.anhcraft.sneakexpbar;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
public final class SneakExpBar extends JavaPlugin implements Listener {
// đây là biến chứa các tác vụ đang hoạt động
private static HashMap<UUID, List<BukkitRunnable>> tasks = new HashMap<>();
// đây là thời gian mà người chơi cần giữ shift liên tục
private static float TIME = 10;
// đây là tốc độ của thanh kinh nghiệm
private static float SPEED = 5;
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
}
@Override
public void onDisable() {
}
/*
Khi người chơi sneak mà chưa có tác vụ thực thi -> bắt đầu
Khi người chơi không sneak mà tác vụ đã thực thi -> dừng lại
*/
@EventHandler
public void sneak(PlayerToggleSneakEvent event){
if(event.isSneaking()){
if(!tasks.containsKey(event.getPlayer().getUniqueId())){
start(event.getPlayer());
}
} else {
if(tasks.containsKey(event.getPlayer().getUniqueId())){
stop(event.getPlayer());
}
}
}
/*
Khi người chơi thoát thì dừng
*/
@EventHandler
public void quit(PlayerQuitEvent event){
if(tasks.containsKey(event.getPlayer().getUniqueId())){
stop(event.getPlayer());
}
}
// hàm để dừng
private void stop(Player player) {
// dừng mọi tác vụ
for(BukkitRunnable t : tasks.get(player.getUniqueId())){
t.cancel();
}
// xoá khỏi map
tasks.remove(player.getUniqueId());
player.sendMessage("đã dừng");
// trả về exp cũ
player.setExp(0);
}
// hàm để bắt đầu
private void start(Player player) {
List<BukkitRunnable> tks = new ArrayList<>();
int i = 0;
/// tăng thời gian để có thể thấy thanh exp lấp đầy hoàn toàn
while(i < TIME + 1){
int i_ = i;
// nếu đã hết thời gian
if(i_ == TIME){
BukkitRunnable t = new BukkitRunnable() {
@Override
public void run() {
tasks.remove(player.getUniqueId());
// trả thanh exp về như cũ
player.setExp(0);
player.sendMessage("thành công");
}
};
// có thể dùng async để giảm lag
t.runTaskLaterAsynchronously(this, i_ * 20);
tks.add(t);
} else {
// phải bắt đầu bằng 1
// vì lúc sau "không thể chia cho 0"
int s = 1;
while(s <= SPEED) {
int s_ = s;
BukkitRunnable t = new BukkitRunnable() {
@Override
public void run() {
// exp giới hạn là 1
// ta sẽ chia nó thành từng phần rồi dựa vào thời gian hiện tại mà lấy đầy thanh exp
player.setExp((1f / TIME * (i_ + 1)) / s_);
}
};
// có thể dùng async để giảm lag
t.runTaskLaterAsynchronously(this, i / s * 20);
tks.add(t);
s++;
}
}
i++;
}
// cho dữ liệu vào map
tasks.put(player.getUniqueId(), tks);
player.sendMessage("đã bật, hãy giữ đủ "+TIME+" giây");
}
}





