Skip to content

Commit

Permalink
Merge pull request #6 from SlimefunGuguProject/merge-upstream
Browse files Browse the repository at this point in the history
  • Loading branch information
ybw0014 authored Aug 11, 2023
2 parents 6dfc786 + 8fd181a commit 78d2f68
Show file tree
Hide file tree
Showing 10 changed files with 435 additions and 42 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@
*.sh
dependency-reduced-pom.xml
/dependency-reduced-pom.xml
*.DS_Store
/local/
8 changes: 4 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

<build>
<defaultGoal>clean package</defaultGoal>
<finalName>${project.artifactId}-${project.version}</finalName>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>

<resources>
Expand Down Expand Up @@ -107,9 +107,9 @@
</dependency>

<dependency>
<groupId>com.github.Slimefun</groupId>
<groupId>com.github.StarWishsama</groupId>
<artifactId>Slimefun4</artifactId>
<version>RC-32</version>
<version>eb20e5911f</version>
<scope>provided</scope>
</dependency>

Expand All @@ -136,7 +136,7 @@
<dependency>
<groupId>net.guizhanss</groupId>
<artifactId>GuizhanLibPlugin</artifactId>
<version>1.1.0</version>
<version>1.3.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/dev/j3fftw/headlimiter/CountCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
}

message.append(ChatColor.GOLD)
.append("当前数量: ")
.append("当前数量")
.append(result.getTotal())
.append("/")
.append(Utils.getMaxHeads(player))
Expand All @@ -38,7 +38,7 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
message.append(" ")
.append(ChatColor.GRAY)
.append(entry.getKey())
.append(": ")
.append("")
.append(ChatColor.YELLOW)
.append(entry.getValue())
.append('\n');
Expand All @@ -48,7 +48,7 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
});
} else {
sender.sendMessage(ChatColor.GOLD + "/hl count"
+ ChatColor.GRAY + " - 统计该区块中有多少个头颅"
+ ChatColor.GRAY + " - 统计该区块中有多少个方块"
);
}

Expand Down
52 changes: 44 additions & 8 deletions src/main/java/dev/j3fftw/headlimiter/HeadLimiter.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,45 @@
package dev.j3fftw.headlimiter;

import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
import net.guizhanss.guizhanlibplugin.updater.GuizhanBuildsUpdaterWrapper;
import java.io.File;
import java.util.logging.Level;

import dev.j3fftw.headlimiter.blocklimiter.Group;
import net.guizhanss.guizhanlibplugin.updater.GuizhanUpdater;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.plugin.java.JavaPlugin;

import java.io.File;
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;

import dev.j3fftw.headlimiter.blocklimiter.BlockLimiter;

public final class HeadLimiter extends JavaPlugin implements Listener {

private static HeadLimiter instance;
private BlockLimiter blockLimiter;


@Override
public void onEnable() {
instance = this;
if (!new File(getDataFolder(), "config.yml").exists())

if (!getServer().getPluginManager().isPluginEnabled("GuizhanLibPlugin")) {
getLogger().log(Level.SEVERE, "本插件需要 鬼斩前置库插件(GuizhanLibPlugin) 才能运行!");
getLogger().log(Level.SEVERE, "从此处下载: https://50L.cc/gzlib");
getServer().getPluginManager().disablePlugin(this);
return;
}

if (!new File(getDataFolder(), "config.yml").exists()) {
saveDefaultConfig();
}

Utils.loadPermissions();

Expand All @@ -33,8 +50,11 @@ public void onEnable() {
new MetricsService(this).start();

if (getConfig().getBoolean("auto-update") && getDescription().getVersion().startsWith("Build")) {
GuizhanBuildsUpdaterWrapper.start(this, getFile(), "ybw0014", "HeadLimiter-CN", "master", false);
GuizhanUpdater.start(this, getFile(), "SlimefunGuguProject", "HeadLimiter", "master");
}

this.blockLimiter = new BlockLimiter(this);
loadConfig();
}

@Override
Expand Down Expand Up @@ -64,13 +84,29 @@ public void onPlace(BlockPlaceEvent e) {
&& isCargo(sfItem)
) {
final int maxAmount = Utils.getMaxHeads(player);
Utils.count(block.getChunk(),
result -> Utils.onCheck(player, block, maxAmount, result.getTotal(), sfItem));
Utils.count(
block.getChunk(),
result -> Utils.onCheck(player, block, maxAmount, result.getTotal(), sfItem)
);
}
}
}

public BlockLimiter getBlockLimiter() {
return blockLimiter;
}

public static HeadLimiter getInstance() {
return instance;
}

public void loadConfig() {
ConfigurationSection configurationSection = instance.getConfig().getConfigurationSection("block-limits");
if (configurationSection == null) {
throw new IllegalStateException("没有配置任何方块组!");
}
for (String key : configurationSection.getKeys(false)) {
BlockLimiter.getInstance().getGroups().add(new Group(configurationSection.getConfigurationSection(key)));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
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 com.xzavier0722.mc.plugin.slimefun4.storage.callback.IAsyncReadCallback;
import com.xzavier0722.mc.plugin.slimefun4.storage.controller.BlockDataController;
import com.xzavier0722.mc.plugin.slimefun4.storage.controller.SlimefunBlockData;
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
import org.bukkit.Bukkit;
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 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);
}

@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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package dev.j3fftw.headlimiter.blocklimiter;

import javax.annotation.Nonnull;

import com.xzavier0722.mc.plugin.slimefun4.storage.controller.SlimefunBlockData;
import com.xzavier0722.mc.plugin.slimefun4.storage.controller.SlimefunChunkData;
import com.xzavier0722.mc.plugin.slimefun4.storage.event.SlimefunChunkDataLoadEvent;
import org.bukkit.ChatColor;
import org.bukkit.Chunk;
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 onSlimefunChunkLoad(@Nonnull SlimefunChunkDataLoadEvent event) {
BlockLimiter blockLimiter = HeadLimiter.getInstance().getBlockLimiter();
ChunkPosition chunkPos = new ChunkPosition(event.getChunk());

for (SlimefunBlockData blockData : event.getChunkData().getAllBlockData()) {
String id = blockData.getSfId();
ChunkContent content = blockLimiter.getChunkContent(chunkPos);
if (content == null) {
content = new ChunkContent();
content.incrementAmount(id);
blockLimiter.setChunkContent(chunkPos, content);
} else {
content.incrementAmount(id);
}
}
}

@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 + "你不能在该区块中放置更多。");
}
}

@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);

}

}
Loading

0 comments on commit 78d2f68

Please sign in to comment.