[1.6.4] Мой энтити не видно другим игрокам на сервере

Не хочешь - не мотай. Не хочешь мотать - вообще уходи с форума.
 
А прикол в том, что randomDisplayTick тикает на всех клиентах(которые получили пакет о том, что там-то сям-то стоит блок).
И если ты энтити заспаунишь не только у себя, то она тоже будет тикать на всех клиентах и ты просто проверяй, что ты на клиенте, перед тем как пытаться спавнить частицу.
Вот и всё.
[merge_posts_bbcode]Добавлено: 01.06.2014 12:01:17[/merge_posts_bbcode]

Люди не до конца поняли твою проблему, а потом ты не до конца понял, что они попытались объяснить, и вместо того, чтобы вдуматься там, перезадать свой вопрос и всё такое, начал психовать.
И правильно сказали - не подходит - ну и до свидания.
 
У людей, мне кажется, серьезные траблы с понятиями. Получается так, что если я и так всё знаю, мне форум в принципе нафиг не нужен, а если не знаю и пытаюсь узнать, то мне говорят - иди нафиг с форума. Это прикольно, наверное. Я хз.
И кто решил, что я психую? Я сразу написал, что я не понимаю как происходит сетевой обмен в среде Minecraft и попросил мне это доступно объяснить. Вместо этого, товарищи, которые могут это сделать, начали мне советовать включить мозги и, по сути, писать код методом тыка. Хорошо. Вот вам код методом тыка:
Код:
package mods.mod_fireworks;
 

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;

import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet250CustomPayload;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.IPacketHandler;
import cpw.mods.fml.common.network.Player;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class PacketHandler implements IPacketHandler {

        @Override
        public void onPacketData(INetworkManager manager,
                        Packet250CustomPayload packet, Player player) {
               
                if (packet.channel.equals("GenericRandom")) {
                        handleRandom(packet);
                }
        }

        private void handleRandom(Packet250CustomPayload packet) {
                DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data));
                Side side = FMLCommonHandler.instance().getEffectiveSide();
                if (side == Side.CLIENT) {

                double x,y,z;
                float mX,mY,mZ;
                int id;
                String t;
               
                try {
                        x = inputStream.readDouble();
                        y = inputStream.readDouble();
                        z = inputStream.readDouble();
                        mX = inputStream.readFloat();
                        mY = inputStream.readFloat();
                        mZ = inputStream.readFloat();
                       id = inputStream.readInt();
                        if ( id!=Minecraft.getMinecraft().thePlayer.entityId){
                            float red = 0;
                        float green = 0;
                        float blue = 0;
                        float scale = 0;
                        int maxAge = 40;
                        EntitySpark spark = new EntitySpark(Minecraft.getMinecraft().theWorld,
                                x,y,z,
                                mX,mY,mZ,Minecraft.getMinecraft().effectRenderer);
                        spark.setRBGColorF(red, green, blue);
                        Minecraft.getMinecraft().effectRenderer.addEffect((EntityFX)spark);}
                } catch (IOException e) {
                        e.printStackTrace();
                        return;
                }
               
                System.out.println(x + " " + y+" "+z+" "+id);
        }
        }
}
Числа передаются. Я в консоли их вижу. Значит, сетевой обмен происходит. Однако, сервер виснет. А почему? Я же проверяю сторону:
Код:
                Side side = FMLCommonHandler.instance().getEffectiveSide();
                if (side == Side.CLIENT) {
Вероятно понял.
Код:
Minecraft.getMinecraft().theWorld
возвращает клиентский мир, а я нахожусь в серверном. Верно? Где тогда взять нужный объект theWorld?
 
И это как то обидно. Потому что русские (почти вся масса) не способны адекватно обьяснить, что как раз таки делают на англоязычных форумах.
 
minecraftsrv написал(а):
И это как то обидно. Потому что русские (почти вся масса) не способны адекватно обьяснить, что как раз таки делают на англоязычных форумах.
Пф :)
Ну так иди на англоязычные форума. Там точно получишь ответ со своими манерами.
 
Странный ты. Ты с сервера или с клиента пакет отсылаешь? Если с сервера, то начерта тебе на клиенте серверный мир? Его там нет и никогда не будет. Объясни по пунктам что ты делаешь в коде и что пытаешься сделать.
А ещё кинь код отправки пакета, ты может поток вывода не закрываешь.
 
anti344 написал(а):
И если ты энтити заспаунишь не только у себя, то она тоже будет тикать на всех клиентах и ты просто проверяй, что ты на клиенте, перед тем как пытаться спавнить частицу.
Вот и всё
Что значит "не только у себя"? Всмысле, спаунить на сервере? Я пробовал убирать проверку if (world.isRemote), но клиент благополучно крашился.

Oldestkon написал(а):
Странный ты. Ты с сервера или с клиента пакет отсылаешь?
Я отсылаю пакет, когда брошенный энтити уничтожился.
А странный я потому что не умею это делать правильно, а научить меня некому. Я думал, форумы для этого и нужны.
Oldestkon написал(а):
Если с сервера, то начерта тебе на клиенте серверный мир? Его там нет и никогда не будет.
Это метод тыка.
Oldestkon написал(а):
Объясни по пунктам что ты делаешь в коде и что пытаешься сделать
Если по пунктам, то мне кажется, что я решаю проблему не с того бока. Возможно, этим она и усложняется.
Я беру предмет, нажимаю кнопку и он бросается. "бросается" это значит, что спаунится первый энтити. Если я нахожусь на сервере, то я вижу, как летит этот энтити, а другие игроки нет. Для начала, мне как-то надо сделать так, чтобы эту энтити было видно другим игрокам. Что для этого нужно сделать?
 
aj2HNUh.png

- Ты дома или на работе?
- Да
 
Не знаю что ты там делаешь, но у меня энтити везде и всем виден.
 
@Override
    public void onUpdate()
    {
         super.onUpdate();

        if (this.ticksExisted>this.Max){
            System.out.println("firework1 out of ticks");
//            this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 6.0f,true);
            if (this.worldObj.isRemote){
                this.setDead();
                this.worldObj.playSoundAtEntity(this, "random.explode", 0.5F, 1.0F);
                for (int i=0; i<70; i++){
            float mX = rand.nextFloat();
            float mY = rand.nextFloat();
            float mZ = rand.nextFloat();
            float red = rand.nextFloat();
            float green = rand.nextFloat();
            float blue = rand.nextFloat();
            float scale = rand.nextFloat();
            int maxAge = 40;
            EntitySpark spark = new EntitySpark(this.worldObj,this.posX,this.posY,this.posZ,
                    mX,mY,mZ,Minecraft.getMinecraft().effectRenderer);
            spark.setRBGColorF(red, green, blue);
            Minecraft.getMinecraft().effectRenderer.addEffect((EntityFX)spark);
            mX = -rand.nextFloat();
            mY = -rand.nextFloat();
            mZ = -rand.nextFloat();
            spark = new EntitySpark(this.worldObj,this.posX,this.posY,this.posZ,
                    mX,mY,mZ,Minecraft.getMinecraft().effectRenderer);
           
            spark.setRBGColorF(red, green, blue);
            Minecraft.getMinecraft().effectRenderer.addEffect((EntityFX)spark);
        ByteArrayOutputStream bos = new ByteArrayOutputStream(8);
        DataOutputStream outputStream = new DataOutputStream(bos);
        try {
                outputStream.writeDouble(this.posX);
                outputStream.writeDouble(this.posY);
                outputStream.writeDouble(this.posZ);
                outputStream.writeFloat(mX);
                outputStream.writeFloat(mY);
                outputStream.writeFloat(mZ);
                outputStream.writeInt(this.getThrower().entityId);
                outputStream.writeChars(this.worldObj.toString());
        } catch (Exception ex) {
                ex.printStackTrace();
        }
      
        Packet250CustomPayload packet = new Packet250CustomPayload();
        packet.channel = "GenericRandom";
        packet.data = bos.toByteArray();
        packet.length = bos.size();
       
      
        Side side = FMLCommonHandler.instance().getEffectiveSide();
        if (side == Side.SERVER) {
                // We are on the server side.
                EntityPlayerMP player = (EntityPlayerMP) this.getThrower();
//                player.sendQueue.addToSendQueue(packet);
        } else if (side == Side.CLIENT) {
                // We are on the client side.
                EntityClientPlayerMP player = (EntityClientPlayerMP) this.getThrower();
                //player.sendQueue.addToSendQueue(packet);
        } else {
                // We are on the Bukkit server.
        }
                }
            }
            }
            return;
        }
[merge_posts_bbcode]Добавлено: 02.06.2014 20:38:01[/merge_posts_bbcode]

Majestic написал(а):
Не знаю что ты там делаешь, но у меня энтити везде и всем виден.
вот и выложи код, как доказательство.
 
Делал по тому тоториалу еще на 1.6.
Сейчас удалил.
 
Ты реально надойдаешь.
Тебе туторы дают, а ему еще что-то не нравится.
 
Majestic написал(а):
Ты реально надойдаешь.
Тебе туторы дают, а ему еще что-то не нравится.
Эти туторы я и без вас видел. На форум обычно пишешь, если с тутором что-то не выходит. А до вас это никак не доходит.
 
BlackCrafter написал(а):
Эти туторы я и без вас видел. На форум обычно пишешь, если с тутором что-то не выходит. А до вас это никак не доходит.
Готовый код тебе здесь никто не даст. Попытайся сам реализовать свою идею, почитай про пакеты. На форж-вики есть туториалы на это тему.
 
Может тебя как RaVeN-а - навсегда забанить и быть збагойным?
А то сейчас не самое удачное время(и вообще, место) ехидничать и так далее. Ты должен быть совершенно счастлив, что не только тебя это интересует и что есть люди, которые могут тебе помочь(потеряв время, немного нервов и энергии, и так далее).
[merge_posts_bbcode]Добавлено: 02.06.2014 13:35:37[/merge_posts_bbcode]

Насчколько я понял, тебе нужен энтити, спайнящий какие-либо частицы у всех клиентов.
Ентити должен наследовать какой угодно класс, производный от Entity(или сам Entity), КРОМЕ EntityFX.
Ты должен его зарегистрировать и всё такое прочее.
Спавнить на стороне сервера.
В нем самом, если world.isRemote вызывать метод, обладающий аннотацией @SideOnly(Side.CLIENT) и, собственно, спаунящий частицу в Minecraft.getMinecraft().{effectRenderer или как-то так}

[merge_posts_bbcode]Добавлено: 02.06.2014 13:36:18[/merge_posts_bbcode]

И ВСЁ(Ибо если он заспаунен правильно, он будет у всех клиентов и у всех клиентов он будет тикать).
 
Назад
Сверху