本帖最后由 aa0307bb 于 2020-7-2 17:01 编辑 
问题多而杂,可以选择性回答OTZ
①如何让掉落沙在落地瞬间被清除并播放方块破碎效果(如果你不知道我在说什么,演示在https://www.bilibili.com/video/BV1ys411y7gC的5分36秒)
②(不要使用原版指令或dispatch)如何选中玩家半径3米内的某种生物以方便对它们执行操作
(一种思路是,双重for循环,第一层for循环遍历地图所有在线玩家getOnlinePlayers,第二层for循环遍历地图所有实体,计算玩家到实体的距离,如果小于3米 就执行操作。但是这样似乎有点麻烦 而且会不会性能开销过大?)
③如何让射出的雪球也具有攻击力
④如何修改生物AI(比如让巨人僵尸拥有普通僵尸的寻路AI?)
问题多而杂,可以选择性回答OTZ
①如何让掉落沙在落地瞬间被清除并播放方块破碎效果(如果你不知道我在说什么,演示在https://www.bilibili.com/video/BV1ys411y7gC的5分36秒)
(一种思路是,双重for循环,第一层for循环遍历地图所有在线玩家getOnlinePlayers,第二层for循环遍历地图所有实体,计算玩家到实体的距离,如果小于3米 就执行操作。但是这样似乎有点麻烦 而且会不会性能开销过大?)
③如何让射出的雪球也具有攻击力
④如何修改生物AI(比如让巨人僵尸拥有普通僵尸的寻路AI?)
 本帖最后由 南柯郡守 于 2020-7-2 17:00 编辑 
你有看过文档吗?
https://papermc.io/javadocs/paper/1.12/overview-summary.html
好好翻一翻
另 琐碎
1. fallingblock
2. getNearByEntities
3. 雪球被扔出去后是一个实体
4. https://www.mcbbs.net/thread-1039885-1-1.html 不是教程
你有看过文档吗?
https://papermc.io/javadocs/paper/1.12/overview-summary.html
好好翻一翻
另 琐碎
1. fallingblock
2. getNearByEntities
3. 雪球被扔出去后是一个实体
4. https://www.mcbbs.net/thread-1039885-1-1.html 不是教程
 本帖最后由 aa0307bb 于 2020-7-2 17:07 编辑 
1.知道是fallingblock,但是以前试过用一个1tick/次的runTaskTimer来遍历所有掉落沙,如果掉落沙的onGround()==true则将其remove(),但是结果是没用呀……3.是Entity然后没有找到有接口能够设置实体造成的伤害呀
另外catserver你为什么给我paper的orz
1.知道是fallingblock,但是以前试过用一个1tick/次的runTaskTimer来遍历所有掉落沙,如果掉落沙的onGround()==true则将其remove(),但是结果是没用呀……3.是Entity然后没有找到有接口能够设置实体造成的伤害呀
另外catserver你为什么给我paper的orz
aa0307bb 发表于 2020-7-2 17:00
1.知道是fallingblock,但是以前试过用一个1tick/次的runTaskTimer来遍历所有掉落沙,如果掉落沙的onGroun ...
1. fallingblock落地之后就是方块了 应该取它落地的location 然后getblock 再 settype AIR
3. 取uuid 然后当它死亡/消失的时候 取最近的玩家判断距离 或者直接监听ProjectileHitEvent 取project判断type
为什么给paper自己悟
南柯郡守 发表于 2020-7-2 17:29
1. fallingblock落地之后就是方块了 应该取它落地的location 然后getblock 再 settype AIR
3. 取uuid ...
好的,谢谢!
遇到一个问题,产生的雪球的位置如果离玩家太近,会砸到发射者自己(特别是向下砸的时候)
但是原版产生雪球的位置本来就离玩家很近还不会砸到发射者。这个怎么解决
aa0307bb 发表于 2020-7-2 18:30
好的,谢谢!
遇到一个问题,产生的雪球的位置如果离玩家太近,会砸到发射者自己(特别是向下砸的时候)
...
盲猜原版雪球生成时离玩家距离在碰撞箱以外
aa0307bb 发表于 2020-7-2 18:30
好的,谢谢!
遇到一个问题,产生的雪球的位置如果离玩家太近,会砸到发射者自己(特别是向下砸的时候)
...
或者你可以试着监听发射投掷物的事件 存到Map里?
 本帖最后由 Ir.Nep 于 2020-7-2 20:45 编辑 
1、监听EntityChangeBlockEvent,判断事件实体类型(event.getEntityType())是否为掉落方块,是则获取实体转型为FallingBlock,获取掉落方块的材质并判断是否为沙子,是则取消事件并移除实体并执行你接下来的操作
2、见楼下
3、让雪球有命中伤害,监听ProjectileHitEvent,判断projectile类型,并判断getHitEntity是否不为空,是则对实体造成伤害
4、bbs有很多关于AI的教程,传送门
1、监听EntityChangeBlockEvent,判断事件实体类型(event.getEntityType())是否为掉落方块,是则获取实体转型为FallingBlock,获取掉落方块的材质并判断是否为沙子,是则取消事件并移除实体并执行你接下来的操作
2、见楼下
3、让雪球有命中伤害,监听ProjectileHitEvent,判断projectile类型,并判断getHitEntity是否不为空,是则对实体造成伤害
4、bbs有很多关于AI的教程,传送门
对于雪球击中发射者的问题,可以修改雪球nms实例的属性ticksLived
原理是投掷物(projectile)在进行实体命中判断的时候,会检查ticksLived是否小于2,如果小于2,则判断该实体是否为发射者,是的话将不会击中该实体。
因此可以对ticksLived进行修改,一直令其值小于2
原理是投掷物(projectile)在进行实体命中判断的时候,会检查ticksLived是否小于2,如果小于2,则判断该实体是否为发射者,是的话将不会击中该实体。
因此可以对ticksLived进行修改,一直令其值小于2
Ir.Nep 发表于 2020-7-2 18:49
1、监听EntityChangeBlockEvent,判断事件实体类型(event.getEntityType())是否为掉落方块,是则获取实体转 ...
3.https://bukkit.windit.net/javado ... ileLaunchEvent.html
https://bukkit.windit.net/javado ... ectileHitEvent.html
没所谓的collide event(1.15.2Bukkit中文文档)
而1.16的spigot官方英文文档,比起1.15
含有projectile的类(无框架ALL classes)只增加了一个throwable Projectile
并没有你这个事件监听
所谓“往上的版本则监听ProjectileCollideEvent”,不敢苟同。
Ir.Nep 发表于 2020-7-2 19:04
对于雪球击中发射者的问题,可以修改雪球nms实例的属性ticksLived
原理是投掷物(projectile)在进行实体命中 ...
如果你是想要不让雪球击中发射者
那为什么不使用
https://bukkit.windit.net/javado ... e.html#getShooter--
毕竟你都说了,是“判断该实体是不是发射者”
那么你假设的情景显然是实体直接发射雪球了
没必要强行动nms
当然如果是强行spawn entity 得到的雪球
那可以自己建立玩家UUID与雪球UUID的相关对应
更不需要ticks lived
也更方便
William_Shi 发表于 2020-7-2 20:09
如果你是想要不让雪球击中发射者
那为什么不使用
https://bukkit.windit.net/javadoc/org/bukkit/entity/ ...
如果是强行spawn entity 得到的雪球
自己建立玩家UUID与雪球UUID的相关对应
这个是什么意思?雪球可以存放发射者UUID,从而避免打中发射者?
如果的确如此,又该怎样做?
查了下API,好像是
setShooter(ProjectileSource source)
Set the shooter of this projectile.
可是这个ProjectileSource source咋填?(或者我找错API了?
Ir.Nep 发表于 2020-7-2 19:04
对于雪球击中发射者的问题,可以修改雪球nms实例的属性ticksLived
原理是投掷物(projectile)在进行实体命中 ...
对ticksLived进行修改,一直令其值小于2
一直小于2岂不是什么实体也打不着?OTZ
aa0307bb 发表于 2020-7-2 20:33
这个是什么意思?雪球可以存放发射者UUID,从而避免打中发射者?
如果的确如此,又该怎样做?
你拿一个map存起来,监听雪球击中的时候读取
如果是发射者,就取消事件
aa0307bb 发表于 2020-7-2 20:33
这个是什么意思?雪球可以存放发射者UUID,从而避免打中发射者?
如果的确如此,又该怎样做?
接口 ProjectileSource
所有已知子接口:
AbstractHorse, AbstractVillager, Ageable, Ambient, Animals, ArmorStand, Bat, Bee, Blaze, BlockProjectileSource, Cat, CaveSpider, ChestedHorse, Chicken, Cod, ComplexLivingEntity, Cow, Creature, Creeper, Dolphin, Donkey, Drowned, ElderGuardian, EnderDragon, Enderman, Endermite, Evoker, Fish, Flying, Fox, Ghast, Giant, Golem, Guardian, Horse, HumanEntity, Husk, Illager, Illusioner, IronGolem, LivingEntity, Llama, MagmaCube, Mob, Monster, Mule, MushroomCow, NPC, Ocelot, Panda, Parrot, Phantom, Pig, PigZombie, Pillager, Player, PolarBear, PufferFish, Rabbit, Raider, Ravager, Salmon, Sheep, Shulker, Silverfish, Skeleton, SkeletonHorse, Slime, Snowman, Spellcaster, Spider, Squid, Stray, TraderLlama, TropicalFish, Turtle, Vex, Villager, Vindicator, WanderingTrader, WaterMob, Witch, Wither, WitherSkeleton, Wolf, Zombie, ZombieHorse, ZombieVillager
Ir.Nep 发表于 2020-7-2 18:49
1、监听EntityChangeBlockEvent,判断事件实体类型(event.getEntityType())是否为掉落方块,是则获取实体转 ...
问一下,spawnparticle()要产生blockcrack颗粒
spawnParticle
<T> void spawnParticle(Particle particle,
double x,
double y,
double z,
int count,
double offsetX,
double offsetY,
double offsetZ,
double extra,
T data,
boolean force)
如果要产生掉落沙对应方块被破坏时的粒子效果,这个spawnParticle该怎样填?(extra和data)
 本帖最后由 Ir.Nep 于 2020-7-3 08:25 编辑 
extra不用填,只填data
方块被破坏的粒子是Particle.BLOCK_CRACK
对应spawnParticle中data要填MaterialData
即复制代码
注意1.13开始BLOCK_CRACK的对应data改用BlockData
建议在传入data前使用Particle.BLOCK_CRACK.getDataType()判断返回值(返回的是data应该传入的实例的类型)
aa0307bb 发表于 2020-7-3 03:09
问一下,spawnparticle()要产生blockcrack颗粒
如果要产生掉落沙对应方块被破坏时的粒子效果,这个spawn ...
extra不用填,只填data
方块被破坏的粒子是Particle.BLOCK_CRACK
对应spawnParticle中data要填MaterialData
即
- spawnParticle(Particle.BLOCK_CRACK, 位置, 数量, new MaterialData(Material.你的方块材质, 附加值));
注意1.13开始BLOCK_CRACK的对应data改用BlockData
建议在传入data前使用Particle.BLOCK_CRACK.getDataType()判断返回值(返回的是data应该传入的实例的类型)
Ir.Nep 发表于 2020-7-3 08:23
extra不用填,只填data
方块被破坏的粒子是Particle.BLOCK_CRACK
对应spawnParticle中data要填MaterialDat ...
spawnParticle的参数填起来好像十分多变(?
这些是在哪可以查到的(好像API查不到(?
aa0307bb 发表于 2020-7-3 17:14
spawnParticle的参数填起来好像十分多变(?
这些是在哪可以查到的(好像API查不到(? ...
https://hub.spigotmc.org/javadoc ... -double-double-int-
从这里开始往下14个方法都是spawnPartcle的重载方法
aa0307bb 发表于 2020-7-3 17:14
spawnParticle的参数填起来好像十分多变(?
这些是在哪可以查到的(好像API查不到(? ...
spawnParticle
<T> void spawnParticle(@NotNull
@NotNull Particle particle,
@NotNull
@NotNull Location location,
int count,
@Nullable
T data)
Spawns the particle (the number of times specified by count) at the target location.
Type Parameters:
T - type of particle data (see Particle.getDataType()
Parameters:
particle - the particle to spawn
location - the location to spawn at
count - the number of particles
data - the data to use for the particle or null, the type of this depends on Particle.getDataType()
人家泛型都说清楚了
T - type of particle data (see Particle.getDataType()
@NotNull Class<?> getDataType()
Returns the required data type for the particle
那你看到Class<?>难道不输出一下class simplename 试试看?
而且输出这个根本不需要开服
你直接新建一个ant项目,main方法直接输出就行了吧,不是很快么
再不济你写个测试插件丢服务端输出
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println(Particle.BLOCK_CRACK.getDataType().getSimpleName());
}
run:
BlockData
BUILD SUCCESSFUL (total time: 1 second)
所以泛型传参BlockData,完事了(1.15.2
 本帖最后由 aa0307bb 于 2020-7-4 02:33 编辑 
感谢指引
顺着思路摸了一下瓜
复制代码
就可以一劳永逸了
William_Shi 发表于 2020-7-3 20:07
/**
* @param args the command line arguments
*/
感谢指引
顺着思路摸了一下瓜
- for(Particle p : Particle.values()) {                        
 
-                         System.out.println(p+":"+p.getDataType().getSimpleName());
 
- }