我有一个bukkit插件(minecraft),需要连接到数据库.
数据库连接是否应始终保持打开状态,还是在需要时打开和关闭?
好吧,所以我使用的是Bukkit API(Minecraft),因为它使用最少,所以这不应该是一个太大的问题.因此,位置包含世界,x,y,z,偏航和俯仰.这可能会派上用场,但我对此表示怀疑.
我的问题是我使用Shot类(下图)进行拍摄,并且当距离大约3个街区时,两者之间似乎存在+ -5差异,并且HitBox被实例化大约5个街区(这可能是问题(移动/旋转方法)).我试过在纸上做这个,并且使用了半个记事本这样做,但我还没有找到解决方案.我需要的是能够很好地理解三角函数和java的人,所以他们可以提供帮助.
其他可能有用的信息:
所以我的问题是......问题出在哪里,我该如何解决?我很抱歉这是一个普遍的问题,而且这是一个非常普遍的问题,但这是真正必要的时候之一.我试图删除所有不必要的代码,但如果需要,您可以删除更多.此外,如果你想看到这里可能引用的任何其他东西,我可以帮你.
Shot.java:
private final Location from;
private ShotData data;
public Shot(Location from, ShotData data) {
this.from = from;
this.data = data;
}
// TODO - Checking for obstacles
public List<Hit> shoot(List<HitBox> hitBoxes) {
List<Hit> hits = new ArrayList<Hit>();
for (HitBox hitBox : hitBoxes) {
hitBox.update();
float fromYaw = from.getYaw() % 360;
float fromPitch = from.getPitch() % 360;
// making sure the center location is within …Run Code Online (Sandbox Code Playgroud) 我正在帮助我的孩子学习创建Minecraft插件,尽管我对Java或IDEA没有多少经验.到目前为止一切运行良好,但为了执行我们的代码,我们必须:
Bukkit/plugins)我不确定(3)可以做什么,但在我看来,IDEA应该能够一步完成(1)和(2).此外,我们目前无法使用此配置进行调试.
在Visual Studio/.NET中,我只需要指定可执行文件 - 在这种情况下为java/craftbukkit - 作为"外部程序",它将解决所有这些问题.但是在IDEA中,似乎我应该添加一个运行配置,而我没有看到允许任何类似"主机应用程序"的选项.相反,它想要完整的类路径到mainBukkit,我不清楚它会是什么.我还看到它在其他地方建议,如果没有Bukkit的调试版本,即使这样也行不通.但我真的不想调试Bukkit; 我只是想调试我们的插件代码.
我发现这些指令用于远程调试Bukkit插件,但这实际上是必要的吗?它没有解决"两步运行"问题; 它实际上让它变得更糟!
我最近在我的Spigot/Bukkit插件中遇到了一个奇怪的错误,完全没有任何意义.请注意,这个问题可能很长,因为我正在处理的项目相当大,因为源代码(下面提供)包含不会包含在这里的类,我将尽力描述我的问题.
在Minecraft中,使用Bukkit API,您可以创建图形菜单(GUI),您可以在其中放置项目在某些插槽中,单击时,您可以调整功能.
在我的例子中,我创建了Menu基础类,其中包含创建此类菜单的基本方法.然后,PurchaseMenu扩展Menu类的用于触发特定位置的功能,以模拟可从菜单中单击的产品的事务.
在深度方面,我将包含的菜单包含"套件"显示(如游戏类),当一个左键单击显示器,玩家可以购买它,或者如果它已经购买,玩家将只选择该套件以供使用.当右键单击显示器时,播放器可以将套件升级到3.
在这两种情况下,都必须弹出一个交易菜单,以便购买或升级所点击的套件.我的设计非常简单,通过从每个PurchaseMenu类的构造函数传递单击的工具包.
以上所有问题都是套件从构造函数中正确传递,但实际购买或升级的套件是随机的(显然不是,但还没有找到任何证据),这通常发生在一些尝试.
我的设计:
InventoryClick单击菜单显示(交互)时调用.InventoryConstruct在创建(打开)菜单时调用.PurchaseProduct在成功购买显示器时调用.PrePaymentChecks是购买前需要进行的必要检查.我的问题:
任何形式的帮助表示赞赏,我希望我详细描述了我的问题,如果您需要任何进一步的源代码,请在下面发表评论.
由于问题将超过30k字符,我将整个项目上传到Git存储库.
https://github.com/parat26/core
Menu.java:https://github.com/parat26/core/blob/master/src/src/ares/core/menu/Menu.java
PurchaseMenu.java:https://github.com/parat26/core/blob/master/src/src/ares/core/menu/PurchaseMenu.java
BattleOptionsMenu.java:https://github.com/parat26/core/blob/master/src/src/ares/core/menu/type/MenuBattleOptions.java
PurchaseMenuKit.java: https://github.com/parat26/core/blob/master/src/src/ares/core/menu/type/PurchaseMenuKit.java
一般信息:我在版本git-Spigot-1d14d5f-ba32592(MC:1.8.3)(实现API版本1.8.3-R0.1-SNAPSHOT),IntelliJ IDEA 14.1.3中使用Bukkit/Spigot API并使用它的默认编译器.java jdk版本是1.8.0_25.
因此,当我尝试调用此类的构造函数时,它会从标题中抛出运行时异常.
package me.lakan.util.inventory;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("unused") // Util functionality is not always used
public class InventoryMenu implements Listener {
private InventoryType type;
private String title;
private Map<Integer, MenuOption> options;
// Constructors
public InventoryMenu(InventoryType type, String title, JavaPlugin plugin) {
this.options = new HashMap<Integer, MenuOption>();
this.type = type;
this.title = title;
plugin.getServer().getPluginManager().registerEvents(this, …Run Code Online (Sandbox Code Playgroud) Java在被称为synthetic和的方法上有特殊的标记bridge.
JLS 13.1.7,"源代码中没有相应构造的Java编译器引入的任何构造都必须标记为合成的 ......"
因此,合成方法是由编译器生成的任何内容,而不是在源代码中表示,虽然在规范PDF中没有提到它,但是桥接方法用于类比检查泛型.(例如,Animal.interactWith(Creature c)获取一个桥接方法interactWith(Object c),该方法转换为Creature并调用另一个方法.)
我们有这个名为Bukkit的API,它可以提供稳定的访问权限来改变Minecraft服务器的工作方式.API的底层实现(aka vanilla Minecraft)的一个方面,我们几乎无法控制,最近被迫在版本1.6.1中从整数值更改为浮点值.为了避免另一个变化的困难,我们选择将所有API方法更改为doubles.
所以,例如:
public int getHealth();
public void setHealth(int health);
// Must now be
public double getHealth();
public void setHealth(double health);
Run Code Online (Sandbox Code Playgroud)
但是,和往常一样,我们希望使用以前版本编译的插件1.5.2尽可能地工作 - 这就是API的重点.
这setHealth是一个解决的问题,只是引入一个过载.目前,我们有一个名为的方法_INVALID_getHealth(V)I,它在实现编译时重命名(而不是 API编译)getHealth(V)I,这样就可以继续运行旧的插件.
但是,当有人试图扩展这些重命名方法的实现时,它们会从双重命名的方法中获得编译错误并覆盖.
有没有办法使用手动/工具插入的合成或桥接方法提供int和double返回,这不会导致尝试更改部分API实现的人的编译错误?
上下文:为了简化我的工作流程,同时编写Bukkit插件(Minecraft服务器基本上是事实上的API,直到Sponge实现它),我决定为自己整理一个"迷你框架",不必重复同样的任务一遍又一遍.(另外,我正在尝试将其设计为不太依赖Bukkit,所以我可以通过更改我的实现继续在Sponge上使用它)
意图:坦率地说,Bukkit中的命令处理是一团糟.你必须在YML文件中定义你的root命令(例如,你想运行/测试ingame,"test"是root)(而不是调用某种工厂?),子命令处理是不存在的,实现细节是隐藏所以产生100%可靠的结果很难.这是Bukkit唯一让我恼火的部分,它是我决定编写框架的主要发起人.
目标:抽象出令人讨厌的Bukkit命令处理,并将其替换为干净的东西.
这将是一个很长的段落,我将解释最初如何实现Bukkit命令处理,因为这将更深入地理解重要的命令参数等.
连接到Minecraft服务器的任何用户都可以使用"/"开始聊天消息,这将导致它被解析为命令.
举一个例子,Minecraft中的任何玩家都有一个生命栏,默认设置为10个心脏,并在受到伤害时耗尽.服务器可以随时设置最大和当前"心脏"(读取:运行状况).
让我们说我们想要定义这样的命令:
/sethealth <current/maximum> <player or * for all> <value>
Run Code Online (Sandbox Code Playgroud)
要开始实现这个......哦,小男孩.如果你喜欢干净的代码,我会说跳过这个...我会评论解释,每当我觉得Bukkit做错了.
强制性plugin.yml:
# Full name of the file extending JavaPlugin
# My best guess? Makes lazy-loading the plugin possible
# (aka: just load classes that are actually used by replacing classloader methods)
main: com.gmail.zkfreddit.sampleplugin.SampleJavaPlugin
# Name of the plugin.
# Why not have this as an annotation on the plugin class?
name: SamplePlugin
# Version of the plugin. Why …Run Code Online (Sandbox Code Playgroud) 每当我拿起物品时,我都会尝试打开我的库存.这是在Bukkit.
到目前为止,这是事件,参数player.openInventory是空的.
@EventHandler
public void blank(PlayerDropItemEvent e){
Player player = e.getPlayer();
player.openInventory();
}
Run Code Online (Sandbox Code Playgroud) 如何jdk.incubator.httpclient在运行时使模块中的类可见?
Java 9 + Maven + HttpClient jdk.incubator.http.HttpClient
=>使用时Maven构建失败jdk.incubator.HttpClient.修正了与这个问题由于@nullpointer
=>运行时堆栈跟踪:
java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient
at com.foo.Bar.Bar.<clinit>(Bar.java:56) ~[?:?]
at java.lang.Class.forName0(java.base@9-Ubuntu/Native Method) ~[?:?]
at java.lang.Class.forName(java.base@9-Ubuntu/Class.java:374) ~[?:?]
Caused by: java.lang.ClassNotFoundException: jdk.incubator.http.HttpClient
at java.net.URLClassLoader.findClass(java.base@9-Ubuntu/URLClassLoader.java:388) ~[?:?]
at java.lang.ClassLoader.loadClass(java.base@9-Ubuntu/ClassLoader.java:486) ~[?:?]
at java.lang.ClassLoader.loadClass(java.base@9-Ubuntu/ClassLoader.java:419) ~[?:?]
at com.foo.Bar.Bar.<clinit>(Bar.java:56) ~[?:?]
at java.lang.Class.forName0(java.base@9-Ubuntu/Native Method) ~[?:?]
at java.lang.Class.forName(java.base@9-Ubuntu/Class.java:374) ~[?:?]
Run Code Online (Sandbox Code Playgroud)
<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>${project.basedir}/src</sourceDirectory>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>${project.basedir}/resources</directory>
<includes>
<include>plugin.yml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version> …Run Code Online (Sandbox Code Playgroud) 为了将玩家伪装成另一个实体,我做了一个伪装课,你可以在这里看到:
public class Disguise
{
private static HashSet<Disguise> disguises = new HashSet<>();
private net.minecraft.server.v1_8_R2.EntityLiving nmsEntity;
private Player disguise;
public Disguise(Player disguise, EntityLiving entity, boolean affectLogin)
{
if(affectLogin)
disguises.add(this);
this.disguise = disguise;
this.nmsEntity = entity;
}
public Disguise(Player disguise, EntityLiving entity)
{
this(disguise, entity, true);
}
public void send(Player visible)
{
if(visible == disguise)
return;
EntityPlayer player = NMSUtils.getNMSPlayer(visible);
nmsEntity.setPosition(player.locX, player.locY, player.locZ);
nmsEntity.d(disguise.getEntityId());
nmsEntity.setCustomName(disguise.getDisplayName());
nmsEntity.setCustomNameVisible(true);
PacketPlayOutSpawnEntityLiving spawn = new PacketPlayOutSpawnEntityLiving(nmsEntity);
PacketPlayOutEntityDestroy destroy = new PacketPlayOutEntityDestroy(disguise.getEntityId());
player.playerConnection.sendPacket(destroy);
player.playerConnection.sendPacket(spawn);
}
public void send(List<Player> …Run Code Online (Sandbox Code Playgroud)