Ich habe den Produktionsprozess zuvor hochgeladen, aber er war hochgefahren, als ich alles gegeben habe, also werde ich ihn erneuern.
Die Sprache ist Java und der Editor verwendet IntelliJ IDEA. Die Version von Minecraft ist 1.13.2. Die Art des Plugins ist Zapfen.
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.
――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).
Alle folgenden Funktionen werden nur von Spielern aktiviert, die sich im Spiel befinden und als Teilnehmer anerkannt sind.
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.
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.
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.
Ich habe ein Gimmick gemacht, das aktiviert wird, wenn Sie darauf treten, indem Sie Speicherpunkte anwenden.
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.
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 ● ~
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 ~~
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.
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.
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