-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #16 from Slimefun-Addon-Community/dev
- Loading branch information
Showing
9 changed files
with
420 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,3 +8,4 @@ | |
*.sh | ||
dependency-reduced-pom.xml | ||
/dependency-reduced-pom.xml | ||
*.DS_Store |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
107 changes: 107 additions & 0 deletions
107
src/main/java/dev/j3fftw/headlimiter/blocklimiter/BlockLimiter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
package dev.j3fftw.headlimiter.blocklimiter; | ||
|
||
import java.util.HashMap; | ||
import java.util.HashSet; | ||
import java.util.Map; | ||
import java.util.Set; | ||
|
||
import javax.annotation.Nonnull; | ||
import javax.annotation.Nullable; | ||
|
||
import org.bukkit.Bukkit; | ||
import org.bukkit.Location; | ||
import org.bukkit.World; | ||
import org.bukkit.entity.Player; | ||
|
||
import com.google.common.base.Preconditions; | ||
|
||
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem; | ||
import io.github.thebusybiscuit.slimefun4.libraries.dough.blocks.ChunkPosition; | ||
|
||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; | ||
import me.mrCookieSlime.Slimefun.api.BlockStorage; | ||
|
||
import dev.j3fftw.headlimiter.HeadLimiter; | ||
|
||
public final class BlockLimiter { | ||
|
||
private static BlockLimiter instance; | ||
private final HashSet<Group> groups = new HashSet<>(); | ||
private final Map<ChunkPosition, ChunkContent> contentMap = new HashMap<>(); | ||
|
||
public BlockLimiter(@Nonnull HeadLimiter headLimiter) { | ||
Preconditions.checkArgument(instance == null, "Cannot create a new instance of the BlockLimiter"); | ||
instance = this; | ||
new BlockListener(headLimiter); | ||
headLimiter.getServer().getScheduler().runTaskLater(headLimiter, this::loadBlockStorage, 1); | ||
} | ||
|
||
private void loadBlockStorage() { | ||
for (World world : Bukkit.getWorlds()) { | ||
BlockStorage worldStorage = BlockStorage.getStorage(world); | ||
if (worldStorage == null) { | ||
return; | ||
} else { | ||
for (Map.Entry<Location, Config> entry : worldStorage.getRawStorage().entrySet()) { | ||
Location location = entry.getKey(); | ||
String id = entry.getValue().getString("id"); | ||
ChunkPosition chunkPosition = new ChunkPosition(location.getChunk()); | ||
ChunkContent content = contentMap.get(chunkPosition); | ||
if (content == null) { | ||
content = new ChunkContent(); | ||
content.incrementAmount(id); | ||
contentMap.put(chunkPosition, content); | ||
} else { | ||
content.incrementAmount(id); | ||
} | ||
} | ||
} | ||
|
||
} | ||
} | ||
|
||
@Nullable | ||
public ChunkContent getChunkContent(@Nonnull ChunkPosition chunkPosition) { | ||
return contentMap.get(chunkPosition); | ||
} | ||
|
||
public Group getGroupByItem(@Nonnull SlimefunItem slimefunItem) { | ||
return getGroupByItem(slimefunItem.getId()); | ||
} | ||
|
||
@Nullable | ||
public Group getGroupByItem(@Nonnull String itemId) { | ||
for (Group group : this.groups) { | ||
if (group.contains(itemId)) { | ||
return group; | ||
} | ||
} | ||
return null; | ||
} | ||
|
||
public int getPlayerLimitByItem(@Nonnull Player player, @Nonnull SlimefunItem slimefunItem) { | ||
return getPlayerLimitByItem(player, slimefunItem.getId()); | ||
} | ||
|
||
public int getPlayerLimitByItem(@Nonnull Player player, @Nonnull String itemId) { | ||
Group group = getGroupByItem(itemId); | ||
if (group == null) { | ||
return -1; | ||
} else { | ||
return group.getPermissibleAmount(player); | ||
} | ||
} | ||
|
||
public Set<Group> getGroups() { | ||
return groups; | ||
} | ||
|
||
public void setChunkContent(@Nonnull ChunkPosition chunkPosition, @Nonnull ChunkContent content) { | ||
contentMap.put(chunkPosition, content); | ||
} | ||
|
||
@Nonnull | ||
public static BlockLimiter getInstance() { | ||
return instance; | ||
} | ||
} |
74 changes: 74 additions & 0 deletions
74
src/main/java/dev/j3fftw/headlimiter/blocklimiter/BlockListener.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
package dev.j3fftw.headlimiter.blocklimiter; | ||
|
||
import javax.annotation.Nonnull; | ||
|
||
import org.bukkit.ChatColor; | ||
import org.bukkit.event.EventHandler; | ||
import org.bukkit.event.Listener; | ||
|
||
import io.github.thebusybiscuit.slimefun4.api.events.SlimefunBlockBreakEvent; | ||
import io.github.thebusybiscuit.slimefun4.api.events.SlimefunBlockPlaceEvent; | ||
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem; | ||
import io.github.thebusybiscuit.slimefun4.libraries.dough.blocks.ChunkPosition; | ||
|
||
import dev.j3fftw.headlimiter.HeadLimiter; | ||
|
||
public class BlockListener implements Listener { | ||
|
||
public BlockListener(@Nonnull HeadLimiter headLimiter) { | ||
headLimiter.getServer().getPluginManager().registerEvents(this, headLimiter); | ||
} | ||
|
||
@EventHandler | ||
public void onSlimefunItemPlaced(@Nonnull SlimefunBlockPlaceEvent event) { | ||
SlimefunItem slimefunItem = event.getSlimefunItem(); | ||
String slimefunItemId = slimefunItem.getId(); | ||
int definedLimit = BlockLimiter.getInstance().getPlayerLimitByItem(event.getPlayer(), slimefunItem); | ||
|
||
if (definedLimit == -1) { | ||
// No limit has been set, nothing required for HeadLimiter | ||
return; | ||
} | ||
|
||
ChunkPosition chunkPosition = new ChunkPosition(event.getBlockPlaced().getChunk()); | ||
ChunkContent content = BlockLimiter.getInstance().getChunkContent(chunkPosition); | ||
|
||
if (content == null) { | ||
// Content is null so no blocks are currently in this chunk, lets set one up - event can continue | ||
content = new ChunkContent(); | ||
content.incrementAmount(slimefunItemId); | ||
BlockLimiter.getInstance().setChunkContent(chunkPosition, content); | ||
} else if (content.getGroupTotal(slimefunItemId) < definedLimit) { | ||
// This chunk can take more of the specified item type | ||
content.incrementAmount(slimefunItemId); | ||
} else { | ||
// Chunk has hit its limit for this type, time to deny the placement | ||
event.setCancelled(true); | ||
event.getPlayer().sendMessage(ChatColor.RED + "You cannot place any more of this item within this chunk."); | ||
} | ||
} | ||
|
||
@EventHandler | ||
public void onSlimefunItemBroken(@Nonnull SlimefunBlockBreakEvent event) { | ||
SlimefunItem slimefunItem = event.getSlimefunItem(); | ||
String slimefunItemId = slimefunItem.getId(); | ||
int definedLimit = BlockLimiter.getInstance().getPlayerLimitByItem(event.getPlayer(), slimefunItem); | ||
if (definedLimit == -1) { | ||
// No limit has been set, nothing required for HeadLimiter | ||
return; | ||
} | ||
|
||
ChunkPosition chunkPosition = new ChunkPosition(event.getBlockBroken().getChunk()); | ||
ChunkContent content = BlockLimiter.getInstance().getChunkContent(chunkPosition); | ||
|
||
if (content == null) { | ||
// Content is null so no blocks are currently in this chunk, shouldn't be possible, but never mind | ||
return; | ||
} | ||
|
||
// This chunk can take more of the specified item type | ||
content.decrementAmount(slimefunItemId); | ||
|
||
} | ||
|
||
} |
68 changes: 68 additions & 0 deletions
68
src/main/java/dev/j3fftw/headlimiter/blocklimiter/ChunkContent.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package dev.j3fftw.headlimiter.blocklimiter; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.Set; | ||
|
||
import javax.annotation.Nonnull; | ||
|
||
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem; | ||
|
||
public class ChunkContent { | ||
|
||
private final Map<String, Integer> contentMap = new HashMap<>(); | ||
|
||
public int getCurrentAmount(@Nonnull SlimefunItem slimefunItem) { | ||
return getCurrentAmount(slimefunItem.getId()); | ||
} | ||
|
||
public int getCurrentAmount(@Nonnull String itemId) { | ||
return this.contentMap.getOrDefault(itemId, 0); | ||
} | ||
|
||
public int getGroupTotal(@Nonnull SlimefunItem slimefunItem) { | ||
return getGroupTotal(slimefunItem.getId()); | ||
} | ||
|
||
public int getGroupTotal(@Nonnull String itemId) { | ||
Set<Group> groupSet = BlockLimiter.getInstance().getGroups(); | ||
|
||
for (Group group : groupSet) { | ||
if (group.contains(itemId)) { | ||
int amount = 0; | ||
for (String item : group.getItems()) { | ||
amount += this.contentMap.get(item); | ||
} | ||
return amount; | ||
} | ||
} | ||
|
||
return -1; | ||
} | ||
|
||
public void incrementAmount(@Nonnull SlimefunItem slimefunItem) { | ||
incrementAmount(slimefunItem.getId()); | ||
} | ||
|
||
public void incrementAmount(@Nonnull String itemId) { | ||
int amount = getCurrentAmount(itemId); | ||
setAmount(itemId, amount + 1); | ||
} | ||
|
||
public void decrementAmount(@Nonnull SlimefunItem slimefunItem) { | ||
incrementAmount(slimefunItem.getId()); | ||
} | ||
|
||
public void decrementAmount(@Nonnull String itemId) { | ||
int amount = getCurrentAmount(itemId); | ||
setAmount(itemId, Math.max(0, amount - 1)); | ||
} | ||
|
||
public void setAmount(@Nonnull SlimefunItem slimefunItem, int amount) { | ||
setAmount(slimefunItem.getId(), amount); | ||
} | ||
|
||
public void setAmount(@Nonnull String itemId, int amount) { | ||
contentMap.put(itemId, amount); | ||
} | ||
} |
Oops, something went wrong.