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

Фикс Эвенты для модов [1.7.10/Устаревшие/SRC]

Тема в разделе "Управление сервером Bukkit", создана пользователем Shevchik, 12 янв 2014.

  1. SkyPrince

    SkyPrince Активный участник Пользователь

    Баллы:
    88
    Skype:
    skyprince-2014
    Имя в Minecraft:
    SkyPrince
    Можешь подсказать какая версия лучше? Поставил 4.3.5 все равно падает, но уже не так сильно
     
  2. Хостинг MineCraft
    <
  3. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Качай с официального сайта. Там всё написано.
     
  4. SkyPrince

    SkyPrince Активный участник Пользователь

    Баллы:
    88
    Skype:
    skyprince-2014
    Имя в Minecraft:
    SkyPrince
    Так я оттуда и скачал 4.3.5 build #30
    И 4.3.7 работал без ошибок пока эти эвенты не воткнул.[DOUBLEPOST=1398199526,1398157133][/DOUBLEPOST]Хотя нет, с 4.3.5 не падает вроде больше, спасибо!
     
  5. komiss

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

    Баллы:
    103
    Имя в Minecraft:
    komiss77
    Пытаюсь слепить разрушение блоков от взрыва в моде в основном мире, и оставить в других мирах.
    Помогите дописать.
    Вот ключевой участок кода:
    int k1 = worldObj.getBlockId(l, i1, j1); --берётся id блока

    if (k1 > 0)
    { Block block = Block.blocksList[k1];
    float f3 = exploder != null ? exploder.getBlockExplosionResistance(this, worldObj, l, i1, j1, block) : block.getExplosionResistance(exploder, worldObj, l, i1, j1, explosionX, explosionY, explosionZ);
    f1 -= (f3 + 0.3F) * f2; }
    - если это не воздух, то расчитывается какой дамаж он должен получить

    if (f1 > 0.0F && (exploder == null || exploder.shouldExplodeBlock(this, worldObj, l, i1, j1, k1, f1)))
    { hashset.add(new ChunkPosition(l, i1, j1)); }
    -если дамаж не нулвой, то блок обновляется в мире

    Моих скудных знаний хватает сообразить, что проверку мира нужно добавить где-то тут:
    if (f1 > 0.0F && <<<<world!=world >>>>&& (exploder == null ||
    только как это правильно сделать??
     
  6. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Здесь я не вижу метода, вызывающего взрыв (тут только расчёт). Выкладывай весь класс (запихни в тег code или на rghost закинь).
     
  7. komiss

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

    Баллы:
    103
    Имя в Minecraft:
    komiss77
    Код:
    package co.uk.flansmods.common.guns;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    
    import co.uk.flansmods.common.InfoType;
    
    import net.minecraft.block.Block;
    import net.minecraft.enchantment.EnchantmentProtection;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.item.EntityTNTPrimed;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.network.packet.Packet60Explosion;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.util.DamageSource;
    import net.minecraft.util.MathHelper;
    import net.minecraft.util.Vec3;
    import net.minecraft.world.ChunkPosition;
    import net.minecraft.world.Explosion;
    import net.minecraft.world.World;
    import net.minecraftforge.event.world.BlockEvent.BreakEvent;
    
    public class FlansModExplosion extends Explosion
    {
        private int boomRadius = 16;
        private Random explosionRNG = new Random();
        private HashMap<EntityPlayer, Vec3> playerLocations = new HashMap<EntityPlayer, Vec3>();
        private World worldObj;
        public InfoType type;
        public EntityPlayer player;
        public List nonProcessedBlockPositions = new ArrayList();
    
        public FlansModExplosion(World w, Entity e, EntityPlayer p, InfoType t, double x, double y, double z, float r, boolean breakBlocks)
        {
            super(w, e, x, y, z, r);
            worldObj = w;
            type = t;
            player = p;
            isFlaming = false;
            isSmoking = breakBlocks;
            doExplosionA();
            doExplosionB(true);
      
            if(!worldObj.isRemote)
            {
                if (!breakBlocks)
                    affectedBlockPositions.clear();
    
                Iterator iterator = worldObj.playerEntities.iterator();
    
                while (iterator.hasNext())
                {
                    EntityPlayer entityplayer = (EntityPlayer)iterator.next();
                    if (entityplayer.getDistanceSq(x, y, z) < 4096.0D)
                        ((EntityPlayerMP)entityplayer).playerNetServerHandler.sendPacketToPlayer(new Packet60Explosion(x, y, z, r, affectedBlockPositions, (Vec3)func_77277_b().get(entityplayer)));
                }
            }
        }
    
        @Override
        public void doExplosionA()
        {
            float f = explosionSize;
            HashSet hashset = new HashSet();
            double d0;
            double d1;
            double d2;
    
            for(int i = 0; i < boomRadius; ++i)
            {
                for(int j = 0; j < boomRadius; ++j)
                {
                    for(int k = 0; k < boomRadius; ++k)
                    {
                        if(i == 0 || i == boomRadius - 1 || j == 0 || j == boomRadius - 1 || k == 0 || k == boomRadius - 1)
                        {
                            double d3 = (i / (boomRadius - 1.0F) * 2.0F - 1.0F);
                            double d4 = (j / (boomRadius - 1.0F) * 2.0F - 1.0F);
                            double d5 = (k / (boomRadius - 1.0F) * 2.0F - 1.0F);
                            double d6 = Math.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
                            d3 /= d6;
                            d4 /= d6;
                            d5 /= d6;
                            float f1 = explosionSize * (0.7F + worldObj.rand.nextFloat() * 0.6F);
                            d0 = explosionX;
                            d1 = explosionY;
                            d2 = explosionZ;
    
                            for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F)
                            {
                                int l = MathHelper.floor_double(d0);
                                int i1 = MathHelper.floor_double(d1);
                                int j1 = MathHelper.floor_double(d2);
                                int k1 = worldObj.getBlockId(l, i1, j1);
    
                                if (k1 > 0)
                                {
                                    Block block = Block.blocksList[k1];
                                    float f3 = exploder != null ? exploder.getBlockExplosionResistance(this, worldObj, l, i1, j1, block) : block.getExplosionResistance(exploder, worldObj, l, i1, j1, explosionX, explosionY, explosionZ);
                                    f1 -= (f3 + 0.3F) * f2;
                                }
    
                                if (f1 > 0.0F && (exploder == null || exploder.shouldExplodeBlock(this, worldObj, l, i1, j1, k1, f1)))
                                {
                              //    hashset.add(new ChunkPosition(l, i1, j1));
                                }
    
                                d0 += d3 * f2;
                                d1 += d4 * f2;
                                d2 += d5 * f2;
                            }
                        }
                    }
                }
            }
    
            nonProcessedBlockPositions.addAll(hashset);
            explosionSize *= 2.0F;
            int i = MathHelper.floor_double(explosionX - explosionSize - 1.0D);
            int j = MathHelper.floor_double(explosionX + explosionSize + 1.0D);
            int k = MathHelper.floor_double(explosionY - explosionSize - 1.0D);
            int l1 = MathHelper.floor_double(explosionY + explosionSize + 1.0D);
            int i2 = MathHelper.floor_double(explosionZ - explosionSize - 1.0D);
            int j2 = MathHelper.floor_double(explosionZ + explosionSize + 1.0D);
            List list = worldObj.getEntitiesWithinAABBExcludingEntity(exploder, AxisAlignedBB.getAABBPool().getAABB(i, k, i2, j, l1, j2));
            Vec3 vec3 = worldObj.getWorldVec3Pool().getVecFromPool(explosionX, explosionY, explosionZ);
    
            for (int k2 = 0; k2 < list.size(); ++k2)
            {
                Entity entity = (Entity)list.get(k2);
                double d7 = entity.getDistance(explosionX, explosionY, explosionZ) / explosionSize;
    
                if (d7 <= 1.0D)
                {
                    d0 = entity.posX - explosionX;
                    d1 = entity.posY + entity.getEyeHeight() - explosionY;
                    d2 = entity.posZ - explosionZ;
                    double d8 = MathHelper.sqrt_double(d0 * d0 + d1 * d1 + d2 * d2);
    
                    if (d8 != 0.0D)
                    {
                        d0 /= d8;
                        d1 /= d8;
                        d2 /= d8;
                        double d9 = worldObj.getBlockDensity(vec3, entity.boundingBox);
                        double d10 = (1.0D - d7) * d9;
                        entity.attackEntityFrom(player == null ? DamageSource.setExplosionSource(this) : new EntityDamageSourceGun(type.shortName, entity, player, type), ((int)((d10 * d10 + d10) / 2.0D * 8.0D * explosionSize + 1.0D)));
                        double d11 = EnchantmentProtection.func_92092_a(entity, d10);
                        entity.motionX += d0 * d11;
                        entity.motionY += d1 * d11;
                        entity.motionZ += d2 * d11;
    
                        if (entity instanceof EntityPlayer)
                        {
                            playerLocations.put((EntityPlayer)entity, worldObj.getWorldVec3Pool().getVecFromPool(d0 * d10, d1 * d10, d2 * d10));
                        }
                    }
                }
            }
    
            explosionSize = f;
        }
    
        /**
        * Does the second part of the explosion (sound, particles, drop spawn)
        */
        @Override
        public void doExplosionB(boolean par1)
        {
            worldObj.playSoundEffect(explosionX, explosionY, explosionZ, "random.explode", 4.0F, (1.0F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F) * 0.7F);
    
            if (explosionSize >= 2.0F && isSmoking)
            {
                worldObj.spawnParticle("hugeexplosion", explosionX, explosionY, explosionZ, 1.0D, 0.0D, 0.0D);
            }
            else
            {
                worldObj.spawnParticle("largeexplode", explosionX, explosionY, explosionZ, 1.0D, 0.0D, 0.0D);
            }
    
            Iterator iterator;
            ChunkPosition chunkposition;
            int i;
            int j;
            int k;
            int l;
    
            if (isSmoking)
            {
                iterator = nonProcessedBlockPositions.iterator();
    
                while (iterator.hasNext())
                {
                    chunkposition = (ChunkPosition)iterator.next();
                    i = chunkposition.x;
                    j = chunkposition.y;
                    k = chunkposition.z;
                    l = worldObj.getBlockId(i, j, k);
    
                    if (par1)
                    {
                        double d0 = (i + worldObj.rand.nextFloat());
                        double d1 = (j + worldObj.rand.nextFloat());
                        double d2 = (k + worldObj.rand.nextFloat());
                        double d3 = d0 - explosionX;
                        double d4 = d1 - explosionY;
                        double d5 = d2 - explosionZ;
                        double d6 = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5);
                        d3 /= d6;
                        d4 /= d6;
                        d5 /= d6;
                        double d7 = 0.5D / (d6 / explosionSize + 0.1D);
                        d7 *= (worldObj.rand.nextFloat() * worldObj.rand.nextFloat() + 0.3F);
                        d3 *= d7;
                        d4 *= d7;
                        d5 *= d7;
                        worldObj.spawnParticle("explode", (d0 + explosionX * 1.0D) / 2.0D, (d1 + explosionY * 1.0D) / 2.0D, (d2 + explosionZ * 1.0D) / 2.0D, d3, d4, d5);
                        worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5);
                    }
    
                    if (l > 0)
                    {
                        Block block = Block.blocksList[l];
                        BreakEvent breakEvent = new BreakEvent(i, j, k, worldObj, block, worldObj.getBlockMetadata(i, j, k), player);
    
                        if(!breakEvent.isCanceled())
                        {
                            if (block.canDropFromExplosion(this))
                            {
                                block.dropBlockAsItemWithChance(worldObj, i, j, k, worldObj.getBlockMetadata(i, j, k), 1.0F / explosionSize, 0);
                            }
    
                            block.onBlockExploded(worldObj, i, j, k, this);
                            affectedBlockPositions.add(chunkposition);
                        }
                    }
                }
            }
    
            if (isFlaming)
            {
                iterator = nonProcessedBlockPositions.iterator();
    
                while (iterator.hasNext())
                {
                    chunkposition = (ChunkPosition)iterator.next();
                    i = chunkposition.x;
                    j = chunkposition.y;
                    k = chunkposition.z;
                    l = worldObj.getBlockId(i, j, k);
                    int i1 = worldObj.getBlockId(i, j - 1, k);
    
                    if (l == 0 && Block.opaqueCubeLookup[i1] && explosionRNG.nextInt(3) == 0)
                    {
                        worldObj.setBlock(i, j, k, Block.fire.blockID);
                    }
                }
            }
        }
    
        @Override
        public Map func_77277_b()
        {
            return playerLocations;
        }
    
        public EntityLivingBase func_94613_c()
        {
            return exploder == null ? null : (exploder instanceof EntityTNTPrimed ? ((EntityTNTPrimed)exploder).getTntPlacedBy() : (exploder instanceof EntityLivingBase ? (EntityLivingBase)exploder : null));
        }
    }
    
    Насколько я понял, вызова метода взрыва нет, а, как и во многих модах, идет прямая работа с содержимым чанков. Через события кидается только дроп, EntityDamage, звук взрыва и т.д.
    С помощью // перед hashset.add(new ChunkPosition я на данный момент просто убрал разрушения блоков вообще.
     
    Последнее редактирование: 23 апр 2014
  8. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    BreakEvent breakEvent = new BreakEvent(i, j, k, worldObj, block, worldObj.getBlockMetadata(i, j, k), player);
    Опа чё, мод бросает стандартный форджевский эвент.
     
  9. komiss

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

    Баллы:
    103
    Имя в Minecraft:
    komiss77
    Ну, мне до Шевчика ещё учиться и учиться..) Но всё же, как добавить проверку мира? У меня просто такая концепция на сервере - основной мир для жизни с максимальной защитой от вандализма, и есть мир, где можно всё взрывать/копать.

    PS немного подумал, похоже что этот BreakEvent делает только дроп. А уничтожение блоков в от взрыва идёт именно там, где я поставил // (проверял, работает, блоки не рушатся). Надо вечером ещё поэксперементировать, разобраться до конца.
     
    Последнее редактирование: 23 апр 2014
  10. Radviger

    Radviger Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    Radviger
    Прошу прилепить к событию открытия Сейфа из IC2 не проверку на op, а проверку на пермиссию, например - ic2.safe.access(для открытия), ic2.safe.destroy(для ломания/сворачивания) или что-то подобное

    P.S. Было бы очень полезно, особенно для модерации, для проверки сейфов на предмет дюперства, читерства и т.д. , т.к. в основном плохие игроки там и прячут всё своё "добро".
     
  11. dirt34

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

    Баллы:
    143
    Skype:
    alucid2
    Имя в Minecraft:
    dirt34

    запрети его и всё.[DOUBLEPOST=1399103870,1399103564][/DOUBLEPOST]Shevchik, сделай пожалуйста крафт предметов в IC2 Experimental build #397, ибо если я ставлю фикс у меня не работают крафты из Gravity Suite
     
  12. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Данную инфу легко вытащить из TileEntity в этой позиции. Так что закажите кому-нибудь написание плагина который может вытащить такую инфу.
    Я работать с IC2 скорее всего уже не буду, слишком занят.
    IC2Fixes установи.
     
  13. dirt34

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

    Баллы:
    143
    Skype:
    alucid2
    Имя в Minecraft:
    dirt34
    я ж тебе написал что я его ставил и из-за него у меня не крафтов предметов из мода GraviSuite
     
  14. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    В таком случае ничем не могу помочь.
     
  15. dirt34

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

    Баллы:
    143
    Skype:
    alucid2
    Имя в Minecraft:
    dirt34
    а посмотерть никак не можешь?[DOUBLEPOST=1399114540,1399113626][/DOUBLEPOST]решил проблему.[DOUBLEPOST=1399114617][/DOUBLEPOST]Shevchik, Почему у меня в консоли появляеться вот такое:

    Код:
    2014-05-03 13:53:28 [SEVERE] Could not pass event BlockPlaceEvent to ModFixNG v1.0
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:437)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
        at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:31)
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:479)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:464)
        at org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory.callBlockPlaceEvent(CraftEventFactory.java:123)
        at net.minecraft.item.ItemStack.func_77943_a(ItemStack.java:235)
        at net.minecraft.item.ItemInWorldManager.func_73078_a(ItemInWorldManager.java:549)
        at net.minecraft.network.NetServerHandler.func_72472_a(NetServerHandler.java:896)
        at net.minecraft.network.packet.Packet15Place.func_73279_a(Packet15Place.java:79)
        at net.minecraft.network.TcpConnection.func_74428_b(TcpConnection.java:470)
        at net.minecraft.network.NetServerHandler.func_72570_d(NetServerHandler.java:233)
        at net.minecraft.network.NetworkListenThread.func_71747_b(NetworkListenThread.java:54)
        at net.minecraft.server.dedicated.DedicatedServerListenThread.func_71747_b(DedicatedServerListenThread.java:34)
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:910)
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:330)
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:777)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:659)
        at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
    Caused by: java.lang.NullPointerException
        at modfixng.fixes.ForgeMultipartPlaceFix.onBlockPlaceEvent(ForgeMultipartPlaceFix.java:60)
        at sun.reflect.GeneratedMethodAccessor141.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:435)
        ... 18 more
     
  16. Автор темы
    Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    У вас неправильно настоены айди мультиблоков.
     
    Последнее редактирование: 3 май 2014
  17. dirt34

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

    Баллы:
    143
    Skype:
    alucid2
    Имя в Minecraft:
    dirt34

    спасибо[DOUBLEPOST=1399119330,1399117978][/DOUBLEPOST]Shevchik, объясни как правильно добавлять id микроблоков
     
  18. evil32rus1

    evil32rus1 Активный участник Пользователь

    Баллы:
    63
    Имя в Minecraft:
    evil
    Подскажите куда класть исходники/классы build craft 4? Не пойму как установить эти эвенты
     
  19. dirt34

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

    Баллы:
    143
    Skype:
    alucid2
    Имя в Minecraft:
    dirt34
    закинуть в jar файл
     
  20. evil32rus1

    evil32rus1 Активный участник Пользователь

    Баллы:
    63
    Имя в Minecraft:
    evil
    Классы или исходники?
     
  21. dirt34

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

    Баллы:
    143
    Skype:
    alucid2
    Имя в Minecraft:
    dirt34
    классы. уже всё готово просто заменить и всё
     

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