forked from SteamWar/SteamWar
218 lines
6.4 KiB
Java
218 lines
6.4 KiB
Java
/*
|
|
This file is a part of the SteamWar software.
|
|
|
|
Copyright (C) 2023 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.misslewars.commands.AcceptCommand;
|
|
import de.steamwar.misslewars.commands.DeclineCommand;
|
|
import de.steamwar.misslewars.commands.InviteCommand;
|
|
import de.steamwar.misslewars.commands.SpectateCommand;
|
|
import de.steamwar.misslewars.countdowns.EndCountdown;
|
|
import de.steamwar.misslewars.countdowns.ItemCountdown;
|
|
import de.steamwar.misslewars.countdowns.WaitingCountdown;
|
|
import de.steamwar.misslewars.items.CustomItem;
|
|
import de.steamwar.misslewars.items.Missile;
|
|
import de.steamwar.misslewars.listener.*;
|
|
import de.steamwar.misslewars.listener.special.BarrierListener;
|
|
import de.steamwar.misslewars.listener.special.SpaceListener;
|
|
import de.steamwar.misslewars.slowmo.SlowMoRunner;
|
|
import de.steamwar.network.NetworkSender;
|
|
import de.steamwar.network.packets.common.FightEndsPacket;
|
|
import de.steamwar.sql.SteamwarUser;
|
|
import org.bukkit.*;
|
|
import org.bukkit.entity.Entity;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
|
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
import java.util.stream.Collectors;
|
|
|
|
public class MissileWars extends JavaPlugin {
|
|
private static MissileWars plugin;
|
|
private static MWTeam redTeam; //red has South side -> spawns missles towards north
|
|
private static MWTeam blueTeam;
|
|
private static FightState fightState;
|
|
|
|
/**
|
|
* create teams, ect
|
|
*/
|
|
@Override
|
|
public void onLoad() {
|
|
plugin = this;
|
|
fightState = FightState.WAITING;
|
|
}
|
|
|
|
@Override
|
|
public void onEnable() {
|
|
redTeam = new MWTeam(Config.TeamRedColor, Config.RedSpawn, Config.TeamRedName, Config.RedPortalZ);
|
|
blueTeam = new MWTeam(Config.TeamBlueColor, Config.BlueSpawn, Config.TeamBlueName, Config.BluePortalZ);
|
|
new BreakListener();
|
|
new DeathListener();
|
|
new ItemListener();
|
|
new ArenaListener();
|
|
new ConnectionListener();
|
|
new JoinListener();
|
|
new EndListener();
|
|
new PortalDestructListener();
|
|
new WaitingListener();
|
|
new FightListener();
|
|
new ChatListener();
|
|
new SpectateCommand();
|
|
|
|
// Invitation Commands
|
|
new InviteCommand();
|
|
new AcceptCommand();
|
|
new DeclineCommand();
|
|
|
|
new WaitingCountdown();
|
|
new ItemCountdown();
|
|
new EndCountdown();
|
|
|
|
new FightScoreboard();
|
|
Missile.init();
|
|
CustomItem.init();
|
|
|
|
StateDependent.setupState(fightState);
|
|
|
|
new BarrierListener();
|
|
new SpaceListener();
|
|
|
|
Bukkit.getScheduler().runTaskTimer(this, new FightInfoPacketSender(), 20, 20);
|
|
|
|
Bukkit.getWorlds().forEach(world -> {
|
|
world.setGameRule(GameRule.KEEP_INVENTORY, true);
|
|
world.setGameRule(GameRule.MOB_GRIEFING, true);
|
|
world.setGameRule(GameRule.DO_TILE_DROPS, false);
|
|
});
|
|
|
|
// TODO: Enable Item Dropping, and the own team can pick them up! Add config value for that?
|
|
}
|
|
|
|
public static void waiting() {
|
|
if (fightState == FightState.END) {
|
|
fightState = FightState.WAITING;
|
|
StateDependent.setupState(fightState);
|
|
|
|
SlowMoRunner.resetSlowMoTime();
|
|
|
|
Set<UUID> uuidList = Bukkit.getOnlinePlayers().stream().map(Entity::getUniqueId).collect(Collectors.toSet());
|
|
if (!uuidList.contains(Config.RedLeader) || !uuidList.contains(Config.BlueLeader)) {
|
|
Config.RedLeader = null;
|
|
Config.BlueLeader = null;
|
|
}
|
|
|
|
redTeam.reset();
|
|
blueTeam.reset();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* call to change fightstate from WAITING to INGAME
|
|
*/
|
|
static void startRound() {
|
|
if (fightState != FightState.WAITING) // anti dual-call
|
|
return;
|
|
fightState = FightState.FIGHTING;
|
|
StateDependent.setupState(fightState);
|
|
}
|
|
|
|
/**
|
|
* Fight beenden
|
|
* @param reason Grund fürs ende
|
|
* @param winner Gewinner (oder null)
|
|
*/
|
|
public static void end(WinReasons reason, MWTeam winner) {
|
|
if (fightState == FightState.END) //verhindern dass es mehrfach gecallt wird
|
|
return;
|
|
fightState = FightState.END;
|
|
StateDependent.setupState(fightState);
|
|
|
|
for(Player player : Bukkit.getOnlinePlayers()) {
|
|
player.playSound(player.getLocation(), Sound.ENTITY_ENDER_DRAGON_DEATH, 100f, 1f);
|
|
player.setGameMode(GameMode.SPECTATOR);
|
|
}
|
|
|
|
byte ergebnis = winner == blueTeam ? (byte) 1 : (byte) 2;
|
|
if (Config.isEvent()) {
|
|
Config.EventKampf.setErgebnis(ergebnis);
|
|
}
|
|
if (Config.isEvent() || Config.isChallenge()) {
|
|
FightEndsPacket packet = FightEndsPacket.builder()
|
|
.gameMode("MissileWars")
|
|
.duration((int)((System.currentTimeMillis() - FightScoreboard.getStartTime()) / 1000))
|
|
.win(ergebnis)
|
|
.bluePlayers(blueTeam.getPlayers().stream().map(Player::getUniqueId).map(SteamwarUser::get).map(SteamwarUser::getId).collect(Collectors.toList()))
|
|
.redPlayers(redTeam.getPlayers().stream().map(Player::getUniqueId).map(SteamwarUser::get).map(SteamwarUser::getId).collect(Collectors.toList()))
|
|
.blueSchem(-1)
|
|
.redSchem(-1)
|
|
.build();
|
|
NetworkSender.send(packet);
|
|
}
|
|
|
|
switch (reason) {
|
|
case PORTAL_DESTROYED:
|
|
Bukkit.getServer().broadcastMessage(winner.getColoredName() + ChatColor.RESET + " §7hat das gegnerische Portal zerstört");
|
|
break;
|
|
case NO_ENEMY:
|
|
default:
|
|
Bukkit.getServer().broadcastMessage("§7Team " + winner.getColoredName() + ChatColor.RESET + " §7hat aufgrund fehlenden Gegners gewonnen");
|
|
break;
|
|
}
|
|
}
|
|
|
|
public static MissileWars getPlugin() {
|
|
return plugin;
|
|
}
|
|
|
|
public static FightState getFightState() {
|
|
return fightState;
|
|
}
|
|
|
|
public static MWTeam getRedTeam() {
|
|
return redTeam;
|
|
}
|
|
|
|
public static MWTeam getBlueTeam() {
|
|
return blueTeam;
|
|
}
|
|
|
|
public static MWTeam getTeam(Player p) {
|
|
if(blueTeam.hasPlayer(p))
|
|
return blueTeam;
|
|
if(redTeam.hasPlayer(p))
|
|
return redTeam;
|
|
return null;
|
|
}
|
|
|
|
public static MWTeam getInvitation(Player p) {
|
|
if(blueTeam.hasInvite(p))
|
|
return blueTeam;
|
|
if(redTeam.hasInvite(p))
|
|
return redTeam;
|
|
return null;
|
|
}
|
|
|
|
public static void leave(Player p) {
|
|
MissileWars.getBlueTeam().leave(p);
|
|
MissileWars.getRedTeam().leave(p);
|
|
}
|
|
|
|
}
|