[GO] Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann

Ich habe den Produktionsprozess zuvor hochgeladen, aber er war hochgefahren, als ich alles gegeben habe, also werde ich ihn erneuern.

Entwicklungsumgebung

Die Sprache ist Java und der Editor verwendet IntelliJ IDEA. Die Version von Minecraft ist 1.13.2. Die Art des Plugins ist Zapfen.

Was können Sie mit diesem Plug-In tun?

Dieses Plug-In ist ein Plug-In, mit dem Sie das altmodische japanische Stück "Daruma-san ga Koro" spielen können, das wahrscheinlich jeder in Minecraft gemacht hat.

Über die Beschreibung und Funktion dieses Plug-Ins

Beschreibung dieses Plugins

――Wenn der echte Daruma-san fiel, gab es eine Dämonenrolle, aber dieses Plug-In hat keinen Dämon. Stattdessen gibt es ein ** Ziel **. "Daruma-san ist gefallen", was mit diesem Plug-in getan werden kann, ist, dass Daruma-san, während er fällt, dieses Ziel erreicht. ――Es gibt eine ** Wendung ** im "Daruma-san-Fall" dieses Plug-Ins. In diesem Plug-In ist eine Runde von dem Zeitpunkt an, an dem Sie mit "Daruma-san gefallen" fertig sind und beurteilen, ob es sich bewegt hat oder nicht, bis Sie mit dem nächsten "da" beginnen. Wenn Sie beispielsweise 3 Runden sagen, endet das Spiel, nachdem Sie "Daruma-san ist gefallen" gesagt und beurteilt haben, ob es sich bewegt hat oder nicht. Diese Anzahl von Runden kann auf Befehl innerhalb des Spiels eingestellt werden, so dass die Länge des Spiels vor Ort frei festgelegt werden kann. Eine Umdrehung dauert ungefähr 13 Sekunden (10 Sekunden, bis Sie mit "Daruma-san gefallen" fertig sind, 3 Sekunden für die Beurteilungszeit).

Funktionen dieses Plug-Ins

Alle folgenden Funktionen werden nur von Spielern aktiviert, die sich im Spiel befinden und als Teilnehmer anerkannt sind.

Derjenige, der es leicht macht zu verstehen, ob es sich um einen Teilnehmer handelt oder nicht

スクリーンショット 2019-07-18 14.35.14.png スクリーンショット 2019-07-18 14.35.23.png Zu Beginn des Spiels oder wenn Sie das Ziel erreichen, wird [Beobachten] oder [Teilnehmer] neben dem Namen in der Spielerliste angezeigt. Auf diese Weise kann der Administrator die Teilnehmer, Zuschauer, die getroffen haben usw. auf einen Schlag kennen.

Tor

2019-06-24_22.04.06.png Wenn Sie einen Steinknopf auf einen Goldblock legen, ist dies Ihr Ziel. Wenn es einen anderen Steinknopf als die Oberseite des Goldblocks gibt, ist dies kein Ziel. Wenn der Spieler fertig ist, wird der Spielmodus in den Zuschauermodus geändert und in den Zuschauermodus umgewandelt.

public void GoalEvent(PlayerInteractEvent event) {
        if (Daruma.check) {
            Player player = event.getPlayer();
            Block block = event.getClickedBlock();
            if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
                if ((block != null ? block.getType() : null) == Material.STONE_BUTTON) {
                    Location location = block.getLocation().clone();
                    location.add(0,-0.1,0);
                    if (player.getGameMode() == GameMode.ADVENTURE && Daruma.list.contains(player.getName()) && location.getBlock().getType().equals(Material.GOLD_BLOCK)) {
                        getServer().broadcastMessage(ChatColor.BLUE + player.getName() + ChatColor.WHITE + "Habe ein Ziel!");
                        player.setPlayerListName("["+ChatColor.BLUE+"Ziel erreicht"+ChatColor.WHITE+"]"+"["+ChatColor.RED+"Das Spiel anschauen"+ChatColor.WHITE+"]"+ChatColor.RED+player.getName());
                        if (player.hasMetadata(Events.DATA_KEY)) {
                            player.removeMetadata(Events.DATA_KEY, plugin);
                        }
                        getServer().broadcastMessage(clearTime(Daruma.time));
                        (player.getWorld()).playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 2, 1);
                        Daruma.Goallist.add(player.getName()+"<"+clearTime(Daruma.time)+ChatColor.WHITE+">");
                        player.setGameMode(GameMode.SPECTATOR);
                        Daruma.list.remove(player.getName());
                        if(Daruma.list.isEmpty()){
                            getServer().broadcastMessage("Das Spiel endet, weil alle Teilnehmer das Ziel erreicht haben.");
                            for (Player target : Bukkit.getOnlinePlayers()) {
                                if (target.getGameMode() == GameMode.ADVENTURE || target.getGameMode() == GameMode.SPECTATOR) {
                                    target.sendTitle(ChatColor.RED + "Fertig!", "", 10, 15, 10);
                                    target.teleport(target.getWorld().getSpawnLocation());
                                    target.setGameMode(GameMode.ADVENTURE);
                                    target.setPlayerListName(target.getName());
                                    target.setLevel(0);
                                }
                            }
                            Daruma.game=false;
                            Daruma.check=false;
                        }
                    }
                }
            }
        }
    }

Der Code sieht so aus. Wenn ein Teilnehmer mit einem Steinknopf auf einen Goldblock klickt, ändern Sie den Spielmodus, um die Löschzeit anzuzeigen, und registrieren Sie gleichzeitig die Löschzeit in der Rangliste und listen Sie den Spieler als Teilnehmer auf. Es soll aus der Spielerliste gelöscht und [Ziel] hinzugefügt werden. Wenn zu diesem Zeitpunkt alle Teilnehmer das Ziel erreicht haben, wird das Spiel automatisch beendet.

int min,sec;
        min = (time%3600)/60;
        sec = time%60;
        String clearTime;
        clearTime = ChatColor.GREEN+"Klare Zeit:"+min+"Protokoll"+sec+"Sekunden";
        return clearTime;

Die Löschzeit wird mit einem solchen Code berechnet.

Speicherpunkt

2019-06-24_22.04.19.png Wenn Sie einen Smaragdblock platzieren, wird dieser zu einem Sicherungspunkt. Da es sich um eine automatische Speicherfunktion handelt, wird sie automatisch gespeichert, sobald sie über den Smaragdblock fährt, der der Speicherpunkt ist. Wenn sie sich bewegt, während festgestellt wird, ob sie sich bewegt hat, wird sie nicht zum Startpunkt zurückgesetzt, sondern zum zuletzt übergebenen Speicherpunkt. Ich werde. Die Funktion zum automatischen Speichern verwendet Metadaten und das Speichern hat eine Abklingzeit von 5 Sekunden.


Player player = event.getPlayer();
            if (player.isOnGround()){
                Location location = event.getTo().clone();
                location.add(0, -0.1, 0);
                if (location.getBlock().getType().equals(Material.EMERALD_BLOCK) && Daruma.list.contains(player.getName())&&player.getLevel()<1) {
                    player.setLevel(5);
                    player.setMetadata(DATA_KEY, new FixedMetadataValue(plugin,player.getLocation().clone()));
                    player.sendMessage(ChatColor.AQUA + "Ich habe es gespeichert!");
                    player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_CHIME, 1, 24);
                    Timer timer = new Timer();
                    TimerTask task = new TimerTask() {
                        int i = 5;
                        @Override
                        public void run() {
                            if(i<1){
                                player.setLevel(0);
                                player.setExp(0);
                                timer.cancel();
                            }
                            player.setLevel(i);
                            i--;
                        }
                    };
                    timer.schedule(task,0,1000);
                }
            }

Der Code sieht so aus, als würde man das Ziel des Spielers ermitteln, den aktuellen Standort des Spielers in Metadaten aufzeichnen, wenn sich dort ein Smaragdblock befindet, und ihn dem Spieler geben. Wenn es unverändert bleibt, wird es kontinuierlich aktiviert. Daher haben wir eine Abklingzeit implementiert, um eine kontinuierliche Aktivierung zu verhindern.

Rangfolge

2019-06-24_13.48.11.png Wenn ein Spieler fertig ist, zeigt der Server die freie Zeit des Spielers an. Auch nach dem Ende des Spiels ist es möglich, die übersichtliche Zeitliste der Person anzuzeigen, die das Tor mit dem Befehl innerhalb des Spiels erzielt hat.

String string;
            if (!(Daruma.Goallist.isEmpty())) {
                for (int i = 1; i <= Daruma.Goallist.size(); i++) {
                    string = i + "Rang:" + Daruma.Goallist.get(i - 1);
                    getServer().broadcastMessage(string);
                }
            } else {
                getServer().broadcastMessage("Kein Spieler hat ein Tor erzielt.");
            }

Der Code sieht so aus. Wenn etwas in die Rangliste geschrieben ist, wird die Rangliste angezeigt. Wenn die Rangliste leer ist, wird die Rangliste nicht angezeigt.

Spielerei

Ich habe ein Gimmick gemacht, das aktiviert wird, wenn Sie darauf treten, indem Sie Speicherpunkte anwenden.

Sprungbrett

void jumpPad(PlayerMoveEvent event){
        if((Daruma.game)){
            Player player = event.getPlayer();
            if (player.isOnGround()){
                Location location = event.getTo().clone();
                location.add(0, -0.1, 0);
                if (location.getBlock().getType().equals(Material.REDSTONE_BLOCK) && Daruma.list.contains(player.getName())) {
                    player.sendMessage(ChatColor.AQUA+"Ich bin auf das Sprungbrett gestiegen!");
                    for(float o=0;o<360;o=(float)(o+0.5)){
                        (player.getWorld()).spawnParticle(Particle.CLOUD,(float) (location.getX()+Math.sin(Math.toRadians(o))*1), (float) (location.getY()), (float) (location.getZ()+Math.cos(Math.toRadians(o))*1), 1, 0, 0, 0, 0);
                    }
                    player.playSound(player.getLocation(), Sound.ITEM_FIRECHARGE_USE, 1, 1);
                    player.setVelocity(new Vector(0,1.75,0));
                }
            }
        }
    }

Ich habe ein Sprungbrett gemacht, das hochspringt, wenn Sie auf den Redstone-Block treten. Es macht keinen Spaß, einfach so zu springen, wie es ist, also benutze ich auch Spielgeräusche und spawne Partikel, um die Richtung hinzuzufügen.

Der Boden, auf den Sie nicht treten sollten

void dontstep(PlayerMoveEvent event){
        if((Daruma.game)){
            Player player = event.getPlayer();
            if (player.isOnGround()){
                Location location = event.getTo().clone();
                location.add(0, -0.1, 0);
                if (location.getBlock().getType().equals(Material.NETHER_WART_BLOCK) && Daruma.list.contains(player.getName())) {
                    (player.getWorld()).spawnParticle(Particle.FLAME, location.getX(), location.getY(), location.getZ(), 30, 0.35, 0.35, 0.35);
                    if (player.hasMetadata(DATA_KEY)) {
                        MetadataValue value = null;
                        List<MetadataValue> values = player.getMetadata(DATA_KEY);
                        for (MetadataValue v : values) {
                            if (Objects.requireNonNull(v.getOwningPlugin()).getName().equals(plugin.getName())) {
                                value = v;
                                break;
                            }
                        }
                        if (value == null) {
                            return;
                        }
                        Location location1 = (Location) value.value();
                        assert location1 != null;
                        player.teleport(location1);
                    } else {
                        player.teleport(Daruma.startpoint);
                    }
                    player.playSound(player.getLocation(), Sound.ENTITY_GHAST_HURT, 1, 1);
                }
            }
        }
    }

Wenn Sie auf den Netherwarzenblock treten, werden Sie zum Speicherpunkt oder zum Startpunkt gebracht. Dies hat auch eine Produktion, die sagt: "Funken werden von dem Punkt verstreut, an dem der Spieler landet." ~~ Als ich es tatsächlich versuchte, sah es aus wie ein Stein ● ~

Speedpad

void dashPad(PlayerMoveEvent event){
        if((Daruma.game)){
            Player player = event.getPlayer();
            if (player.isOnGround()){
                Location location = event.getTo().clone();
                location.add(0, -0.1, 0);
                if (location.getBlock().getType().equals(Material.DIAMOND_BLOCK) && Daruma.list.contains(player.getName())&&!(player.hasPotionEffect(PotionEffectType.SPEED))) {
                    player.sendMessage(ChatColor.AQUA+"Ich stieg auf das Armaturenbrett!");
                    player.playSound(player.getLocation(),Sound.BLOCK_BEACON_AMBIENT,1,1);
                    player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,30,3),true);
                }
            }
        }
    }

Ich habe ein Armaturenbrett gemacht, das für einen bestimmten Zeitraum beschleunigt, wenn Sie auf den Diamantblock treten. Der addPotionEffect erzeugt einen Trank-Effekt, der die Bewegungsgeschwindigkeit erhöht. ~~ Sag nicht, dass mir keine Produktion einfällt ~~

Langsames Pad

void slowPad(PlayerMoveEvent event){
        if((Daruma.game)){
            Player player = event.getPlayer();
            if (player.isOnGround()){
                Location location = event.getTo().clone();
                location.add(0, -0.1, 0);
                if (location.getBlock().getType().equals(Material.LAPIS_BLOCK) && Daruma.list.contains(player.getName())&&!(player.hasPotionEffect(PotionEffectType.SLOW))) {
                    player.playSound(player.getLocation(),Sound.ENTITY_SLIME_JUMP,1,1);
                    player.sendMessage(ChatColor.RED+"Ich stieg auf das langsame Pad!");
                    player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,80,3),true);
                }
            }
        }
    }

Ich habe ein langsames Pad erstellt, das sich für einen bestimmten Zeitraum verlangsamt, wenn Sie auf den Lapislazuri-Block treten. Der Mechanismus ist fast der gleiche wie beim Speedpad.

Blind Pad

void blindPad(PlayerMoveEvent event){
        if((Daruma.game)){
            Player player = event.getPlayer();
            if (player.isOnGround()){
                Location location = event.getTo().clone();
                location.add(0, -0.1, 0);
                if (location.getBlock().getType().equals(Material.COAL_BLOCK) && Daruma.list.contains(player.getName())&&!(player.hasPotionEffect(PotionEffectType.BLINDNESS))) {
                    player.playSound(player.getLocation(),Sound.ENTITY_SLIME_JUMP,1,1);
                    player.sendMessage(ChatColor.RED+"Ich bin auf das Blind Pad gestiegen!");
                    player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,80,255),true);
                }
            }
        }
    }

Ich habe einen Blindblock gemacht, der für eine bestimmte Zeit verschwindet, wenn Sie auf den Kohleblock treten. Der Mechanismus ist fast der gleiche wie beim Speedpad.

Schließlich

Es hat ungefähr ein halbes Jahr gedauert, bis es soweit war. Es ist ein schleimiger schwerwiegender Fehler, der beim Ausspucken endlich abgeschlossen ist. Ich bin also stolz auf dieses Plug-In. Ich verwende die Schlafmethode in einigen Teilen der Spielverarbeitung, aber wenn ich sie ohne nachzudenken verwende, wird das Spiel selbst gestoppt (da die gesamte Verarbeitung in einem Thread erfolgt), also die Timer-Klasse, damit das Spiel nicht stoppt Es war schwierig, so etwas wie zu benutzen. Es mag einen besseren Weg geben, aber ich habe ihn vorerst benutzt. Ich bin jedoch noch unreif und ich denke, es gibt noch einige Punkte, die verbessert werden können, deshalb möchte ich mich dort verbessern. Wenn es eine Stimme wie "Ich möchte, dass Sie sie verteilen" gibt, werde ich sie verteilen, nachdem ich Erklärungen wie dedizierte Befehle hinzugefügt habe. ~~ Ich würde mich freuen, wenn Sie es über Likes, Aktien, Twitter usw. verbreiten könnten. ~~ Vielen Dank, dass Sie so weit gelesen haben. Die Quelle ist hier.

Recommended Posts

Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Ich habe ein Plug-In "EZPrinter" erstellt, das Karten-PDF mit QGIS einfach ausgibt.
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Formatübersicht der Formate, die mit gensim serialisiert werden können
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Ich habe mit Python eine Lotterie gemacht.
Ich habe einen harten Pomodoro-Timer entwickelt, der mit CUI funktioniert
Ich habe mit Python einen Daemon erstellt
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Memo, mit dem ein Diagramm zum Plotten animiert wurde
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
〇✕ Ich habe ein Spiel gemacht
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Ich habe mit Sense HAT ein gefallenes Monospiel gemacht
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
Erstellt eine Web-App, die IT-Ereignisinformationen mit Vue und Flask abbildet
[Python] Ich habe eine Funktion erstellt, die AES entschlüsselt und entschlüsselt, indem ich sie einfach mit pycrypto geworfen habe.
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe einen Blackjack mit Python gemacht!
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
unixtime ← → Ich habe versucht, eine Klasse zu erstellen, die die Datums- / Uhrzeitkonvertierung problemlos durchführt