Ломающийся ванила рычаг.

107
0
В общем возникла идея... Есть рычаг из ванилы. Можно ли сделать так что бы с определённым кол-во включений + выключений он якобы ломался...Якобы обламывалась ручка... Что бы его отремонтировать нужно, допустим, взять палку и ПКМ по нему...Если пытаться его переключить когда он сломаный то он будет выдавать партиклы?
 
1,239
2
24
Капитан очевидность.
Я знаю,но мозг не варит,почему та :/
 
1,087
2
Tsyklop написал(а):
FanKar, сложно такое реализовать? 
Не сложно, но и не легко. Для этого надо сохранят его состояние и в клиенте и на сервере, а потом делать проверку. На самом деле, это не так легко.
 

timaxa007

Модератор
5,831
409
672
Тебе надо, что-то типа этого:
[youtube]NhA3I5JtIug[/youtube]
?
 

timaxa007

Модератор
5,831
409
672
Tsyklop написал(а):
Да, я это сделал. Но код сделан не очень. Пока-что лучшего способа не знаю.
Код:
public class Lever extends WorldSavedData {
    //-----------------------------------------------------------------------------------------------
    private static final String TAG = "Lever";
    public static final int MAX_USED = 16;//Можно изменит или во-обще можно добавить и использовать из NBT
    private World world_p;

    private ArrayList<PartLever> regLever = new ArrayList<PartLever>();
    //-----------------------------------------------------------------------------------------------
    public Lever() {
        super(TAG);
    }

    public Lever(String tag) {
        super(tag);
    }
    //-----------------------------------------------------------------------------------------------
    public static void check(World world) {
        WorldSavedData data = world.perWorldStorage.loadData(Lever.class, TAG);
        if (data == null) data = new Lever(TAG);
        world.perWorldStorage.setData(TAG, data);
        data.markDirty();
    }

    public static Lever get(World world) {
        return (Lever)world.perWorldStorage.loadData(Lever.class, TAG);
    }
    //-----------------------------------------------------------------------------------------------
    public void setWorld(World world) {
        world_p = world;
    }

    public ArrayList<PartLever> getList() {
        return regLever;
    }
    //-----------------------------------------------------------------------------------------------
    public void addLever(int x, int y, int z, int count_used) {
        PartLever bct = new PartLever(x, y, z, count_used);
        addLever(bct);
    }

    public void addLever(PartLever bct) {
        if (regLever != null) regLever.add(bct);
        else System.out.println("[Error] Adding - PartLever: x = " + bct.x + ", y = " + bct.y + ", z = " + bct.z + ".");
    }

    public void addLever_check(PartLever bct) {
        boolean flag = false;
        if (regLever != null) {
            for (PartLever bctp : regLever) {
                if (bctp.x == bct.x && bctp.y == bct.y && bctp.z == bct.z)
                    flag = true;
            }
        }
        if (!flag) regLever.add(bct);
        if (flag) System.out.println("[Error] Adding - PartLever: x = " + bct.x + ", y = " + bct.y + ", z = " + bct.z + ".");
    }
    //-----------------------------------------------------------------------------------------------
    public void removeLever(int x, int y, int z) {
        boolean flag = false;
        if (regLever != null && regLever.size() > 0) {
            for (int i = 0; i < regLever.size(); ++i) {
                PartLever bctp = regLever.get(i);
                if (bctp != null && bctp.x == x && bctp.y == y && bctp.z == z) {
                    regLever.remove(bctp);
                    flag = true;
                }
            }
        }
        if (!flag) System.out.println("[Error] Not Remove - PartLever: x = " + x + ", y = " + y + ", z = " + z + ".");
    }

    public void removeLever(PartLever bct) {
        if (regLever != null) regLever.remove(bct);
        else System.out.println("[Error] Not Remove - PartLever: x = " + bct.x + ", y = " + bct.y + ", z = " + bct.z + ".");
    }
    //-----------------------------------------------------------------------------------------------
    public PartLever getLever(int x, int y, int z) {
        if (regLever != null && regLever.size() > 0) {
            for (PartLever bctp : regLever) {
                if (bctp.x == x && bctp.y == y && bctp.z == z) return bctp;
            }
        }
        return null;
    }

    public boolean isLever(int x, int y, int z) {
        if (regLever != null && regLever.size() > 0) {
            for (PartLever bctp : regLever) {
                if (bctp.x == x && bctp.y == y && bctp.z == z) return true;
            }
        }
        return false;
    }

    public void use(int x, int y, int z) {
        if (regLever != null && regLever.size() > 0) {
            for (PartLever bctp : regLever) {
                if (bctp.x == x && bctp.y == y && bctp.z == z) {
                    ++bctp.count_used;
                }
            }
        }
    }
    //-----------------------------------------------------------------------------------------------
    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        /* System.out.println("readFromNBT " + (
         FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER ? "Side Server" : 
         FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? "Side Client" : 
         "Side Error"));*/
        regLever.clear();

        NBTTagList nbttaglist = nbt.getTagList(TAG, Constants.NBT.TAG_COMPOUND);
        if (nbttaglist != null) {
            for (int i = 0; i < nbttaglist.tagCount(); ++i) {
                NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
                int x = nbttagcompound1.getInteger("CordX");
                int y = nbttagcompound1.getInteger("CordY");
                int z = nbttagcompound1.getInteger("CordZ");
                int count_used = (int)nbttagcompound1.getShort("CountUsed");
                PartLever bct = new PartLever(x, y, z, count_used);
                addLever_check(bct);
                //System.out.println(bct.toString());
            }
        }
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt) {
        /*System.out.println("writeToNBT " + (
         FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER ? "Side Server" : 
         FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? "Side Client" : 
         "Side Error"));*/
        if (regLever != null && regLever.size() > 0) {
            NBTTagList nbttaglist = new NBTTagList();
            for (int i = 0; i < regLever.size(); ++i) {
                NBTTagCompound nbttagcompound1 = new NBTTagCompound();
                nbttagcompound1.setInteger("CordX", regLever.get(i).x);
                nbttagcompound1.setInteger("CordY", regLever.get(i).y);
                nbttagcompound1.setInteger("CordZ", regLever.get(i).z);
                nbttagcompound1.setShort("CountUsed", (short)regLever.get(i).count_used);
                //--------------------------------------------------------------
                nbttaglist.appendTag(nbttagcompound1);
            }
            nbt.setTag(TAG, nbttaglist);
        }
    }
    //-----------------------------------------------------------------------------------------------
    public static class PartLever {

        public int x;
        public int y;
        public int z;
        public int count_used;

        public PartLever(int x, int y, int z, int count_used) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.count_used = count_used;
        }

        public String toString() {
            String str = "PartLever: x = " + x + ", y = " + y + ", z = " + z + "";
            str += "count_used:" + count_used;
            return str + ".";
        }

    }
    //-----------------------------------------------------------------------------------------------
}
Код:
MinecraftForge.EVENT_BUS.register(new EventLever());
Код:
public class EventLever {

    @SubscribeEvent
    public void checkLever(WorldEvent.Load e) {
        Lever.check(e.world);
        Lever.get(e.world).setWorld(e.world);
    }

    @SubscribeEvent
    public void breakLever(BlockEvent.BreakEvent e) {
        if (e.block == Blocks.lever) {
            if (Lever.get(e.world) != null) Lever.get(e.world).removeLever(e.x, e.y, e.z);
        }
    }

    @SubscribeEvent
    public void addLever(BlockEvent.PlaceEvent e) {
        if (e.placedBlock == Blocks.lever) {
            if (Lever.get(e.world) != null) Lever.get(e.world).addLever(e.x, e.y, e.z, 0);
        }
    }


    @SubscribeEvent
    public void openLever(PlayerInteractEvent e) {
        if (e.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) {
            Lever ct = Lever.get(e.world);
            if (ct != null) {
                if (e.entityPlayer instanceof EntityPlayerMP) {
                    ItemStack current = e.entityPlayer.getCurrentEquippedItem();
                    Block block = e.world.getBlock(e.x, e.y, e.z);
                    /*
                    if (current != null && current.getItem() == Items.stick && block == Blocks.cobblestone) {
                        --current.stackSize;
                        e.world.setBlock(e.x, e.y, e.z, Blocks.lever);
                    }
                     */
                    if (block == Blocks.lever) {
                        if (ct.isLever(e.x, e.y, e.z)) {
                            if (ct.getLever(e.x, e.y, e.z).count_used <= Lever.MAX_USED)
                                ct.use(e.x, e.y, e.z);
                            else {
                                //--------------------------------------
                                EntityItem ei1 = new EntityItem(e.world, 
                                        (double)e.x + 0.5D, 
                                        (double)e.y + 0.5D, 
                                        (double)e.z + 0.5D, 
                                        new ItemStack(Items.stick));
                                e.world.spawnEntityInWorld(ei1);
                                //--------------------------------------
                                EntityItem ei2 = new EntityItem(e.world, 
                                        (double)e.x + 0.5D, 
                                        (double)e.y + 0.5D, 
                                        (double)e.z + 0.5D, 
                                        new ItemStack(Blocks.cobblestone));
                                e.world.spawnEntityInWorld(ei2);
                                //--------------------------------------
                                e.world.setBlockToAir(e.x, e.y, e.z);
                                ct.removeLever(e.x, e.y, e.z);
                            }
                        }
                        else ct.addLever(e.x, e.y, e.z, 1);
                        ct.check(e.world);
                    }
                }
            }
        }
    }

}
 

CumingSoon

Местный стендапер
1,634
12
269
Я бы свой рычаг написал(может даже попробую)
 

timaxa007

Модератор
5,831
409
672
А я не скоро буду свои рычаги, кнопки и т.п. вещи делать.
 
107
0
CoomingSoon зачем ещё один рычаг? Игроки знают про ванильный и будут пользоваться им. А ещё один так и не будет использован.
[merge_posts_bbcode]Добавлено: 27.10.2015 15:56:09[/merge_posts_bbcode]

timaxa007, эм. а jar файл можно? или это нужно изменить в исходниках просто?
 

CumingSoon

Местный стендапер
1,634
12
269
Сделай свой рычаг, а рецепт ванильного на твой замени
 

CumingSoon

Местный стендапер
1,634
12
269
Эм, я уже вроде бы сказал. Заменил все, что нужно на твой рычаг. Ванильный останется лишь как в креативе
 
107
0
timaxa007, Я полный ноль в моддинге но я смог сделать Jar файл. Сделал как отдельный мод. И это работает. НО!

Но дело в том что я не понимаю как подсчитываются кол-во раз включения/выключения. Указано 16 но что бы он сломался нужно 18 раз кликнуть на рычаг. Получается что 9 включений и 9 выключений...
 

timaxa007

Модератор
5,831
409
672
Tsyklop написал(а):
timaxa007, Я полный ноль в моддинге но я смог сделать Jar файл.
Молодец.
Tsyklop написал(а):
что бы он сломался нужно 18 раз кликнуть на рычаг. Получается что 9 включений и 9 выключений...
Типа да. Подсчитываться по прикасанию по блоку. У меня это в коде выполняется при помощи эвента "PlayerInteractEvent".
 
107
0
timaxa007 написал(а):
Типа да. Подсчитываться по прикасанию по блоку. У меня это в коде выполняется при помощи эвента "PlayerInteractEvent".

Но ведь прописано что 16 раз...

Вот. Посмотри Jar файл. Всё ли нормально?
 
Сверху