SteamWar/MissileWars
Archiviert
13
0

Implement reset after win! #36

Zusammengeführt
YoyoNow hat 8 Commits von Arcade nach master 2021-10-27 20:44:29 +02:00 zusammengeführt
4 geänderte Dateien mit 129 neuen und 8 gelöschten Zeilen
Nur Änderungen aus Commit f014c83e99 werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -0,0 +1,102 @@
/*
*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2020 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
* /
*/
package de.steamwar.misslewars;
import de.steamwar.core.events.ChunkListener;
import net.minecraft.server.v1_15_R1.Chunk;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import java.util.function.ObjIntConsumer;
public class FightWorld {
private static final World world = Bukkit.getWorlds().get(0);
private static final boolean paper = Bukkit.getVersion().contains("git-Paper");
public static boolean isPaper(){
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Alles Public oder was? (Betrifft auch nachfolgende Methoden)

Alles Public oder was? (Betrifft auch nachfolgende Methoden)
return paper;
}
public static double posToChunk(int pos){
return pos / 16.0;
}
private static int getMinChunkX(){
return (int) Math.floor(posToChunk(Config.ArenaMinX));
}
private static int getMaxChunkX(){
return (int) Math.ceil(posToChunk(Config.ArenaMaxX));
}
private static int getMinChunkZ(){
return (int) Math.floor(posToChunk(Config.ArenaMinZ));
}
private static int getMaxChunkZ(){
return (int) Math.ceil(posToChunk(Config.ArenaMaxZ));
}
public static void forEachChunk(ObjIntConsumer<Integer> executor) {
for(int x = getMinChunkX(); x <= getMaxChunkX(); x++)
for(int z = getMinChunkZ(); z <= getMaxChunkZ(); z++)
executor.accept(x, z);
}
public static void resetWorld(){
for(Entity entity : world.getEntities()){
if(entity.getType() != EntityType.PLAYER){
entity.remove();
}
}
World backup = new WorldCreator(world.getName() + "/backup").createWorld();
assert backup != null;
forEachChunk((x, z) -> resetChunk(world, backup, x, z));
Bukkit.unloadWorld(backup, false);
}
public static void resetChunk(World world, World backup, int x, int z) {
net.minecraft.server.v1_15_R1.World w = ((CraftWorld) world).getHandle();
Chunk chunk = w.getChunkAt(x, z);
Chunk backupChunk = ((CraftWorld) backup).getHandle().getChunkAt(x, z);
System.arraycopy(backupChunk.getSections(), 0, chunk.getSections(), 0, chunk.getSections().length);
w.tileEntityListTick.removeAll(chunk.tileEntities.values());
if (!FightWorld.isPaper()) {
w.tileEntityList.removeAll(chunk.tileEntities.values());
}
chunk.tileEntities.clear();
chunk.tileEntities.putAll(backupChunk.tileEntities);
chunk.heightMap.clear();
chunk.heightMap.putAll(backupChunk.heightMap);
for(Player p : Bukkit.getOnlinePlayers()){
ChunkListener.sendChunk(p, x, z);
}
}
}

Datei anzeigen

@ -88,6 +88,15 @@ public class MissileWars extends JavaPlugin {
Bukkit.getScheduler().runTaskTimer(this, new FightInfoPacketSender(), 20, 20);
}
public static void waiting() {
if (fightState == FightState.END) {
fightState = FightState.WAITING;
redTeam = new MWTeam(ChatColor.RED, Config.RedSpawn, "Rot", Config.RedPortalZ);
blueTeam = new MWTeam(ChatColor.DARK_AQUA, Config.BlueSpawn, "Blau", Config.BluePortalZ);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Bin nicht ganz so ein Fan von der Reset-Methode, besser wäre eine reset-Funktion, welche einfach nur das nötige Zurücksetzt.

Bin nicht ganz so ein Fan von der Reset-Methode, besser wäre eine reset-Funktion, welche einfach nur das nötige Zurücksetzt.
}
}
/**
* call to change fightstate from WAITING to INGAME
*/

Datei anzeigen

@ -23,6 +23,7 @@ import de.steamwar.misslewars.Config;
import de.steamwar.misslewars.FightState;
import de.steamwar.misslewars.MissileWars;
import de.steamwar.misslewars.StateDependent;
import de.steamwar.misslewars.listener.JoinListener;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitTask;
@ -38,16 +39,11 @@ public class EndCountdown extends StateDependent {
@Override
public void enable() {
task = Bukkit.getScheduler().runTaskLater(MissileWars.getPlugin(), this::kickPlayer, Config.EndTime);
task = Bukkit.getScheduler().runTaskLater(MissileWars.getPlugin(), this::restart, Config.EndTime);
}
private void kickPlayer(){
if(Bukkit.getOnlinePlayers().isEmpty()){
Bukkit.shutdown();
}else{
Bukkit.getOnlinePlayers().iterator().next().kickPlayer(null);
task = Bukkit.getScheduler().runTaskLater(MissileWars.getPlugin(), this::kickPlayer, 10);
}
private void restart(){
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Na das ist mal eine abentheuerliche Intendation.

Na das ist mal eine abentheuerliche Intendation.
Bukkit.getOnlinePlayers().forEach(JoinListener::join);
}
@Override

Datei anzeigen

@ -22,6 +22,7 @@ package de.steamwar.misslewars.listener;
import de.steamwar.misslewars.Config;
import de.steamwar.misslewars.FightState;
import de.steamwar.misslewars.MissileWars;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerJoinEvent;
@ -50,4 +51,17 @@ public class JoinListener extends BasicListener {
MissileWars.join(e.getPlayer());
}
public static void join(Player p) {
YoyoNow markierte diese Unterhaltung als gelöst
Review

Codeduplication, bitte diese Methode im Event aufrufen.

Codeduplication, bitte diese Methode im Event aufrufen.
if (Config.isChallenge()) {
if (Config.RedLeader.equals(p.getUniqueId())) {
MissileWars.getRedTeam().join(p);
} else if (Config.BlueLeader.equals(p.getUniqueId())) {
MissileWars.getBlueTeam().join(p);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Problem hierbei: Wurde es mit einer Challenge gestartet und noch ein paar Spieler dazu eingeladen, dann fliegen die anderen Spieler raus (daher bevorzugt reset).

Weiteres Problem: leavt einer der beiden Leader, bleibt die Arena offen und es wird ewig auf diese eine Person gewartet.

Problem hierbei: Wurde es mit einer Challenge gestartet und noch ein paar Spieler dazu eingeladen, dann fliegen die anderen Spieler raus (daher bevorzugt reset). Weiteres Problem: leavt einer der beiden Leader, bleibt die Arena offen und es wird ewig auf diese eine Person gewartet.
Veraltet
Review

Wie sollten wir das lösen?

Wie sollten wir das lösen?
Veraltet
Review

Im FightSystem wird die Leaderbindung (jedes Team hat eine separate) nach Join jenes Leaders aufgehoben.

Im FightSystem wird die Leaderbindung (jedes Team hat eine separate) nach Join jenes Leaders aufgehoben.
} else {
p.teleport(MissileWars.getRedTeam().getSpawn().toVector().midpoint(MissileWars.getBlueTeam().getSpawn().toVector()).toLocation(p.getWorld()));
}
return;
}
MissileWars.join(p);
}
}