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

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

Discussion in 'Разработка плагинов для новичков' started by progres, Oct 4, 2015.

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

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

    Trophy Points:
    21
    Имя в Minecraft:
    siska228
    1)При открытие инвентаря всё его содержимое должно куда либо выводится в данном случае в конфиг.
    2)Проблема:Вообще не чего не делает при открытие инвентаря. Как будто этого события вообще нет.
    3)Код:
    Code:
    @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();
          
        }
    
    Примечания: Всё определенно и проинициализированно. Ошибка нет. Оно просто не работает. А вот почему....
     
    Last edited: Oct 4, 2015
  2. Хостинг MineCraft
    <
  3. ql_Nik_lp

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    21
    Имя в Minecraft:
    siska228
    "классов Nether-а" Это вы имеете в виду классы Эндар мира??
    И если честно то чувствую кода получится на 1700 с лишним строчек Эх... Лад и не такое вытворял :cool:
    Однако если вам не сложно можете помочь с WorldProvider, ChunkProvider, WorldChunkManager и Teleporter??? А то я посмотрел и у меня как минимум уже такая вот картинка начала вырисововыеться....... Это то что я щас пытаюсь сделать.......
    Code:
    @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]Если поможете буду пол жизни благодарен.
     
    Last edited: Oct 7, 2015
  18. Автор темы
    progres

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

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

Share This Page