Skip to content

Commit

Permalink
Fixes exploit where players could get duplicate top ten entries
Browse files Browse the repository at this point in the history
#22

Requires 1.3.0 or later BentoBox because it listens for new events fired
by that version.
  • Loading branch information
tastybento committed Feb 3, 2019
1 parent 7089972 commit d4e1bbf
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 58 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>world.bentobox</groupId>
<artifactId>level</artifactId>
<version>1.2-SNAPSHOT</version>
<version>1.2.1-SNAPSHOT</version>

<name>Level</name>
<description>Level is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like SkyBlock or AcidIsland.</description>
Expand Down Expand Up @@ -86,7 +86,7 @@
<dependency>
<groupId>world.bentobox</groupId>
<artifactId>bentobox</artifactId>
<version>1.1-SNAPSHOT</version>
<version>1.3.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/world/bentobox/level/Level.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import world.bentobox.level.commands.island.IslandTopCommand;
import world.bentobox.level.config.Settings;
import world.bentobox.level.listeners.JoinLeaveListener;
import world.bentobox.level.listeners.NewIslandListener;
import world.bentobox.level.listeners.IslandTeamListeners;
import world.bentobox.level.objects.LevelsData;
import world.bentobox.level.placeholders.LevelPlaceholder;
import world.bentobox.level.requests.LevelRequestHandler;
Expand Down Expand Up @@ -133,7 +133,7 @@ public void onEnable() {
});

// Register new island listener
registerListener(new NewIslandListener(this));
registerListener(new IslandTeamListeners(this));
registerListener(new JoinLeaveListener(this));

// Register request handlers
Expand Down
102 changes: 102 additions & 0 deletions src/main/java/world/bentobox/level/listeners/IslandTeamListeners.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package world.bentobox.level.listeners;

import java.util.HashMap;
import java.util.Map;

import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;

import world.bentobox.bentobox.api.events.island.IslandEvent.IslandCreatedEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent.IslandRegisteredEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent.IslandResettedEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent.IslandUnregisteredEvent;
import world.bentobox.bentobox.api.events.team.TeamEvent.TeamJoinedEvent;
import world.bentobox.bentobox.api.events.team.TeamEvent.TeamKickEvent;
import world.bentobox.bentobox.api.events.team.TeamEvent.TeamLeaveEvent;
import world.bentobox.bentobox.api.events.team.TeamEvent.TeamSetownerEvent;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.level.Level;
import world.bentobox.level.calculators.CalcIslandLevel;

/**
* Listens for new islands or ownership changes and sets the level to zero automatically
* @author tastybento
*
*/
public class IslandTeamListeners implements Listener {

private final Level addon;
private final Map<Island, CalcIslandLevel> cil;

/**
* @param addon - addon
*/
public IslandTeamListeners(Level addon) {
this.addon = addon;
cil = new HashMap<>();
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onNewIsland(IslandCreatedEvent e) {
if (e.getIsland().getOwner() != null && e.getIsland().getWorld() != null) {
cil.putIfAbsent(e.getIsland(), new CalcIslandLevel(addon, e.getIsland(), () -> zeroLevel(e.getIsland())));
}
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onNewIsland(IslandResettedEvent e) {
if (e.getIsland().getOwner() != null && e.getIsland().getWorld() != null) {
cil.putIfAbsent(e.getIsland(), new CalcIslandLevel(addon, e.getIsland(), () -> zeroLevel(e.getIsland())));
}
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onNewIslandOwner(TeamSetownerEvent e) {
// Remove player from the top ten and level
addon.setIslandLevel(e.getIsland().getWorld(), e.getIsland().getOwner(), 0);
addon.getTopTen().removeEntry(e.getIsland().getWorld(), e.getIsland().getOwner());
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIsland(TeamJoinedEvent e) {
// Remove player from the top ten and level
addon.setIslandLevel(e.getIsland().getWorld(), e.getPlayerUUID(), 0);
addon.getTopTen().removeEntry(e.getIsland().getWorld(), e.getPlayerUUID());
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIsland(IslandUnregisteredEvent e) {
// Remove player from the top ten and level
addon.setIslandLevel(e.getIsland().getWorld(), e.getPlayerUUID(), 0);
addon.getTopTen().removeEntry(e.getIsland().getWorld(), e.getPlayerUUID());
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIsland(IslandRegisteredEvent e) {
// Remove player from the top ten and level
addon.setIslandLevel(e.getIsland().getWorld(), e.getPlayerUUID(), 0);
addon.getTopTen().removeEntry(e.getIsland().getWorld(), e.getPlayerUUID());
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIsland(TeamLeaveEvent e) {
// Remove player from the top ten and level
addon.setIslandLevel(e.getIsland().getWorld(), e.getPlayerUUID(), 0);
addon.getTopTen().removeEntry(e.getIsland().getWorld(), e.getPlayerUUID());
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIsland(TeamKickEvent e) {
// Remove player from the top ten and level
addon.setIslandLevel(e.getIsland().getWorld(), e.getPlayerUUID(), 0);
addon.getTopTen().removeEntry(e.getIsland().getWorld(), e.getPlayerUUID());
}

private void zeroLevel(Island island) {
if (cil.containsKey(island)) {
addon.setInitialIslandLevel(island, cil.get(island).getResult().getLevel());
cil.remove(island);
}
}
}

This file was deleted.

0 comments on commit d4e1bbf

Please sign in to comment.