实现了基础功能的测试

This commit is contained in:
zhangyuheng 2024-02-16 16:44:19 +08:00
parent 517426304a
commit f6c9cb53ee
9 changed files with 121 additions and 85 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId> <groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId> <artifactId>Dominion</artifactId>
<version>1.0</version> <version>1.0-beta</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Dominion</name> <name>Dominion</name>

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion; package cn.lunadeer.dominion;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.utils.XLogger;
import com.flowpowered.math.vector.Vector2d; import com.flowpowered.math.vector.Vector2d;
import de.bluecolored.bluemap.api.BlueMapAPI; import de.bluecolored.bluemap.api.BlueMapAPI;
import de.bluecolored.bluemap.api.BlueMapMap; import de.bluecolored.bluemap.api.BlueMapMap;
@ -19,46 +20,52 @@ public class BlueMapConnect {
if (!Dominion.config.getBlueMap()) { if (!Dominion.config.getBlueMap()) {
return; return;
} }
BlueMapAPI.getInstance().ifPresent(api -> { try {
for (Map.Entry<String, List<DominionDTO>> world_dominions : Cache.instance.getWorldDominions().entrySet()) { BlueMapAPI.getInstance().ifPresent(api -> {
api.getWorld(world_dominions.getKey()).ifPresent(world -> { for (Map.Entry<String, List<Integer>> world_dominions : Cache.instance.getWorldDominions().entrySet()) {
MarkerSet markerSet = MarkerSet.builder() api.getWorld(world_dominions.getKey()).ifPresent(world -> {
.label("Dominion") MarkerSet markerSet = MarkerSet.builder()
.build(); .label("Dominion")
for (DominionDTO dominion : world_dominions.getValue()) {
Collection<Vector2d> vectors = new ArrayList<>();
vectors.add(new Vector2d(dominion.getX1(), dominion.getZ1()));
vectors.add(new Vector2d(dominion.getX2(), dominion.getZ1()));
vectors.add(new Vector2d(dominion.getX2(), dominion.getZ2()));
vectors.add(new Vector2d(dominion.getX1(), dominion.getZ2()));
Shape shape = new Shape(vectors);
double x = vectors.iterator().next().getX();
double z = vectors.iterator().next().getY();
double y = dominion.getY1();
Color line = new Color(0, 191, 255, 0.8F);
Color fill = new Color(0, 191, 255, 0.2F);
if (dominion.getParentDomId() != -1) { // for children dominion
line = new Color(240, 230, 140, 0.8F);
fill = new Color(240, 230, 140, 0.2F);
}
ExtrudeMarker marker = ExtrudeMarker.builder()
.label(dominion.getName())
.position(x, y, z)
.shape(shape, dominion.getY1(), dominion.getY2())
.lineColor(line)
.fillColor(fill)
.build(); .build();
markerSet.getMarkers()
.put(dominion.getName(), marker);
}
for (BlueMapMap map : world.getMaps()) { for (Integer id : world_dominions.getValue()) {
map.getMarkerSets().put(world_dominions.getKey() + "-" + markerSet.getLabel(), markerSet); DominionDTO dominion = Cache.instance.getDominion(id);
} Collection<Vector2d> vectors = new ArrayList<>();
}); vectors.add(new Vector2d(dominion.getX1(), dominion.getZ1()));
} vectors.add(new Vector2d(dominion.getX2(), dominion.getZ1()));
}); vectors.add(new Vector2d(dominion.getX2(), dominion.getZ2()));
vectors.add(new Vector2d(dominion.getX1(), dominion.getZ2()));
Shape shape = new Shape(vectors);
double x = vectors.iterator().next().getX();
double z = vectors.iterator().next().getY();
double y = dominion.getY1();
Color line = new Color(0, 191, 255, 0.8F);
Color fill = new Color(0, 191, 255, 0.2F);
if (dominion.getParentDomId() != -1) { // for children dominion
line = new Color(240, 230, 140, 0.8F);
fill = new Color(240, 230, 140, 0.2F);
}
ExtrudeMarker marker = ExtrudeMarker.builder()
.label(dominion.getName())
.position(x, y, z)
.shape(shape, dominion.getY1(), dominion.getY2())
.lineColor(line)
.fillColor(fill)
.build();
markerSet.getMarkers()
.put(dominion.getName(), marker);
}
for (BlueMapMap map : world.getMaps()) {
map.getMarkerSets().put(world_dominions.getKey() + "-" + markerSet.getLabel(), markerSet);
}
});
}
});
} catch (NoClassDefFoundError e) {
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。");
XLogger.err(e.getMessage());
}
} }
} }

View File

@ -22,13 +22,15 @@ public class Cache {
* 从数据库加载所有领地 * 从数据库加载所有领地
*/ */
public void loadDominions() { public void loadDominions() {
id_dominions = new HashMap<>();
world_dominions = new HashMap<>(); world_dominions = new HashMap<>();
List<DominionDTO> dominions = DominionDTO.selectAll(); List<DominionDTO> dominions = DominionDTO.selectAll();
for (DominionDTO d : dominions) { for (DominionDTO d : dominions) {
id_dominions.put(d.getId(), d);
if (!world_dominions.containsKey(d.getWorld())) { if (!world_dominions.containsKey(d.getWorld())) {
world_dominions.put(d.getWorld(), new ArrayList<>()); world_dominions.put(d.getWorld(), new ArrayList<>());
} }
world_dominions.get(d.getWorld()).add(d); world_dominions.get(d.getWorld()).add(d.getId());
} }
BlueMapConnect.render(); BlueMapConnect.render();
} }
@ -37,7 +39,6 @@ public class Cache {
* 从数据库加载所有玩家特权 * 从数据库加载所有玩家特权
*/ */
public void loadPlayerPrivileges() { public void loadPlayerPrivileges() {
player_current_dominion = new HashMap<>();
List<PlayerPrivilegeDTO> all_privileges = PlayerPrivilegeDTO.selectAll(); List<PlayerPrivilegeDTO> all_privileges = PlayerPrivilegeDTO.selectAll();
if (all_privileges == null) { if (all_privileges == null) {
XLogger.err("加载玩家特权失败"); XLogger.err("加载玩家特权失败");
@ -63,13 +64,12 @@ public class Cache {
* @return 玩家当前所在领地 * @return 玩家当前所在领地
*/ */
public DominionDTO getPlayerCurrentDominion(Player player) { public DominionDTO getPlayerCurrentDominion(Player player) {
DominionDTO dominion = player_current_dominion.get(player.getUniqueId()); Integer dominion_id = player_current_dominion.get(player.getUniqueId());
DominionDTO dominion = id_dominions.get(dominion_id);
if (dominion != null) { if (dominion != null) {
if (!isInDominion(dominion, player)) { if (!isInDominion(dominion, player)) {
// glow // glow
if (player.isGlowing()) { player.setGlowing(false);
player.setGlowing(false);
}
Notification.info(player, "您已离开领地:" + dominion.getName()); Notification.info(player, "您已离开领地:" + dominion.getName());
Notification.info(player, dominion.getLeaveMessage()); Notification.info(player, dominion.getLeaveMessage());
player_current_dominion.put(player.getUniqueId(), null); player_current_dominion.put(player.getUniqueId(), null);
@ -78,10 +78,11 @@ public class Cache {
} }
if (dominion == null) { if (dominion == null) {
String world = player.getWorld().getName(); String world = player.getWorld().getName();
List<DominionDTO> dominions = world_dominions.get(world); List<Integer> dominions_id = world_dominions.get(world);
if (dominions == null) return null; if (dominions_id == null) return null;
List<DominionDTO> in_dominions = new ArrayList<>(); List<DominionDTO> in_dominions = new ArrayList<>();
for (DominionDTO d : dominions) { for (Integer id : dominions_id) {
DominionDTO d = id_dominions.get(id);
if (isInDominion(d, player)) { if (isInDominion(d, player)) {
in_dominions.add(d); in_dominions.add(d);
} }
@ -89,20 +90,16 @@ public class Cache {
if (in_dominions.size() == 0) return null; if (in_dominions.size() == 0) return null;
in_dominions.sort(Comparator.comparingInt(DominionDTO::getId)); in_dominions.sort(Comparator.comparingInt(DominionDTO::getId));
dominion = in_dominions.get(in_dominions.size() - 1); dominion = in_dominions.get(in_dominions.size() - 1);
player_current_dominion.put(player.getUniqueId(), dominion); player_current_dominion.put(player.getUniqueId(), dominion.getId());
// glow // glow
PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion);
if (privilege != null) { if (privilege != null) {
if (privilege.getGlow()) { if (privilege.getGlow()) {
if (player.isGlowing()) { player.setGlowing(true);
player.setGlowing(true);
}
} }
} else { } else {
if (dominion.getGlow()) { if (dominion.getGlow()) {
if (player.isGlowing()) { player.setGlowing(true);
player.setGlowing(true);
}
} }
} }
Notification.info(player, "您正在进入领地:" + dominion.getName()); Notification.info(player, "您正在进入领地:" + dominion.getName());
@ -113,10 +110,11 @@ public class Cache {
public DominionDTO getDominion(Location loc) { public DominionDTO getDominion(Location loc) {
String world = loc.getWorld().getName(); String world = loc.getWorld().getName();
List<DominionDTO> dominions = world_dominions.get(world); List<Integer> dominions_id = world_dominions.get(world);
if (dominions == null) return null; if (dominions_id == null) return null;
List<DominionDTO> in_dominions = new ArrayList<>(); List<DominionDTO> in_dominions = new ArrayList<>();
for (DominionDTO d : dominions) { for (Integer id : dominions_id) {
DominionDTO d = id_dominions.get(id);
if (isInDominion(d, loc.getX(), loc.getY(), loc.getZ())) { if (isInDominion(d, loc.getX(), loc.getY(), loc.getZ())) {
in_dominions.add(d); in_dominions.add(d);
} }
@ -156,12 +154,17 @@ public class Cache {
z >= dominion.getZ1() && z <= dominion.getZ2(); z >= dominion.getZ1() && z <= dominion.getZ2();
} }
public Map<String, List<DominionDTO>> getWorldDominions() { public Map<String, List<Integer>> getWorldDominions() {
return world_dominions; return world_dominions;
} }
public DominionDTO getDominion(Integer id) {
return id_dominions.get(id);
}
public static Cache instance; public static Cache instance;
private Map<String, List<DominionDTO>> world_dominions; // 所有领地 private Map<Integer, DominionDTO> id_dominions;
private Map<String, List<Integer>> world_dominions; // 所有领地
private Map<UUID, Map<Integer, PlayerPrivilegeDTO>> player_uuid_to_privilege; // 玩家所有的特权 private Map<UUID, Map<Integer, PlayerPrivilegeDTO>> player_uuid_to_privilege; // 玩家所有的特权
private Map<UUID, DominionDTO> player_current_dominion; // 玩家当前所在领地 private Map<UUID, Integer> player_current_dominion; // 玩家当前所在领地
} }

View File

@ -64,7 +64,7 @@ public class FlagsController {
case "hook": return dominion.setHook(value); case "hook": return dominion.setHook(value);
case "ignite": return dominion.setIgnite(value); case "ignite": return dominion.setIgnite(value);
case "lever": return dominion.setLever(value); case "lever": return dominion.setLever(value);
case "mob_killing": return dominion.setMonsterKilling(value); case "monster_killing": return dominion.setMonsterKilling(value);
case "move": return dominion.setMove(value); case "move": return dominion.setMove(value);
case "place": return dominion.setPlace(value); case "place": return dominion.setPlace(value);
case "pressure": return dominion.setPressure(value); case "pressure": return dominion.setPressure(value);

View File

@ -161,7 +161,7 @@ public class PrivilegeController {
case "ignite": case "ignite":
privilege.setIgnite(value); privilege.setIgnite(value);
break; break;
case "mob_killing": case "monster_killing":
privilege.setMonsterKilling(value); privilege.setMonsterKilling(value);
break; break;
case "move": case "move":

View File

@ -7,6 +7,9 @@ import org.bukkit.entity.Player;
public class Apis { public class Apis {
public static boolean hasPermission(Player player, DominionDTO dom) { public static boolean hasPermission(Player player, DominionDTO dom) {
if (player.isOp()) {
return true;
}
if (dom == null) { if (dom == null) {
return true; return true;
} }

View File

@ -7,11 +7,13 @@ import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.utils.Notification; import cn.lunadeer.dominion.utils.Notification;
import io.papermc.paper.event.entity.EntityDyeEvent; import io.papermc.paper.event.entity.EntityDyeEvent;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.*; import org.bukkit.entity.*;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
@ -19,6 +21,7 @@ import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.*; import org.bukkit.event.player.*;
import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.spigotmc.event.entity.EntityMountEvent; import org.spigotmc.event.entity.EntityMountEvent;
public class PlayerEvents implements Listener { public class PlayerEvents implements Listener {
@ -348,7 +351,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // craft @EventHandler(priority = EventPriority.HIGHEST) // craft
public void onCraft(InventoryOpenEvent event) { public void onCraft(InventoryOpenEvent event) {
if (event.getInventory().getType() != InventoryType.CRAFTING) { if (event.getInventory().getType() != InventoryType.WORKBENCH) {
return; return;
} }
if (!(event.getPlayer() instanceof Player)) { if (!(event.getPlayer() instanceof Player)) {
@ -474,11 +477,10 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // dye @EventHandler(priority = EventPriority.HIGHEST) // dye
public void dyeEvent(EntityDyeEvent event) { public void dyeEvent(EntityDyeEvent event) {
Entity entity = event.getEntity(); Player player = event.getPlayer();
if (!(entity instanceof Player)) { if (player == null) {
return; return;
} }
Player player = (Player) entity;
DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player);
if (dom == null) { if (dom == null) {
return; return;
@ -618,7 +620,26 @@ public class PlayerEvents implements Listener {
} }
@EventHandler(priority = EventPriority.HIGHEST) // harvest @EventHandler(priority = EventPriority.HIGHEST) // harvest
public void onHarvest(PlayerHarvestBlockEvent event) { public void onHarvest(BlockBreakEvent event) {
Block block = event.getBlock();
if (block.getType() != Material.COCOA &&
block.getType() != Material.WHEAT &&
block.getType() != Material.CARROTS &&
block.getType() != Material.POTATOES &&
block.getType() != Material.BEETROOTS &&
block.getType() != Material.NETHER_WART &&
block.getType() != Material.SWEET_BERRY_BUSH &&
block.getType() != Material.MELON &&
block.getType() != Material.PUMPKIN &&
block.getType() != Material.SUGAR_CANE &&
block.getType() != Material.BAMBOO &&
block.getType() != Material.CACTUS &&
block.getType() != Material.CHORUS_PLANT &&
block.getType() != Material.CHORUS_FLOWER &&
block.getType() != Material.KELP &&
block.getType() != Material.KELP_PLANT) {
return;
}
Player player = event.getPlayer(); Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player);
if (dom == null) { if (dom == null) {
@ -720,6 +741,7 @@ public class PlayerEvents implements Listener {
} }
} }
Notification.error(player, "你没有点火的权限"); Notification.error(player, "你没有点火的权限");
event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.HIGHEST) // lever @EventHandler(priority = EventPriority.HIGHEST) // lever
@ -785,7 +807,7 @@ public class PlayerEvents implements Listener {
} }
@EventHandler(priority = EventPriority.HIGHEST) // move @EventHandler(priority = EventPriority.HIGHEST) // move
public void onPlayerMove(PlayerMoveEvent event){ public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player);
if (dom == null) { if (dom == null) {
@ -809,7 +831,7 @@ public class PlayerEvents implements Listener {
} }
@EventHandler(priority = EventPriority.HIGHEST) // place @EventHandler(priority = EventPriority.HIGHEST) // place
public void onPlace(BlockPlaceEvent event){ public void onPlace(BlockPlaceEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player);
if (dom == null) { if (dom == null) {
@ -829,6 +851,7 @@ public class PlayerEvents implements Listener {
} }
} }
Notification.error(player, "你没有放置方块的权限"); Notification.error(player, "你没有放置方块的权限");
event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.HIGHEST) // pressure @EventHandler(priority = EventPriority.HIGHEST) // pressure
@ -955,6 +978,7 @@ public class PlayerEvents implements Listener {
} }
} }
Notification.error(player, "你没有剪羊毛的权限"); Notification.error(player, "你没有剪羊毛的权限");
event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.HIGHEST) // shoot @EventHandler(priority = EventPriority.HIGHEST) // shoot
@ -962,7 +986,9 @@ public class PlayerEvents implements Listener {
if (!(event.getEntity().getShooter() instanceof Player)) { if (!(event.getEntity().getShooter() instanceof Player)) {
return; return;
} }
if (event.getEntity().getType() != EntityType.ARROW && event.getEntity().getType() != EntityType.SNOWBALL) { if (event.getEntity().getType() != EntityType.ARROW &&
event.getEntity().getType() != EntityType.SNOWBALL &&
event.getEntity().getType() != EntityType.TRIDENT) {
return; return;
} }
Player player = (Player) event.getEntity().getShooter(); Player player = (Player) event.getEntity().getShooter();
@ -983,7 +1009,7 @@ public class PlayerEvents implements Listener {
return; return;
} }
} }
Notification.error(player, "你没有发射弓箭或雪球的权限"); Notification.error(player, "你没有发射弓箭、三叉戟或雪球的权限");
event.setCancelled(true); event.setCancelled(true);
} }
@ -1018,14 +1044,11 @@ public class PlayerEvents implements Listener {
} }
@EventHandler(priority = EventPriority.HIGHEST) // vehicle_destroy @EventHandler(priority = EventPriority.HIGHEST) // vehicle_destroy
public void onVehicleDestroy(EntityDamageByEntityEvent event) { public void onVehicleDestroy(VehicleDestroyEvent event) {
if (!(event.getDamager() instanceof Player)) { if (!(event.getAttacker() instanceof Player)) {
return; return;
} }
if (!(event.getEntity() instanceof Vehicle)) { Player player = (Player) event.getAttacker();
return;
}
Player player = (Player) event.getDamager();
DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player);
if (dom == null) { if (dom == null) {
return; return;

View File

@ -140,11 +140,11 @@ public class DominionFlagInfo {
if (dominion.getCreeperExplode()) { if (dominion.getCreeperExplode()) {
view.add(Line.create() view.add(Line.create()
.append(Button.createGreen("", "/dominion set creeper_explode false " + dominion.getName() + " " + page)) .append(Button.createGreen("", "/dominion set creeper_explode false " + dominion.getName() + " " + page))
.append("苦力怕爆炸")); .append("苦力怕/凋零头颅爆炸"));
} else { } else {
view.add(Line.create() view.add(Line.create()
.append(Button.createRed("", "/dominion set creeper_explode true " + dominion.getName() + " " + page)) .append(Button.createRed("", "/dominion set creeper_explode true " + dominion.getName() + " " + page))
.append("苦力怕爆炸")); .append("苦力怕/凋零头颅爆炸"));
} }
if (dominion.getComparer()){ if (dominion.getComparer()){
view.add(Line.create() view.add(Line.create()
@ -347,11 +347,11 @@ public class DominionFlagInfo {
if (dominion.getShoot()) { if (dominion.getShoot()) {
view.add(Line.create() view.add(Line.create()
.append(Button.createGreen("", "/dominion set shoot false " + dominion.getName() + " " + page)) .append(Button.createGreen("", "/dominion set shoot false " + dominion.getName() + " " + page))
.append("射箭/雪球")); .append("射箭/雪球/三叉戟"));
} else { } else {
view.add(Line.create() view.add(Line.create()
.append(Button.createRed("", "/dominion set shoot true " + dominion.getName() + " " + page)) .append(Button.createRed("", "/dominion set shoot true " + dominion.getName() + " " + page))
.append("射箭/雪球")); .append("射箭/雪球/三叉戟"));
} }
if (dominion.getTntExplode()) { if (dominion.getTntExplode()) {
view.add(Line.create() view.add(Line.create()

View File

@ -335,11 +335,11 @@ public class PrivilegeInfo {
if (privilege.getShoot()) { if (privilege.getShoot()) {
view.add(Line.create() view.add(Line.create()
.append(Button.createGreen("", "/dominion set_privilege " + playerName + " shoot false " + dominion.getName() + " " + page)) .append(Button.createGreen("", "/dominion set_privilege " + playerName + " shoot false " + dominion.getName() + " " + page))
.append("射箭/雪球")); .append("射箭/雪球/三叉戟"));
} else { } else {
view.add(Line.create() view.add(Line.create()
.append(Button.createRed("", "/dominion set_privilege " + playerName + " shoot true " + dominion.getName() + " " + page)) .append(Button.createRed("", "/dominion set_privilege " + playerName + " shoot true " + dominion.getName() + " " + page))
.append("射箭/雪球")); .append("射箭/雪球/三叉戟"));
} }
if (privilege.getTrade()) { if (privilege.getTrade()) {
view.add(Line.create() view.add(Line.create()