• Trong thời gian này, bạn không thể tạo bài mới, đăng comment, hay tạo tài nguyên mới để diễn đàn dọn dẹp nội dung.
    Diễn đàn sẽ sớm mở trở lại, chi tiết hãy theo dõi tại Discord
anhcraft

Hướng dẫn Animation cho thanh exp khi giữ shift

  • Người tạo chủ đề Người tạo chủ đề anhcraft
  • Ngày gửi Ngày gửi
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%

omowpAv.gif



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");
    }
}
 
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%

omowpAv.gif



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");
    }
}
Thím có nhận đệ tử không :((
 
Nội dung tương tự Xem nhiều nhất Xem thêm

Thống kê nội dung

Tạo
anhcraft,
Trả lời lần cuối từ
Siri Professor,
Trả lời
7
Lượt xem
1,464
Quay lại
Trên cùng