Пуля

svk

1,185
3
Спавню я пулю, и спавнится она, и на клиенте, и на сервере...

Код:
                    Vec3 movingobjectposition = player.getLookVec();
                    EntityBullet bullet = [myBullet];
                    bullet.setPosition(x, y, z);
                    bullet.bylletMotionX = movingobjectposition.xCoord;
                    bullet.bylletMotionY = movingobjectposition.yCoord;
                    bullet.bylletMotionZ = movingobjectposition.zCoord;
            
                    world.spawnEntityInWorld(bullet);
Но 2 клиент, не видет мою пулю и все партиклы которые она спавнит. Однако она есть на сервере, и убивает мобов.

В чём может быть проблема?
Код:
package com.svk.industrialGuns.entity;

import java.util.Random;

import com.svk.industrialGuns.client.particle.ColoredParticleCloud;
import com.svk.industrialGuns.client.particle.ColoredParticleCube;
import com.svk.industrialGuns.client.particle.ColoredParticleCubeHeap;
import com.svk.industrialGuns.client.particle.ColoredParticleTrail;

import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityThrowable;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;

public class EntityIominatorShell extends EntityBullet
{
    public EntityIominatorShell(World world, EntityLivingBase entity) 
    {
        super(world, entity);
    }
    
    @Override
    public void onUpdate()
    {
        super.onUpdate();
        
        life++;
        if(life > 120)
        {
            this.setDead();
        }
        
        this.motionX = this.bylletMotionX * getVelocity();
        this.motionY = this.bylletMotionY * getVelocity();
        this.motionZ = this.bylletMotionZ * getVelocity();
        this.setPosition(this.posX, this.posY, this.posZ);
        
        if(this.worldObj.isRemote)
        {
            for(int i = 0; i < 5; i++)
            {
                Minecraft.getMinecraft().effectRenderer.addEffect(new ColoredParticleTrail(this.worldObj, this.posX, this.posY, this.posZ, 0, 0, 0, 10, new int[]{0, 255, 255}));
                Minecraft.getMinecraft().effectRenderer.addEffect(new ColoredParticleTrail(this.worldObj, this.posX, this.posY, this.posZ, 0, 0, 0, 5, new int[]{0, 106, 255}));
            }
        }
    }
    
    protected float getVelocity()
    {
        return speed;
    }
    
    protected float getGravityVelocity()
    {
        return gravity;
    }

    @Override
    protected void onImpact(MovingObjectPosition mop) 
    {
        if(mop.entityHit != null && !(mop.entityHit instanceof EntityMezonShell))
        {
            mop.entityHit.hurtResistantTime = 0;
            mop.entityHit.attackEntityFrom(DamageSource.cactus, damage);
        }
        
        if(!(mop.entityHit instanceof EntityIominatorShell))
        {
            this.setDead();
        }
    }
}
[merge_posts_bbcode]Добавлено: 19.06.2015 15:27:34[/merge_posts_bbcode]

Тестил через функцию "открыть мир по сети"
 
была такая фигня у самого, дело в NBT. Надо обязательно сохранять и загружать состояние пули (позиции)
 
1) Спавнить пулю на клиенте не надо.
2) Вероятно, ты забыл зарегистрировать сущность.
 
Salamandr написал(а):
была такая фигня у самого, дело в NBT. Надо обязательно сохранять и загружать состояние пули (позиции)
Попробую.

Gloomy:
- Как это не надо? Тогда её не будет на клиенте. Может это из вышепреведённой ошибки.
- Зарегестрировать сущность, это как и зачем?
 
также как моба
EntityRegistry.registerModEntity(EntityBlasterBolt.class, "BlasterBolt", someValue, yourModInstance, 120, 3, true );
 
1) Так не надо, если ты будешь всё правильно делать, но спавнить сущность на клиенте, то сущность дублируется. Сервер сам отправит клиентам всю нужную информацию.
2) Вот так:
Код:
EntityRegistry.registerModEntity(EntityGrenade.class, "EntityGrenade", entityId++, this, 64, 3, true);
Нужно это, собственно, чтобы сущность нормально синхронизировалась.
 
А что за аргументы 64, 3, true?

int trackingRange, int updateFrequency, boolean sendsVelocityUpdates
 
Сам спросил - сам ответил :D

* @param trackingRange The range at which MC will send tracking updates
* @param updateFrequency The frequency of tracking updates
* @param sendsVelocityUpdates Whether to send velocity information packets as well
 
trackingRange, это дальность апдейта от игрока, а updateFrequency, это частота апдейта?
То-есть мне надо ставить 200 и 20 (поскольку на клиенте 20 раз в секунду?)
 
200 - овердофига, столько не нужно.
20 - это апдейт раз в секунду. Ну ставь, если не будет проблемой.
 
А тут краш:
Код:
[16:37:14] [Client thread/ERROR] [FML]: There was a critical exception handling a packet on channel FML
java.lang.RuntimeException: java.lang.NoSuchMethodException: com.svk.industrialGuns.entity.EntityMezonShell.<init>(net.minecraft.world.World)
    at com.google.common.base.Throwables.propagate(Throwables.java:160) ~[guava-17.0.jar:?]
    at cpw.mods.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:121) ~[EntitySpawnHandler.class:?]
    at cpw.mods.fml.common.network.internal.EntitySpawnHandler.channelRead0(EntitySpawnHandler.java:34) ~[EntitySpawnHandler.class:?]
    at cpw.mods.fml.common.network.internal.EntitySpawnHandler.channelRead0(EntitySpawnHandler.java:28) ~[EntitySpawnHandler.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) ~[SimpleChannelInboundHandler.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[MessageToMessageDecoder.class:?]
    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:?]
    at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:?]
    at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?]
    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?]
    at net.minecraft.client.multiplayer.PlayerControllerMP.updateController(PlayerControllerMP.java:317) [PlayerControllerMP.class:?]
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1682) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1028) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:951) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:164) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_79]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_79]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_79]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_79]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.11.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.11.jar:?]
    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source) [start/:?]
    at GradleStart.main(Unknown Source) [start/:?]
Caused by: java.lang.NoSuchMethodException: com.svk.industrialGuns.entity.EntityMezonShell.<init>(net.minecraft.world.World)
    at java.lang.Class.getConstructor0(Unknown Source) ~[?:1.7.0_79]
    at java.lang.Class.getConstructor(Unknown Source) ~[?:1.7.0_79]
    at cpw.mods.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:72) ~[EntitySpawnHandler.class:?]
    ... 26 more
[merge_posts_bbcode]Добавлено: 19.06.2015 16:38:20[/merge_posts_bbcode]

Так если я поставлю меньше 200, то партиклов не видно будет(
 
А это ты не добавил дефолтный конструктор com.svk.industrialGuns.entity.EntityMezonShell.<init>(net.minecraft.world.World).


200 - это очень, ОЧЕНЬ много. ЕМНИП на серверах дальность прогрузки чанков больше 160 банально поставить нельзя, но и столько редко кто делает. С дефолтными настройками дальность прорисовки ИГРОКА - 64 блока. Дефолтные частицы на таком расстоянии тем более не будут рисоваться. Ну куда тебе дальность в 200 блоков?
 
Вообщем, какой метод собственно надо добавлять?
Если на прямую EntityBulletBase регестрировать, и спавнить её, то работает.
А если EntityMezonShell, то нет, выдаёт вышепреведённый краш. В чём может быть проблема? Что мне делать? Ведь я же не буду, каждому энтити тот огромезный код копировать(
http://pastebin.com/S8AjErUn
http://pastebin.com/abN7mtcv
http://pastebin.com/nYfNgS1k
[merge_posts_bbcode]Добавлено: 19.06.2015 20:18:07[/merge_posts_bbcode]

public void entityInit() {} - Добавлял во все 3 класса, просто не на своём компе, вот и код не изменённый :D
[merge_posts_bbcode]Добавлено: 19.06.2015 20:19:04[/merge_posts_bbcode]

И все 3 класса, тоже пытался зарегестрировать.
 
Ясно, а я пол деня убил на это :D
[merge_posts_bbcode]Добавлено: 19.06.2015 22:15:51[/merge_posts_bbcode]

Окей, теперь пуля не двигается(

[merge_posts_bbcode]Добавлено: 19.06.2015 22:16:31[/merge_posts_bbcode]

Я так понял, надо постоянно сохранять/загружать: координаты, скорость, урон, в NBT?
 
Нет, неправильно. NBT обычно нужно только для сохранения информации на диск.
 
А почему тогда пуля на месте стоит?
Когда я не регистрировал энтити, она нормально летела...
 
Да откуда мне знать, что ты сделал не так. Ну попробуй поставить частоту обновления на 1, мб у тебя пуля быстрее пропадает, чем сдвигается.
 
Назад
Сверху