Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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();
      
    }

Примечания: Всё определенно и проинициализированно. Ошибка нет. Оно просто не работает. А вот почему....
 
Последнее редактирование:
Код вроде верный.
Знаю что написано, но таки спрошу. Листенер регнут?
 
Листенер регнут?
Малость не понял вас. Но мне кажется вы имеете в виду массив z либо наследование и подключение главном методе плагина. Если это массив z то я его объявлял в самом верху кода как глобальный. Что бы не было проблем. А если вы всё таки имели в виду второе то у меня на ум приходит только то что вы имели в виду как написана эта строка.
Код:
 public class Sly extends JavaPlugin implements Listener
Если не то не другое то объясните а то я плагины не давно начал делать и ещё не всё могу понимать :)
 
Малость не понял вас. Но мне кажется вы имеете в виду массив z либо наследование и подключение главном методе плагина. Если это массив z то я его объявлял в самом верху кода как глобальный. Что бы не было проблем. А если вы всё таки имели в виду второе то у меня на ум приходит только то что вы имели в виду как написана эта строка.
Код:
 public class Sly extends JavaPlugin implements Listener
Если не то не другое то объясните а то я плагины не давно начал делать и ещё не всё могу понимать :)
Bukkit.getPluginManager().registerEvents(this, this);
 
Bukkit.getPluginManager().registerEvents(this, this);
Это есть только немного в другой форме

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

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

@Override
public void onEnable(){
Однака это не как не меняет моего вопроса. В чём проблема???
 
Это есть только немного в другой форме

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

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

@Override
public void onEnable(){
Однака это не как не меняет моего вопроса. В чём проблема???
Вы пытаетесь отследить открытие инвентаря пользователя? Или инвентарь сундука, и прочих блоков с GUI?
Если инвентарь пользователя, то это сделать нельзя т.к. для сервера у игрока всегда открыт инвентарь и событие открытия GUI'шки обрабатывается только клиентом.
 
Вы пытаетесь отследить открытие инвентаря пользователя? Или инвентарь сундука, и прочих блоков с GUI?
Если инвентарь пользователя, то это сделать нельзя т.к. для сервера у игрока всегда открыт инвентарь и событие открытия GUI'шки обрабатывается только клиентом.
Большое спасибо! А я ведь и пытался отследить открытие инвентаря пользователя. Но теперь у меня появилсь другие вопросы.
1)Я так понимаю под "событие открытия GUI'шки обрабатывается только клиентом" вы подразумеваете что это нужно делать при помощи мода? Если да то получается у мода есть как серверная часть так и клиентская? Или же существует что то ещё для работы с клиентом?? (Например у меня есть мод. Его серверная часть работает как плагин?)
2)"для сервера у игрока всегда открыт инвентарь". Я так понимаю то что я написал это работает исключительно для сундуков которые открывает пользователь и прочих блоков? И если для сервера у игрока всегда открыт инвентарь то значит можно как то отследить клик мышки по ячейки инвентаря игрока? Если да то как это сделать или скажите хотя бы EVENT для этого? Хотя я конечно догадываюсь что это нечто вроде InventoryClickEvent но всё же если это так то скажите хотя бы.
 
Последнее редактирование:
@progres,
1) Да, это можно сделать модом, но нужно ли? Серверная часть мода работает как серверная часть мода :) Она использует не Bukkit API, а Forge API
2) Событие как вы и сказали InventoryClickEvent, а проверить, что пользователь находится в инвентаре можно так:
Java:
if (event.getInventory().getType() == InventoryType.CRAFTING) {
    // smth...
}
 
@progres,
1) Да, это можно сделать модом, но нужно ли? Серверная часть мода работает как серверная часть мода :) Она использует не Bukkit API, а Forge API
2) Событие как вы и сказали InventoryClickEvent, а проверить, что пользователь находится в инвентаре можно так:
Java:
if (event.getInventory().getType() == InventoryType.CRAFTING) {
    // smth...
}
Я так понимаю в условии сравниваютца текущие состояние инвентаря это вроде event.getInventory().getType() (открыт GUI/закрыт GUI) и...... а вот что это (InventoryType.CRAFTING) делает я что то не понял.
И да если можете бросьте ссылку на Forge API касательно серверной части а то я много нашёл про то как делать разные вещи на клиенте а вот как мод должен взаимодействовать со своей серверной частью....
 
event.getInventory().getType() - получаем тип инвентаря который открыт
InventoryType - тип инвентаря. CRAFTING - открыт инвентарь игрока
Есть так же значения CHEST, DISPENSER, WORKBENCH и т.д. которые понятно за что отвечают.
Насчет Forge (это дейстивтельно нужно?) - надо смотреть в сторону Sided Proxy и Server Side методов. Более конкретно сказать не могу, т.к. последний раз модил под 1.6.4
 
Последнее редактирование:
Не лезте в форджи. Там нечего делать.

Что вы хотите сделать?
 
Не лезте в форджи. Там нечего делать.

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

2)"Не лезьте в форджи." К стати хотел спросить как сделать нечто на подобии galacticraft??? Что бы был мод который создавал мир со своими свойствами и своим перемещнием в него?? Ну на счёт перемещения вроде не проблем а вот с мирам... Это же в любом случае нужна серверная часть мода?
 
@progres, "Говорит типа Could not pass event" - нудно больше информации, а именно какое исключение было выкинуто и в каком месте. В чем проблема? Вот например вывожу все айтемы в консоль:
Java:
for (ItemStack item : event.getPlayer().getInventory().getContents()) {
    System.out.println(item);
}
"мир со своими свойствами" - если не собираетесь создавать новые блоки/растения и т.д. то можно справиться без мода.
 
@OsipXD Большое спасибо теперь заработало.... А я что то не в курсе был что есть такое оформление цикла... я просто в java не давно. А так я выходец из Delphi и PHP :) К стати такое оформление конструкции похоже на foreach в php для перебора массива... не хватает только переменной куда бы падал ключик ячейки...
На счёт этого....
"мир со своими свойствами" - если не собираетесь создавать новые блоки/растения и т.д. то можно справиться без мода.
Дело в том что мне и надо как рас что бы был абсолютно новый мир который бы генерировался из блоков добавляемых моим модом. Плюс нужно что бы сервер и мод общались по какому то протокуолу и кое что передавали (это уже небольшой сикрет). Я конечно могу ошибацтца но я больше не вижу вриантов как сделать это без серверной части мода.
 
@progres, это и есть foreach :)
Тут мало что скажут насчет моддинга, лучше спрашивать forum.mcmodding.ru
Правда там довольно сложно чего-то добиться.. Скорее скажут что-то вроде "Да, это сделать можно, но это настолько легко, что я даже говорить не буду как"
 
@OsipXD и кое что передавали (это уже небольшой сикрет).
Наверняка dimensiondata планируется передавать, что уже тянет на код типа Mystcraft-ового, но его декомплировать запрещено, поэтому не могу сказать ничего(а, не, могу, RFTools имеет открытый исходный код). А так для регистрации Dimension-а достаточно сделать, кажется, свои WorldProvider, ChunkProvider, WorldChunkManager и Teleporter. Конечно, половину всего кода можно взять из классов Nether-а, как обычно и делается, но в случае с динамическими dimension-ами придётся использовать систему пакетов и соответствующих моду каналов, что, впрочем, вполне мирно врезается в worldprovider для изменения параметров мира.
 
А так для регистрации Dimension-а достаточно сделать, кажется, свои WorldProvider, ChunkProvider, WorldChunkManager и Teleporter. Конечно, половину всего кода можно взять из классов Nether-а, как обычно и делается, но в случае с динамическими dimension-ами придётся использовать систему пакетов и соответствующих моду каналов, что, впрочем, вполне мирно врезается в worldprovider для изменения параметров мира.
"классов 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;
        }
    }

   


}

Если поможете буду пол жизни благодарен.
 
Последнее редактирование:
"классов Nether-а" Это вы имеете в виду классы Эндар мира??
И если честно то чувствую кода получится на 1700 с лишним строчек Эх... Лад и не такое вытворял :cool:
Однако если вам не сложно можете помочь с WorldProvider, ChunkProvider, WorldChunkManager и Teleporter??
Можно взять и Ender-измерение за основу, конечно, но всё же обычно берут незер.
Не надо считать такой код в строчках, в конце концов, бОльшая часть не изменяется.
Хотел посоветовать туториалы по измерениями с вики форджа, но их там уже нет, так что могу лишь отправить в гугл с соответствующим запросом... впрочем, даже MCreator, кажется, может их создавать.
 
даже MCreator, кажется, может их создавать.
Он та создаёт но то что он пишет там очень и очень непонятно. Один коментарий на целый класс.... Я конечно всё понимаю но такими темпами(плюс без каких либо мануалов) разбератца придётся в этом очень долго. А гугл.... скажем так я щас в активном поиске но с моими знаниями EN это будет тоже довольно долго.
 

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

Назад
Верх