Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

System pod asysty


Rekomendowane odpowiedzi

Opublikowano

Witam, mam problem, ponieważ mój technik nie może sobie poradzić z systemem asyst. Czy byłby ktoś w stanie utworzyć system dodawania asyst przy śmierci gracza? Chodzi tylko o wzór jak kod ma wyglądać, ponieważ trochę to jest skomplikowane...

 

Naszym pomysłem było coś takiego:

 

Dodanie osoby która została zaatakowana do HashMapy i przypisywanie jej wartości (Atakujący1, Atakujący2, Atakujący3) następnie w nowej HashMapie Kluczami byli wszyscy atakujący a ich wartościami był czas ostatniego uderzenia, gdy od ostatniego ataku minęło 10 sec to usuwało klucz z obydwu  HashMap inaczej mówiąc usuwało asyste i info o tym ze on atakowal tamtego gracza. Gdy osoba zaatakowana zginęła, to miałby zostać wyświetlony komunikat zabity przez <lastKiller> Asysty: (tutaj lista kluczy które zostały w tym drugim HashMap)

 

Tak wgl. to chodzi tutaj o plugin bukkit, lecz w dziale minecraft nie ma sensu tego tematu umieszczać, gdyż temat głębiej w samym programowaniu leży.

 

 

Opublikowano

Na bukkcie się nie znam dlatego zrobiłem własną klasę Player.

Kod jest pisany na szybko i można dużo w nim zmienić. Chcę pokazać jak to mniej więcej zrobić. Zastąp listy czymś innym, bo są one niekompatybilne z wieloma wątkami.

Pewnie można sporo ten kod zoptymalizować, ale jeszcze raz napiszę, że zrobiłem go tylko po to, żebyś zobaczył w jaki sposób można to zrealizować.

public class Player {

    private final List<Player> attackers = new ArrayList<>();
    
    public void onAttack(Player attacker) {
        attackers.add(attacker);
        Timer timer = new Timer();
        timer.schedule(new MyTimerTask(this, attacker), 0, 10);
    }
    
    public void attackerTimeIsUp(Player player) {
        attackers.remove(player);
    }
    
    public void onPlayerDead() {
        List<Player> assists = attackers;
    }
    
    public class MyTimerTask extends TimerTask {
        private final Player attacker;
        private final Player victim;
        
        public MyTimerTask(Player victim, Player attacker) {
            this.victim = victim;
            this.attacker = attacker;
        }
        
        @Override
        public void run() {
            victim.attackerTimeIsUp(attacker);
        }
    }
}
Opublikowano

Teraz w jednym wątku. Tak jak wyżej- kod tylko do pokazania co miałem na myśli.

public class Plugin {
    private final Map<Player, Attacker> attackers = new HashMap<>();
    
    private static final int assistTime = 10;
    
    public void onAttack(Player victim, Player attacker) {
        attackers.put(victim, new Attacker(attacker, System.currentTimeMillis()));
    }
    
    public void onPlayerDead() {
        List<Player> assists =  new ArrayList<>();
        
        for (Map.Entry<Player, Attacker> entry : attackers.entrySet()) {
            assists.add(entry.getValue().getAttacker());
        }
    }
    
    public void onTick() {
        List<Player> toRemove =  new ArrayList<>();
        
        for (Map.Entry<Player, Attacker> entry : attackers.entrySet()) {
            if(entry.getValue().isAttackExpired()) {
                toRemove.add(entry.getKey());
            }
        }
        
        for(Player player : toRemove) {
            attackers.remove(player);
        }
    }
    
    public class Attacker {
        private final Player player;
        private final long attackTime;
        
        public Attacker(Player attacker, long time) {
            player = attacker;
            attackTime = time;
        }
        
        public boolean isAttackExpired() {
            return (System.currentTimeMillis() - attackTime) > (assistTime * 1000);
        }
        
        public Player getAttacker() {
            return player;
        }
    }
    
    public class Player {
        
    }
}

To usuwanie z mapy można zmienić, ale jest późno i nie chce mi się już tego testować.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...