Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Инвентарь

Тема в разделе "Разработка плагинов для новичков", создана пользователем progres, 4 окт 2015.

  1. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    1)При открытие инвентаря всё его содержимое должно куда либо выводится в данном случае в конфиг.
    2)Проблема:Вообще не чего не делает при открытие инвентаря. Как будто этого события вообще нет.
    3)Код:
    Код:
    @EventHandler
        public void getItemInventoy(InventoryOpenEvent event){
            z = event.getPlayer().getInventory().getContents();
            for (int k=0;k<z.length;k++){
                 config.set("Numb", z[k].getTypeId()+""+z[k].getData().getItemTypeId());
                 getLogger().info(z[k].getTypeId()+""+z[k].getData().getItemTypeId());
            }
    
    
          
            saveConfig();
          reloadConfig();
          
        }
    
    Примечания: Всё определенно и проинициализированно. Ошибка нет. Оно просто не работает. А вот почему....
     
    Последнее редактирование: 4 окт 2015
  2. Хостинг MineCraft
    <
  3. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Код вроде верный.
    Знаю что написано, но таки спрошу. Листенер регнут?
     
  4. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    Малость не понял вас. Но мне кажется вы имеете в виду массив z либо наследование и подключение главном методе плагина. Если это массив z то я его объявлял в самом верху кода как глобальный. Что бы не было проблем. А если вы всё таки имели в виду второе то у меня на ум приходит только то что вы имели в виду как написана эта строка.
    Код:
     public class Sly extends JavaPlugin implements Listener 
    Если не то не другое то объясните а то я плагины не давно начал делать и ещё не всё могу понимать :)
     
  5. CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Bukkit.getPluginManager().registerEvents(this, this);
     
  6. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    Это есть только немного в другой форме

    getServer().getPluginManager().registerEvents(this, this);

    И находится эта строка конечно тут

    @Override
    public void onEnable(){[DOUBLEPOST=1443969268,1443969163][/DOUBLEPOST]Однака это не как не меняет моего вопроса. В чём проблема???
     
  7. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Вы пытаетесь отследить открытие инвентаря пользователя? Или инвентарь сундука, и прочих блоков с GUI?
    Если инвентарь пользователя, то это сделать нельзя т.к. для сервера у игрока всегда открыт инвентарь и событие открытия GUI'шки обрабатывается только клиентом.
     
  8. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    Большое спасибо! А я ведь и пытался отследить открытие инвентаря пользователя. Но теперь у меня появилсь другие вопросы.
    1)Я так понимаю под "событие открытия GUI'шки обрабатывается только клиентом" вы подразумеваете что это нужно делать при помощи мода? Если да то получается у мода есть как серверная часть так и клиентская? Или же существует что то ещё для работы с клиентом?? (Например у меня есть мод. Его серверная часть работает как плагин?)
    2)"для сервера у игрока всегда открыт инвентарь". Я так понимаю то что я написал это работает исключительно для сундуков которые открывает пользователь и прочих блоков? И если для сервера у игрока всегда открыт инвентарь то значит можно как то отследить клик мышки по ячейки инвентаря игрока? Если да то как это сделать или скажите хотя бы EVENT для этого? Хотя я конечно догадываюсь что это нечто вроде InventoryClickEvent но всё же если это так то скажите хотя бы.
     
    Последнее редактирование: 5 окт 2015
  9. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    @progres,
    1) Да, это можно сделать модом, но нужно ли? Серверная часть мода работает как серверная часть мода :) Она использует не Bukkit API, а Forge API
    2) Событие как вы и сказали InventoryClickEvent, а проверить, что пользователь находится в инвентаре можно так:
    Код:
    if (event.getInventory().getType() == InventoryType.CRAFTING) {
        // smth...
    }
    
     
  10. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    Я так понимаю в условии сравниваютца текущие состояние инвентаря это вроде event.getInventory().getType() (открыт GUI/закрыт GUI) и...... а вот что это (InventoryType.CRAFTING) делает я что то не понял.
    И да если можете бросьте ссылку на Forge API касательно серверной части а то я много нашёл про то как делать разные вещи на клиенте а вот как мод должен взаимодействовать со своей серверной частью....
     
  11. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    event.getInventory().getType() - получаем тип инвентаря который открыт
    InventoryType - тип инвентаря. CRAFTING - открыт инвентарь игрока
    Есть так же значения CHEST, DISPENSER, WORKBENCH и т.д. которые понятно за что отвечают.
    Насчет Forge (это дейстивтельно нужно?) - надо смотреть в сторону Sided Proxy и Server Side методов. Более конкретно сказать не могу, т.к. последний раз модил под 1.6.4
     
    Последнее редактирование: 5 окт 2015
  12. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Не лезте в форджи. Там нечего делать.

    Что вы хотите сделать?
     
  13. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    1)Я хочу сделать так что бы например есть вещи какие та в сундуке(инвентаре) и при его открытии id всех вещей записывались или куда либо выводилось. То есть суть в том что бы не переписывать id ручками а сделать их групповое вытаскивание. И к стати у меня до сих пор не чего не получается.... может я как та не так пытаюсь id достать??? А в консоли в обще беспредел. Говорит типа Could not pass event СамоСобытие которое и сработоло to мой плагин.
    Код:
    z = event.getPlayer().getInventory().getContents();
    //Например 1
    int id=z[1].getTypeId();
    2)"Не лезьте в форджи." К стати хотел спросить как сделать нечто на подобии galacticraft??? Что бы был мод который создавал мир со своими свойствами и своим перемещнием в него?? Ну на счёт перемещения вроде не проблем а вот с мирам... Это же в любом случае нужна серверная часть мода?
     
  14. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    @progres, "Говорит типа Could not pass event" - нудно больше информации, а именно какое исключение было выкинуто и в каком месте. В чем проблема? Вот например вывожу все айтемы в консоль:
    Код:
    for (ItemStack item : event.getPlayer().getInventory().getContents()) {
        System.out.println(item);
    }
    "мир со своими свойствами" - если не собираетесь создавать новые блоки/растения и т.д. то можно справиться без мода.
     
  15. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    @OsipXD Большое спасибо теперь заработало.... А я что то не в курсе был что есть такое оформление цикла... я просто в java не давно. А так я выходец из Delphi и PHP :) К стати такое оформление конструкции похоже на foreach в php для перебора массива... не хватает только переменной куда бы падал ключик ячейки...
    На счёт этого....
    Дело в том что мне и надо как рас что бы был абсолютно новый мир который бы генерировался из блоков добавляемых моим модом. Плюс нужно что бы сервер и мод общались по какому то протокуолу и кое что передавали (это уже небольшой сикрет). Я конечно могу ошибацтца но я больше не вижу вриантов как сделать это без серверной части мода.
     
  16. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    @progres, это и есть foreach :)
    Тут мало что скажут насчет моддинга, лучше спрашивать forum.mcmodding.ru
    Правда там довольно сложно чего-то добиться.. Скорее скажут что-то вроде "Да, это сделать можно, но это настолько легко, что я даже говорить не буду как"
     
  17. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    "классов Nether-а" Это вы имеете в виду классы Эндар мира??
    И если честно то чувствую кода получится на 1700 с лишним строчек Эх... Лад и не такое вытворял :cool:
    Однако если вам не сложно можете помочь с WorldProvider, ChunkProvider, WorldChunkManager и Teleporter??? А то я посмотрел и у меня как минимум уже такая вот картинка начала вырисововыеться....... Это то что я щас пытаюсь сделать.......
    Код:
    @SuppressWarnings("unchecked")
    public class mcreator_ggg {
    
    public Object instance;
    public static int DIMID = 3;
    
    public static BlockTutorialPortal portal;
    public static ModTrigger block;
    
    static{
    
    portal = (BlockTutorialPortal)(new BlockTutorialPortal()
    .setBlockName("ggg_portal")
    .setBlockTextureName("1234"));
    Block.blockRegistry.addObject(176, "ggg_portal", portal);
    block = (ModTrigger)(new ModTrigger().setUnlocalizedName("ggg_trigger").setTextureName("213"));
    Item.itemRegistry.addObject(424, "ggg_trigger", block);
    }
    
    public mcreator_ggg(){}
    
    public void load(){
    GameRegistry.registerBlock(portal, "ggg_portal");
    DimensionManager.registerProviderType(DIMID, mcreator_ggg.WorldProviderMod.class, false);
    DimensionManager.registerDimension(DIMID, DIMID);
    
    
    
    }
    
    public void registerRenderers(){}
    public void generateNether(World world, Random random, int chunkX, int chunkZ){}
    public void generateSurface(World world, Random random, int chunkX, int chunkZ){}
    public int addFuel(ItemStack fuel){
        return 0;
    }
    public void serverLoad(FMLServerStartingEvent event){}
    public void preInit(FMLPreInitializationEvent event){}
    
    public static class WorldProviderMod extends WorldProvider{
    
        public void registerWorldChunkManager(){
            this.worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.ocean, 0.0F);
            this.isHellWorld = true;
            this.hasNoSky = true;
            this.dimensionId = DIMID;
        }
    
        @SideOnly(Side.CLIENT)
        public Vec3 getFogColor(float par1, float par2){
            return Vec3.createVectorHelper(1.0D,1.0D,1.0D);
        }
    
        public IChunkProvider createChunkGenerator(){
            return new ChunkProviderModded(this.worldObj, this.worldObj.getSeed()-22619);
        }
    
        public boolean isSurfaceWorld(){
            return false;
        }
    
        public boolean canCoordinateBeSpawn(int par1, int par2){
            return false;
        }
    
        public boolean canRespawnHere(){
            return false;
        }
    
        @SideOnly(Side.CLIENT)
        public boolean doesXZShowFog(int par1, int par2){
            return false;
        }
    
        public String getDimensionName(){
            return "ggg";
        }
    
        @Override protected void generateLightBrightnessTable() {float f = 0.5F;for(int i = 0; i <= 15; ++i) {float f1 = 1.0F - (float) i / 15.0F;this.lightBrightnessTable[i] = (1.0F - f1) / (f1 * 3.0F + 1.0F) * (1.0F - f) + f;}}
    
    }
    
    public class TutorialPortalPosition extends ChunkCoordinates{
        public long field_85087_d;
        final TeleporterDimensionMod field_85088_e;
        public TutorialPortalPosition(TeleporterDimensionMod tutorialTeleporter, int par2, int par3, int par4, long par5){
            super(par2, par3, par4);
            this.field_85088_e = tuTeleporter;
            this.field_85087_d = par5;
        }
    }
    
    public static class TeleporterDimensionMod extends Teleporter {
    
        private final WorldServer worldServerInstance;
        private final List destinationCoordinateKeys = new ArrayList();
        private static final String __OBFID = "CL_00000153";
    
    
    
    
        public TeleporterDimensionMod(WorldServer par1WorldServer){
            super(par1WorldServer);
            this.worldServerInstance = par1WorldServer;
            this.random = new Random(par1WorldServer.getSeed());
        }
    
      
        public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8)
        {
            if (this.worldServerInstance.provider.dimensionId != 1)
            {
                if (!this.placeInExistingPortal(par1Entity, par2, par4, par6, par8))
                {
                    this.makePortal(par1Entity);
                    this.placeInExistingPortal(par1Entity, par2, par4, par6, par8);
                }
            }
            else
            {
                int i = MathHelper.floor_double(par1Entity.posX);
                int j = MathHelper.floor_double(par1Entity.posY) - 1;
                int k = MathHelper.floor_double(par1Entity.posZ);
                byte b0 = 1;
                byte b1 = 0;
    
                for (int l = -2; l <= 2; ++l)
                {
                    for (int i1 = -2; i1 <= 2; ++i1)
                    {
                        for (int j1 = -1; j1 < 3; ++j1)
                        {
                            int k1 = i + i1 * b0 + l * b1;
                            int l1 = j + j1;
                            int i2 = k + i1 * b1 - l * b0;
                            boolean flag = j1 < 0;
                            this.worldServerInstance.setBlock(k1, l1, i2, flag ? Blocks.lapis_ore : Blocks.air);
                        }
                    }
                }
    
                par1Entity.setLocationAndAngles((double)i, (double)j, (double)k, par1Entity.rotationYaw, 0.0F);
                par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D;
            }
        }
    
     
    
    
            if (d3 >= 0.0D)
            {
                if (flag)
                {
                    this.destinationCoordinateCache.add(j1, new Teleporter.PortalPosition(i, j, k, this.worldServerInstance.getTotalWorldTime()));
                    this.destinationCoordinateKeys.add(Long.valueOf(j1));
                }
    
                double d11 = (double)i + 0.5D;
                double d6 = (double)j + 0.5D;
                d7 = (double)k + 0.5D;
                int i4 = -1;
    
                if (this.worldServerInstance.getBlock(i - 1, j, k) == portal)
                {
                    i4 = 2;
                }
    
                if (this.worldServerInstance.getBlock(i + 1, j, k) == portal)
                {
                    i4 = 0;
                }
    
                if (this.worldServerInstance.getBlock(i, j, k - 1) == portal)
                {
                    i4 = 3;
                }
    
                if (this.worldServerInstance.getBlock(i, j, k + 1) == portal)
                {
                    i4 = 1;
                }
    
                int j2 = par1Entity.getTeleportDirection();
    
                if (i4 > -1)
                {
                    int k2 = Direction.rotateLeft[i4];
                    int l2 = Direction.offsetX[i4];
                    int i3 = Direction.offsetZ[i4];
                    int j3 = Direction.offsetX[k2];
                    int k3 = Direction.offsetZ[k2];
                    boolean flag1 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3 + k3) || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3 + k3);
                    boolean flag2 = !this.worldServerInstance.isAirBlock(i + l2, j, k + i3) || !this.worldServerInstance.isAirBlock(i + l2, j + 1, k + i3);
    
                    if (flag1 && flag2)
                    {
                        i4 = Direction.rotateOpposite[i4];
                        k2 = Direction.rotateOpposite[k2];
                        l2 = Direction.offsetX[i4];
                        i3 = Direction.offsetZ[i4];
                        j3 = Direction.offsetX[k2];
                        k3 = Direction.offsetZ[k2];
                        l3 = i - j3;
                        d11 -= (double)j3;
                        int k1 = k - k3;
                        d7 -= (double)k3;
                        flag1 = !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j, k1 + i3 + k3) || !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j + 1, k1 + i3 + k3);
                        flag2 = !this.worldServerInstance.isAirBlock(l3 + l2, j, k1 + i3) || !this.worldServerInstance.isAirBlock(l3 + l2, j + 1, k1 + i3);
                    }
    
                    float f1 = 0.5F;
                    float f2 = 0.5F;
    
                    if (!flag1 && flag2)
                    {
                        f1 = 1.0F;
                    }
                    else if (flag1 && !flag2)
                    {
                        f1 = 0.0F;
                    }
                    else if (flag1 && flag2)
                    {
                        f2 = 0.0F;
                    }
    
                    d11 += (double)((float)j3 * f1 + f2 * (float)l2);
                    d7 += (double)((float)k3 * f1 + f2 * (float)i3);
                    float f3 = 0.0F;
                    float f4 = 0.0F;
                    float f5 = 0.0F;
                    float f6 = 0.0F;
    
                    if (i4 == j2)
                    {
                        f3 = 1.0F;
                        f4 = 1.0F;
                    }
                    else if (i4 == Direction.rotateOpposite[j2])
                    {
                        f3 = -1.0F;
                        f4 = -1.0F;
                    }
                    else if (i4 == Direction.rotateRight[j2])
                    {
                        f5 = 1.0F;
                        f6 = -1.0F;
                    }
                    else
                    {
                        f5 = -1.0F;
                        f6 = 1.0F;
                    }
    
                    double d9 = par1Entity.motionX;
                    double d10 = par1Entity.motionZ;
                    par1Entity.motionX = d9 * (double)f3 + d10 * (double)f6;
                    par1Entity.motionZ = d9 * (double)f5 + d10 * (double)f4;
                    par1Entity.rotationYaw = par8 - (float)(j2 * 90) + (float)(i4 * 90);
                }
                else
                {
                    par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D;
                }
    
                par1Entity.setLocationAndAngles(d11, d6, d7, par1Entity.rotationYaw, par1Entity.rotationPitch);
                return true;
            }
            else
            {
                return false;
            }
        }
    
       
    
    
    }
    [DOUBLEPOST=1444197978,1444197915][/DOUBLEPOST]Если поможете буду пол жизни благодарен.
     
    Последнее редактирование: 7 окт 2015
  18. Автор темы
    progres

    progres Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    siska228
    Он та создаёт но то что он пишет там очень и очень непонятно. Один коментарий на целый класс.... Я конечно всё понимаю но такими темпами(плюс без каких либо мануалов) разбератца придётся в этом очень долго. А гугл.... скажем так я щас в активном поиске но с моими знаниями EN это будет тоже довольно долго.
     

Поделиться этой страницей