Implement remaining events

This commit is contained in:
Daniel Saukel 2020-11-02 21:17:19 +01:00
parent 000250e95b
commit af5e69100a
11 changed files with 89 additions and 61 deletions

View File

@ -15,7 +15,6 @@
package de.erethon.dungeonsxl.api.event.player;
import de.erethon.dungeonsxl.api.player.EditPlayer;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
/**
@ -23,10 +22,9 @@ import org.bukkit.event.HandlerList;
*
* @author Daniel Saukel
*/
public class EditPlayerEditEvent extends EditPlayerEvent implements Cancellable {
public class EditPlayerEditEvent extends EditPlayerEvent {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private boolean newlyLoaded;
@ -53,14 +51,4 @@ public class EditPlayerEditEvent extends EditPlayerEvent implements Cancellable
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
}

View File

@ -15,18 +15,16 @@
package de.erethon.dungeonsxl.api.event.world;
import de.erethon.dungeonsxl.api.world.EditWorld;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
/**
* Fired when a dungeon world is generated.
* Fired after a dungeon world is generated.
*
* @author Daniel Saukel
*/
public class EditWorldGenerateEvent extends EditWorldEvent implements Cancellable {
public class EditWorldGenerateEvent extends EditWorldEvent {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
public EditWorldGenerateEvent(EditWorld editWorld) {
super(editWorld);
@ -41,14 +39,4 @@ public class EditWorldGenerateEvent extends EditWorldEvent implements Cancellabl
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
}

View File

@ -14,7 +14,6 @@
*/
package de.erethon.dungeonsxl.api.event.world;
import de.erethon.dungeonsxl.api.dungeon.Dungeon;
import de.erethon.dungeonsxl.api.world.ResourceWorld;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
@ -29,20 +28,11 @@ public class ResourceWorldInstantiateEvent extends ResourceWorldEvent implements
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private Dungeon dungeon;
private String instanceWorldName;
public ResourceWorldInstantiateEvent(ResourceWorld resource, Dungeon dungeon) {
public ResourceWorldInstantiateEvent(ResourceWorld resource, String instanceWorldName) {
super(resource);
this.dungeon = dungeon;
}
/**
* Returns the dungeon as a part of which the instance is loaded.
*
* @return the dungeon as a part of which the instance is loaded
*/
public Dungeon getDungeon() {
return dungeon;
this.instanceWorldName = instanceWorldName;
}
/**
@ -51,7 +41,18 @@ public class ResourceWorldInstantiateEvent extends ResourceWorldEvent implements
* @return if the loaded instance will be an edit world
*/
public boolean isEditInstance() {
return dungeon == null;
return instanceWorldName.startsWith("DXL_Edit_");
}
/**
* Returns the name the newly loaded Bukkit world is going to have.
* <p>
* Note that at this point no Bukkit World object for this world exists.
*
* @return the name the newly loaded Bukkit world is going to have
*/
public String getInstanceWorldName() {
return instanceWorldName;
}
@Override

View File

@ -47,6 +47,23 @@ public interface EditPlayer extends InstancePlayer {
*/
void setCopiedLines(String[] copiedLines);
/**
* Makes the player leave his group and dungeon.
* <p>
* This unloads the world if there are no editors left after this player leaves.
*/
@Override
default void leave() {
leave(true);
}
/**
* Makes the player leave his group and dungeon.
*
* @param unloadIfEmpty whether the world is to be unloaded if, after this player leaves, no editors are left
*/
void leave(boolean unloadIfEmpty);
/**
* Makes the player leave the edit world without saving the progress.
*/

View File

@ -19,6 +19,7 @@ package de.erethon.dungeonsxl.command;
import de.erethon.commons.chat.MessageUtil;
import de.erethon.commons.config.CommonMessage;
import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.event.player.EditPlayerEditEvent;
import de.erethon.dungeonsxl.api.player.GlobalPlayer;
import de.erethon.dungeonsxl.api.player.InstancePlayer;
import de.erethon.dungeonsxl.api.player.PlayerGroup;
@ -27,6 +28,7 @@ import de.erethon.dungeonsxl.api.world.ResourceWorld;
import de.erethon.dungeonsxl.config.DMessage;
import de.erethon.dungeonsxl.player.DEditPlayer;
import de.erethon.dungeonsxl.player.DPermission;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -59,6 +61,7 @@ public class EditCommand extends DCommand {
return;
}
boolean newlyLoaded = resource.getEditWorld() == null;
EditWorld editWorld = resource.getOrInstantiateEditWorld(false);
if (editWorld == null) {
MessageUtil.sendMessage(player, DMessage.ERROR_TOO_MANY_INSTANCES.getMessage());
@ -78,7 +81,7 @@ public class EditCommand extends DCommand {
return;
}
new DEditPlayer(plugin, player, editWorld);
Bukkit.getPluginManager().callEvent(new EditPlayerEditEvent(new DEditPlayer(plugin, player, editWorld), newlyLoaded));
}
}

View File

@ -18,11 +18,13 @@ package de.erethon.dungeonsxl.command;
import de.erethon.commons.chat.MessageUtil;
import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.event.player.EditPlayerLeaveEvent;
import de.erethon.dungeonsxl.api.player.EditPlayer;
import de.erethon.dungeonsxl.api.player.PlayerGroup;
import de.erethon.dungeonsxl.api.world.EditWorld;
import de.erethon.dungeonsxl.config.DMessage;
import de.erethon.dungeonsxl.player.DPermission;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -50,6 +52,12 @@ public class EscapeCommand extends DCommand {
MessageUtil.sendMessage(player, DMessage.ERROR_LEAVE_DUNGEON.getMessage());
} else if (editPlayer != null) {
EditPlayerLeaveEvent event = new EditPlayerLeaveEvent(editPlayer, true, true);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
editPlayer.escape();
EditWorld editWorld = editPlayer.getEditWorld();
@ -57,7 +65,7 @@ public class EscapeCommand extends DCommand {
return;
}
if (editWorld.getWorld().getPlayers().isEmpty()) {
if (editWorld.getWorld().getPlayers().isEmpty() && event.getUnloadIfEmpty()) {
editWorld.delete(false);
}

View File

@ -20,11 +20,12 @@ import de.erethon.commons.chat.MessageUtil;
import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.dungeon.Game;
import de.erethon.dungeonsxl.api.event.group.GroupPlayerLeaveEvent;
import de.erethon.dungeonsxl.api.event.player.EditPlayerLeaveEvent;
import de.erethon.dungeonsxl.api.player.EditPlayer;
import de.erethon.dungeonsxl.api.player.GamePlayer;
import de.erethon.dungeonsxl.api.player.GlobalPlayer;
import de.erethon.dungeonsxl.api.player.PlayerGroup;
import de.erethon.dungeonsxl.config.DMessage;
import de.erethon.dungeonsxl.player.DEditPlayer;
import de.erethon.dungeonsxl.player.DGlobalPlayer;
import de.erethon.dungeonsxl.player.DInstancePlayer;
import de.erethon.dungeonsxl.player.DPermission;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
@ -48,7 +49,7 @@ public class LeaveCommand extends DCommand {
@Override
public void onExecute(String[] args, CommandSender sender) {
Player player = (Player) sender;
DGlobalPlayer dPlayer = (DGlobalPlayer) dPlayers.get(player);
GlobalPlayer globalPlayer = dPlayers.get(player);
Game game = plugin.getGame(player);
if (game != null && game.isTutorial()) {
@ -56,23 +57,29 @@ public class LeaveCommand extends DCommand {
return;
}
PlayerGroup dGroup = dPlayer.getGroup();
PlayerGroup group = globalPlayer.getGroup();
if (dGroup == null && !(dPlayer instanceof DEditPlayer)) {
if (group == null && !(globalPlayer instanceof EditPlayer)) {
MessageUtil.sendMessage(player, DMessage.ERROR_JOIN_GROUP.getMessage());
return;
}
GroupPlayerLeaveEvent groupPlayerLeaveEvent = new GroupPlayerLeaveEvent(dGroup, dPlayer);
Bukkit.getPluginManager().callEvent(groupPlayerLeaveEvent);
if (groupPlayerLeaveEvent.isCancelled()) {
return;
}
if (dPlayer instanceof DInstancePlayer) {
((DInstancePlayer) dPlayer).leave();
if (globalPlayer instanceof GamePlayer) {
GroupPlayerLeaveEvent event = new GroupPlayerLeaveEvent(group, globalPlayer);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
((GamePlayer) globalPlayer).leave();
} else if (globalPlayer instanceof EditPlayer) {
EditPlayerLeaveEvent event = new EditPlayerLeaveEvent((EditPlayer) globalPlayer, false, true);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
((EditPlayer) globalPlayer).leave(event.getUnloadIfEmpty());
} else {
dGroup.removeMember(player);
group.removeMember(player);
}
MessageUtil.sendMessage(player, DMessage.CMD_LEAVE_SUCCESS.getMessage());

View File

@ -138,12 +138,12 @@ public class DEditPlayer extends DInstancePlayer implements EditPlayer {
}
@Override
public void leave() {
public void leave(boolean unloadIfEmpty) {
delete();
reset(false);
if (!plugin.isLoadingWorld() && editWorld != null && editWorld.getPlayers().isEmpty()) {
if (unloadIfEmpty && !plugin.isLoadingWorld() && editWorld != null && editWorld.getPlayers().isEmpty()) {
editWorld.delete();
new ProgressBar(player, config.getEditInstanceRemovalDelay()) {
@Override

View File

@ -26,6 +26,7 @@ import de.erethon.dungeonsxl.api.dungeon.GameGoal;
import de.erethon.dungeonsxl.api.dungeon.GameRule;
import de.erethon.dungeonsxl.api.dungeon.GameRuleContainer;
import de.erethon.dungeonsxl.api.event.group.GroupPlayerKickEvent;
import de.erethon.dungeonsxl.api.event.group.GroupScoreEvent;
import de.erethon.dungeonsxl.api.event.player.GamePlayerDeathEvent;
import de.erethon.dungeonsxl.api.event.player.GamePlayerFinishEvent;
import de.erethon.dungeonsxl.api.event.player.GlobalPlayerRewardPayOutEvent;
@ -332,6 +333,11 @@ public class DGamePlayer extends DInstancePlayer implements GamePlayer {
return;
}
GroupScoreEvent event = new GroupScoreEvent(getGroup(), this, stealing);
if (event.isCancelled()) {
return;
}
game.sendMessage(DMessage.GROUP_FLAG_CAPTURED.getMessage(getName(), stealing.getName()));
GameRuleContainer rules = game.getRules();

View File

@ -387,6 +387,10 @@ public class DGameWorld extends DInstanceWorld implements GameWorld {
@Override
public Dungeon getDungeon() {
if (getGame() != null) {
return getGame().getDungeon();
}
for (Dungeon dungeon : plugin.getDungeonRegistry()) {
if (dungeon.containsFloor(getResource())) {
return dungeon;

View File

@ -24,6 +24,7 @@ import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.dungeon.Dungeon;
import de.erethon.dungeonsxl.api.dungeon.GameRuleContainer;
import de.erethon.dungeonsxl.api.event.world.EditWorldGenerateEvent;
import de.erethon.dungeonsxl.api.event.world.ResourceWorldInstantiateEvent;
import de.erethon.dungeonsxl.api.player.EditPlayer;
import de.erethon.dungeonsxl.api.world.EditWorld;
import de.erethon.dungeonsxl.api.world.GameWorld;
@ -199,6 +200,10 @@ public class DResourceWorld implements ResourceWorld {
}
DInstanceWorld instance = game ? new DGameWorld(plugin, this, instanceFolder) : new DEditWorld(plugin, this, instanceFolder);
ResourceWorldInstantiateEvent event = new ResourceWorldInstantiateEvent(this, name);
if (event.isCancelled()) {
return null;
}
FileUtil.copyDir(folder, instanceFolder, DungeonsXL.EXCLUDED_FILES);
instance.world = Bukkit.createWorld(WorldCreator.name(name).environment(getWorldEnvironment())).getName();
@ -284,7 +289,7 @@ public class DResourceWorld implements ResourceWorld {
DEditWorld editWorld = new DEditWorld(plugin, this, folder);
this.editWorld = editWorld;
EditWorldGenerateEvent event = new EditWorldGenerateEvent(editWorld);
ResourceWorldInstantiateEvent event = new ResourceWorldInstantiateEvent(this, name);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return null;
@ -298,6 +303,7 @@ public class DResourceWorld implements ResourceWorld {
editWorld.world = creator.createWorld().getName();
editWorld.generateIdFile();
Bukkit.getPluginManager().callEvent(new EditWorldGenerateEvent(editWorld));
return editWorld;
}