• Chào bạn, hãy đăng ký hoặc đăng nhập để tham gia cùng bọn mình và sử dụng được đầy đủ chức năng của diễn đàn :).
anhcraft

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

anhcraft

Thành viên BQT
DEVELOPER
THÀNH VIÊN
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%

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 :((
 
.....................................................
 
Similar content Most view Xem thêm
Back
Top Bottom