我正在制作一个名为Minecraft with Bukkit API的游戏插件.

我有一个名为Reinforcements的数据库表,其中包含以下字段:x integer,y integer,z integer.加固块是受保护的块,意味着它不能被破坏.

我正在使用EntityExplodeEvent来检查TNT爆炸.

我遍历event.blocklist()并将每个块与Reinforcements表中的条目进行比较.如果存在,则使用event.blocklist().remove来防止在爆炸中对Reinforced块的损坏.

我可以通过获取每个坐标(x,y,z)的最小和最大,然后检查这两个数字之间的数据库行来实现.这个问题是它是一个立方体.我应该检查球体.我该怎么做呢?

这是我到目前为止所得到的,请注意:我知道这不是一个select语句的问题,因为我可以将返回的行与event.blocklist()进行比较,但我需要知道如何在我执行此操作时稍后再去做一个更新声明.

我之所以需要知道如何检查球体中的行是因为最终我会在Reinforcements表中添加一个额外的字段,称为“耐久性整数”,它会在每次爆炸后减少.由于爆炸是一个球体,因此更新查询应该只更新该球体中的行,而不是多维数据集.

任何人?

谢谢

当前的MySQL查询

"SELECT X, Y, Z FROM REINFORCEMENTS WHERE DURABILITY >= 1 " +

"AND x<=? AND x>=? AND y<=? AND y>=? AND z<=? AND z>=? AND world=?");

完整的代码

@EventHandler

public void checkForExplosion(EntityExplodeEvent event){

if(event.isCancelled()){

return;

}

//Store blocks that are inside explosion's blast radius

List blastRadiusBlocks = event.blockList();

//If explosion occurs in mid air it returns 0 so no need to go any

//further since there are no blocks inside the explosions radius

if(blastRadiusBlocks.size() < 1){

return;

}

HashMap affectedBlocks = new HashMap();

//Initialize min & max X,Y,Z coordinates

int smallestX = blastRadiusBlocks.get(0).getX();

int largestX = smallestX;

int smallestY = blastRadiusBlocks.get(0).getY();

int largestY = smallestY;

int smallestZ = blastRadiusBlocks.get(0).getZ();

int largestZ = smallestZ;

//World Name

String worldName = blastRadiusBlocks.get(0).getWorld().getName();

World world = this.myPlugin.getServer().getWorld(worldName);

//Find min & max X,Y,Z coordinates

for(int i = 0; i < blastRadiusBlocks.size(); i++){

Block block = blastRadiusBlocks.get(i);

int blockX = block.getX();

int blockY = block.getY();

int blockZ = block.getZ();

if(blockX < smallestX){

smallestX = blockX;

}

if(blockX > largestX){

largestX = blockX;

}

if(blockY < smallestY){

smallestY = blockY;

}

if(blockY > largestY){

largestY = blockY;

}

if(blockZ < smallestZ){

smallestZ = blockZ;

}

if(blockZ > largestZ){

largestZ = blockZ;

}

//Instantiate Coordinate class passing in parameters

Coordinate coordinate = new Coordinate(world, blockX, blockY, blockZ);

//Put a new entry of type Coordinate as key and type Block as value

affectedBlocks.put(coordinate, block);

}

try {

//Query database for any reinforced blocks that may be in the blast radius

//Reinforced blocks should have a durability > 0 (aka >= 1)

PreparedStatement ask = this.conn.prepareStatement(

"SELECT X, Y, Z FROM REINFORCEMENTS WHERE DURABILITY >= 1 " +

"AND x<=? AND x>=? AND y<=? AND y>=? AND z<=? AND z>=? AND world=?");

ask.setInt(1, largestX);

ask.setInt(2, smallestX);

ask.setInt(3, largestY);

ask.setInt(4, smallestY);

ask.setInt(5, largestZ);

ask.setInt(6, smallestZ);

ask.setString(7, worldName);

ask.execute();

ResultSet result = ask.getResultSet();

//If there was some found, loop through each one

while(result.next()){

//Get X,Y,Z coords of reinforced block

int x = result.getInt(1);

int y = result.getInt(2);

int z = result.getInt(3);

//Pass in x, y, z of reinforced block into affectedBlocks HashMap to instantiate a Block

Block protectedBlock = affectedBlocks.get(new Coordinate(world, x, y, z));

//Then remove the protectedBlock from explosion list

event.blockList().remove(protectedBlock);

}

result.close();

ask.close();

} catch (SQLException e) {

System.err.println("Citadel - Select Reinforcement can't keep up (possibly too many explosions):\n" + e);

}

}

解决方法:

SELECT X, Y, Z FROM REINFORCEMENTS

WHERE DURABILITY >= 1

AND world=?

AND (POW((X-?),2)+POW((Y-?),2)+POW((Z-?),2))

参数为woldID,爆炸的X,Y,Z和爆炸半径

标签:java,mysql,minecraft

来源: https://codeday.me/bug/20190626/1291414.html

Java mysql获取行数_java – MySQL查询获取球体中的行(X,Y,Z坐标)?相关推荐

  1. python excel行数_使用python计算excel中的行数

    你的问题有点不清楚,如果你能给我们提供一个可以重复的例子来说明你所做的,你的问题可能会得到改善.不过,我想这可能是你想要的?在import pandas as pd data = {'foo':[5, ...

  2. java excel 列数_JAVA使用POI获取Excel的列数与行数

    前言 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑.Java程序由于其跨平台特性,不能直接操纵Excel.因此,本文探讨一下POI视线Java程序进 ...

  3. JAVA判断sheet有效行数_Java 利用POI 读取指定excel的真实行数

    Java 使用poi包 读excel文件时,获取指定sheet页中数据行数可以通过调用 sheet.getLastRowNum() ;但这种方法仅限于当前sheet页中没有带格式的空白行时.如果其中一 ...

  4. jdbc获取结果行数_java – 如何判断从JDBC执行更改的行数

    我不确定如何从SQL执行中获取受影响的行数. 我喜欢这个: boolean isResultSet = statement.execute(arbitrarySQLCommand); 我可以从getU ...

  5. java读取csv文件行数_java读取巨大csv的行数

    我有超过700K行的巨大csv行数.我必须解析那些csv的行和do ops.我想通过使用线程来做到这一点.我第一次尝试做的很简单.每个线程都应该有唯一的csv行.我只有有限的行数只能读到3000.我创 ...

  6. mysql jdbc连接 优化_java+mysql连接的优化

    作者通过经历的一个项目实例,介绍Java代码优化的过程,总结了优化Java程序的一些最佳实践,分析了进行优化的方法,并解释了性能提升的原因.作者从多个角度分析导致性能低的原因,并逐个进行优化,最终使得 ...

  7. mysql数据库的行级锁有几种_MySQL中的行级锁、表级锁、页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...

  8. mysql中文乱码解决_java+mysql中文乱码问题

    乱码问题原因有多种,其中有一种是由于MySQL默认使用 ISO-8859-1 ( 即Latin1 ) 字符集,而JAVA内部使用Unicode编码,因此在JAVA中向MYSQL数据库插入数据时,或者读 ...

  9. java 获取webcontent目录_java web项目获取src和WebContent目录下的配置文件

    1.首先上目录结构: 2.部署到tomcat,在servlet中测试,测试代码: package test; import java.io.IOException; import java.io.In ...

最新文章

  1. 一鼓作气 博客--第六篇 note6
  2. .net 刷新页面防止表单二次提交
  3. mysql连接非常慢的觖决办法及其它常见问题解决办法
  4. 蚊子132谈IT团队工作的态度和技巧
  5. android 字体 动画,android 对绘制的文本添加动画
  6. R语言数据挖掘1.9.1 机器学习方法
  7. 爱奇艺、芒果TV相继涨价,长视频开启新一轮“加价不加量”游戏?
  8. 数据库学习整理之常见运算符
  9. python 绘图函数_python绘图函数
  10. TiDB EcoSystem Tools 原理解读(一):TiDB-Binlog 架构演进与实现原理
  11. mysql大于等于号
  12. 钟道隆逆向英语学习法—学习SpeciaI English的三个阶段
  13. printf二进制数据
  14. 【读书笔记】小狗钱钱
  15. AlexNet网络介绍
  16. UDP/ICMP协议简介
  17. UML--顺序图绘制
  18. html里用js实现随机抽奖,js实现简单随机抽奖的方法
  19. 110配线架打法图解_配线架打线的方法以及110配线架的按照流程
  20. 从零学习 InfiniBand-network架构(十) —— IB协议中全局ID

热门文章

  1. 分布式事务-常见解决方案
  2. (一)改掉这些坏习惯,还怕写不出健壮的代码?
  3. 中文单栏latex模板
  4. 图像识别平台建设之路(自建+三方产品)
  5. 欧姆龙程序PLC案例标准程序 使用欧姆龙CP1H写的脉冲伺服 步进控制程序案例
  6. 统计学(五):非参数检验
  7. 【转载】国内主要的量化交易平台及链接
  8. pyqt5中QGraphicsView弹出菜单
  9. java 事物 notsupport_Spring事务传播属性介绍(二).mandatory、not_supported、never、supports...
  10. android程序开发笔记