- Tham gia
- 18/09/2016
- Bài viết
- 3,165
Đây là code Killmark (DoubleKills,..vv) dành cho ai chưa biết 
Cách hoạt động:
- Sự kiện: Xảy ra khi người chơi giết người chơi
- Lưu trữ lượt giết của người giết trong một hashmap
- Boardcast (hoặc title,..) khi đạt First kill, DoubleKills, TripleKills,..
- Gửi yêu cầu reset sau ... giây
+ Số lần giết gửi kèm khi gọi hàm resetKills đúng bằng với lượt kills trong HashMap ta sẽ biết rằng từ lúc gọi hàm này đến khi scheduler xong người đó vẫn chưa có lượt giết nào mới cả, vì thế ta sẽ reset lượt kills
+ Số lần giết gửi kèm khi gọi hàm resetKills khác với lượt kills trong HashMap ta sẽ biết rằng từ lúc gọi hàm này đến khi scheduler xong người đó đã giết thêm một lượt nữa, vì thế ta sẽ ko reset
* Code dey, nhớ thay chỗ mình in đậm

Cách hoạt động:
- Sự kiện: Xảy ra khi người chơi giết người chơi

- Lưu trữ lượt giết của người giết trong một hashmap
- Boardcast (hoặc title,..) khi đạt First kill, DoubleKills, TripleKills,..
- Gửi yêu cầu reset sau ... giây
+ Số lần giết gửi kèm khi gọi hàm resetKills đúng bằng với lượt kills trong HashMap ta sẽ biết rằng từ lúc gọi hàm này đến khi scheduler xong người đó vẫn chưa có lượt giết nào mới cả, vì thế ta sẽ reset lượt kills

+ Số lần giết gửi kèm khi gọi hàm resetKills khác với lượt kills trong HashMap ta sẽ biết rằng từ lúc gọi hàm này đến khi scheduler xong người đó đã giết thêm một lượt nữa, vì thế ta sẽ ko reset

* Code dey, nhớ thay chỗ mình in đậm
Mã:
public class Kills implements Listener {
// thời gian reset lại lượt giết (tính theo giây)
private int reset_time = 2;
// hashmap chứa người giết & số lần giết
private HashMap<Player, Integer> kills = new HashMap<>();
// hàm reset lại kills
private void resetKills(Player p, int currentKills){
[INDENT]new BukkitRunnable() {
@Override
public void run() {
// nếu số lần giết hiện tại đúng bằng lượt giết khi request
// vì trong khi scheduler, rất có thể người chơi này đã kills thêm 1 lần nữa, vì thế ta không thể reset
if(kills.get(p) == currentKills){
kills.put(p, 0);
}
}
}.runTaskLaterAsynchronously(this, reset_time * 20);[/INDENT]
}
// tăng kills cho người chơi
private void newKill(Player p){
if(kills.containsKey(p)){
kills.put(p, kills.get(p)+1);
} else {
kills.put(p, 1);
}
}
@EventHandler
public void damage(EntityDamageByEntityEvent ev){
// kiểm tra entity giết & entity tạo ra sát thương đều là Player
if(ev.getDamager() instanceof Player && ev.getEntity() instanceof Player) {
Player a = (Player) ev.getDamager();
Player b = (Player) ev.getEntity();
// máu của người nhận sát thương (sau khi đã nhận damage) bé hơn 0 (tức là bị chết)
if(b.getHealth()-ev.getDamage() < 1) {
// tăng lượt giết người
newKill(a);
// lấy lượt giết người hiện tại
int c = kills.get(a);
if(c == 1) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt First Kills");
} else if(c == 2) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt Double Kills");
} else if(c == 3) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt Triple Kills");
} else if(c == 4) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt Quadra Kills");
} else if(c == 5) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt Penta Kills");
} else if(c == 6) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt Unstopvable");
} else if(c == 7) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt Monster Kills");
} else if(c == 8) {
Bukkit.getServer().broadcastMessage("⚙ " + a.getName() + " đã đạt Rampage");
}
// gửi yêu cầu reset
resetKills(a, c);
}
}
}
}
Sửa lần cuối:







