标签: bukkit

数据库连接应始终保持打开状态还是仅在需要时打开?

我有一个bukkit插件(minecraft),需要连接到数据库.

数据库连接是否应始终保持打开状态,还是在需要时打开和关闭?

java mysql jdbc bukkit

26
推荐指数
2
解决办法
2万
查看次数

试图在3D世界中射击子弹.在x和z中经历奇数偏移

好吧,所以我使用的是Bukkit API(Minecraft),因为它使用最少,所以这不应该是一个太大的问题.因此,位置包含世界,x,y,z,偏航和俯仰.这可能会派上用场,但我对此表示怀疑.

我的问题是我使用Shot类(下图)进行拍摄,并且当距离大约3个街区时,两者之间似乎存在+ -5差异,并且HitBox被实例化大约5个街区(这可能是问题(移动/旋转方法)).我试过在纸上做这个,并且使用了半个记事本这样做,但我还没有找到解决方案.我需要的是能够很好地理解三角函数和java的人,所以他们可以提供帮助.

其他可能有用的信息:

  • + z是0度偏航,-x是90度,-z是180,+ x是270.
  • 变量似乎偶尔是不正确的,并且在某些情况下它们正常工作并构成命中.
  • Shot构造函数中的Location(from)参数是玩家在世界中的位置,因此from不是(0,0,0).
  • ShotData不应该影响任何值,因为在我的情况下风速和风向是0(如果涉及这个数学有问题,请随时告诉我,哈哈)
  • Pitch看起来很好,虽然+ y是-90,而-y是90(奇怪吧?)

所以我的问题是......问题出在哪里,我该如何解决?我很抱歉这是一个普遍的问题,而且这是一个非常普遍的问题,但这是真正必要的时候之一.我试图删除所有不必要的代码,但如果需要,您可以删除更多.此外,如果你想看到这里可能引用的任何其他东西,我可以帮你.

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)

java math bukkit

16
推荐指数
1
解决办法
486
查看次数

运行配置以在IntelliJ IDEA中调试Bukkit/Minecraft插件?

我正在帮助我的孩子学习创建Minecraft插件,尽管我对Java或IDEA没有多少经验.到目前为止一切运行良好,但为了执行我们的代码,我们必须:

  1. 在IDEA中创建项目(输出路径设置为Bukkit/plugins)
  2. 运行Bukkit服务器
  3. 启动Minecraft并连接

我不确定(3)可以做什么,但在我看来,IDEA应该能够一步完成(1)和(2).此外,我们目前无法使用此配置进行调试.

在Visual Studio/.NET中,我只需要指定可执行文件 - 在这种情况下为java/craftbukkit - 作为"外部程序",它将解决所有这些问题.但是在IDEA中,似乎我应该添加一个运行配置,而我没有看到允许任何类似"主机应用程序"的选项.相反,它想要完整的类路径到mainBukkit,我不清楚它会是什么.我还看到它在其他地方建议,如果没有Bukkit的调试版本,即使这样也行不通.但我真的不想调试Bukkit; 我只是想调试我们的插件代码.

我发现这些指令用于远程调试Bukkit插件,但这实际上是必要的吗?它没有解决"两步运行"问题; 它实际上让它变得更糟!

java debugging intellij-idea minecraft bukkit

12
推荐指数
1
解决办法
5531
查看次数

当创建两个或多个类的引用时,可销售菜单工具包字段会更改(使用GitHub)

我最近在我的Spigot/Bukkit插件中遇到了一个奇怪的错误,完全没有任何意义.请注意,这个问题可能很长,因为我正在处理的项目相当大,因为源代码(下面提供)包含不会包含在这里的类,我将尽力描述我的问题.

在Minecraft中,使用Bukkit API,您可以创建图形菜单(GUI),您可以在其中放置项目在某些插槽中,单击时,您可以调整功能.

在我的例子中,我创建了Menu基础类,其中包含创建此类菜单的基本方法.然后,PurchaseMenu扩展Menu类的用于触发特定位置的功能,以模拟可从菜单中单击的产品的事务.

在深度方面,我将包含的菜单包含"套件"显示(如游戏类),当一个左键单击显示器,玩家可以购买它,或者如果它已经购买,玩家将只选择该套件以供使用.当右键单击显示器时,播放器可以将套件升级到3.

在这两种情况下,都必须弹出一个交易菜单,以便购买或升级所点击的套件.我的设计非常简单,通过从每个PurchaseMenu类的构造函数传递单击的工具包.

以上所有问题都是套件从构造函数中正确传递,但实际购买或升级的套件是随机的(显然不是,但还没有找到任何证据),这通常发生在一些尝试.

我的设计:

  • 每个Menu类都包含两个方法.InventoryClick单击菜单显示(交互)时调用.InventoryConstruct在创建(打开)菜单时调用.
  • Purchase Menu类也包含两个方法.PurchaseProduct在成功购买显示器时调用.PrePaymentChecks是购买前需要进行的必要检查.

我的问题:

  • 如何修补该问题,并将正确的Kit保存在类的私有字段中?
  • 如何在某些项目中改进我的设计(方法)以避免此类问题?

任何形式的帮助表示赞赏,我希望我详细描述了我的问题,如果您需要任何进一步的源代码,请在下面发表评论.

更新

由于问题将超过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

java minecraft bukkit

9
推荐指数
1
解决办法
385
查看次数

java.lang.NoSuchMethodError当它显然存在时

一般信息:我在版本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 constructor exception bukkit

8
推荐指数
1
解决办法
765
查看次数

可以使用合成或桥接方法来平滑int - > double API更改吗?

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,这样就可以继续运行旧的插件.

但是,当有人试图扩展这些重命名方法的实现时,它们会从双重命名的方法中获得编译错误并覆盖.

有没有办法使用手动/工具插入的合成或桥接方法提供intdouble返回,这不会导致尝试更改部分API实现的人的编译错误

java minecraft bukkit

7
推荐指数
1
解决办法
214
查看次数

设计Bukkit插件框架 - 通过注释处理子命令

有些话介绍情况.

上下文:为了简化我的工作流程,同时编写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)

java api command frameworks bukkit

7
推荐指数
1
解决办法
1741
查看次数

如何通过活动打开自己的广告资源?

每当我拿起物品时,我都会尝试打开我的库存.这是在Bukkit.

到目前为止,这是事件,参数player.openInventory是空的.

@EventHandler
public void blank(PlayerDropItemEvent e){
    Player player = e.getPlayer();
    player.openInventory();
}
Run Code Online (Sandbox Code Playgroud)

java minecraft bukkit

7
推荐指数
1
解决办法
1060
查看次数

使模块jdk.incubator.httpclient在运行时可见

如何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)

构建Pom部分

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

java maven bukkit maven-shade-plugin java-9

7
推荐指数
1
解决办法
3265
查看次数

我在滥用静电吗?

为了将玩家伪装成另一个实体,我做了一个伪装课,你可以在这里看到:

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)

java bukkit

6
推荐指数
1
解决办法
491
查看次数