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

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

Впрочем эвенты указанные вами WG и не слушает(кроме EntityExplodeEvent), так что они будут байпассить приват. Всё равно придётся писать плагин который будет слушать их и защищать приват. И опять же будут ли предметы грифить регион или нет будет зависеть от того как плагин привата написан. Что опять же возвращает нас к проблеме рандомной реакции плагинов на баккит эвенты брошенные с нестандартными аргументами.

Короче куда проще и лучше контролировать как сработают предметы самому, а с плагина привата дёргать только инфу о защищённости региона. А вот почему контролируется это на стороне плагина, а не мода - просто потому что плагин дописывать легче.

Я не спорю. Пришлось бы ловить EntityBlockFormEvent. Но это было 1 событие которое нужно было обработать, а не десяток. Должен действовать паттерн DRY - Dont Repeat Yourself. У нас своя защита, я бы просто хукнул это событие без необходимости писать другой плагин где я добавлю кучу кастомных событий :) Повторюсь, но проблем не будет до тех пор, пока вы не передаете нулевые значения. Что само собой вызовет NPE в каком нибудь плагине. Это вопрос реализации с вашей стороны. Просто учтите это на будущие :)
 
Я не спорю. Пришлось бы ловить EntityBlockFormEvent. Но это было 1 событие которое нужно было обработать, а не десяток. Должен действовать паттерн DRY - Dont Repeat Yourself. У нас своя защита, я бы просто хукнул это событие без необходимости писать другой плагин где я добавлю кучу кастомных событий :) Повторюсь, но проблем не будет до тех пор, пока вы не передаете нулевые значения. Что само собой вызовет NPE в каком нибудь плагине. Это вопрос реализации с вашей стороны. Просто учтите это на будущие :)
Сначала я вообще хотел сделать одно событие для одного типа действия, но потом решил сделать так чтобы различать типы машин (плагин стоящий у меня на сервер отличается от выложенного здесь), просто надо было сделать Enum который будет обозначать какой тип машины бросил эвент. Хотя мне кажется что фордж умер, так что писать эвенты мне больше не придётся.
 
Сначала я вообще хотел сделать одно событие для одного типа действия, но потом решил сделать так, просто надо сделать Enum который будет обозначать какой тип машины бросил эвент. Хотя мне кажется что фордж умер, так что писать эвенты мне больше не придётся.

Как вариант с ENUM. Правда я тоже не очень одобряю :) Фордж вроде как развивается. Хотя меня не особо интересует. Рано или поздно мы уже наконец допишем свой сервер и моды под себя..
 
Ситуация...

Смотрите, есть 2 мода, BC 4.2.2 и Project Red 4.3.7
Ставлю ваши эвенты, на тестовом серваке все идет отлично!
Но после установки на игровой, он начинает падать, как я понимаю из-за фикса труб:

Код:
2014-04-21 14:25:06 [SEVERE] net.minecraft.util.ReportedException: Ticking tile entity
2014-04-21 14:25:06 [SEVERE]    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:889)
2014-04-21 14:25:06 [SEVERE]    at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:330)
2014-04-21 14:25:06 [SEVERE]    at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:777)
2014-04-21 14:25:06 [SEVERE]    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:659)
2014-04-21 14:25:06 [SEVERE]    at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
2014-04-21 14:25:06 [SEVERE] Caused by: java.lang.NullPointerException
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(requests.scala:191)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply(requests.scala:155)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply(requests.scala:155)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:25)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply$mcV$sp(requests.scala:155)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply(requests.scala:154)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply(requests.scala:154)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode.doCraftReq(requests.scala:153)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode.doRequest$1(requests.scala:50)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestBranchNode.<init>(requests.scala:52)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestRoot.<init>(requests.scala:341)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RequestConsole.makeRequest(requests.scala:669)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply$mcV$sp(ChipStockKeeper.scala:55)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply(ChipStockKeeper.scala:43)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply(ChipStockKeeper.scala:43)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:25)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1.apply$mcVI$sp(ChipStockKeeper.scala:43)
2014-04-21 14:25:06 [SEVERE]    at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.ChipStockKeeper.update(ChipStockKeeper.scala:42)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RoutedInterfacePipePart$$anonfun$updateServer$1.apply(RoutedInterfacePipePart.scala:63)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RoutedInterfacePipePart$$anonfun$updateServer$1.apply(RoutedInterfacePipePart.scala:63)
2014-04-21 14:25:06 [SEVERE]    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
2014-04-21 14:25:06 [SEVERE]    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RoutedInterfacePipePart.updateServer(RoutedInterfacePipePart.scala:63)
2014-04-21 14:25:06 [SEVERE]    at mrtjp.projectred.transportation.RoutedJunctionPipePart.update(RoutedJunctionPipePart.scala:187)
2014-04-21 14:25:06 [SEVERE]    at codechicken.multipart.TileMultipart$$anonfun$updateEntity$1.apply(TileMultipart.scala:85)
2014-04-21 14:25:06 [SEVERE]    at codechicken.multipart.TileMultipart$$anonfun$updateEntity$1.apply(TileMultipart.scala:85)
2014-04-21 14:25:06 [SEVERE]    at codechicken.multipart.TileMultipart.operate(TileMultipart.scala:79)
2014-04-21 14:25:06 [SEVERE]    at codechicken.multipart.TileMultipart.func_70316_g(TileMultipart.scala:85)
2014-04-21 14:25:06 [SEVERE]    at net.minecraft.world.World.func_72939_s(World.java:2782)
2014-04-21 14:25:06 [SEVERE]    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:883)
2014-04-21 14:25:06 [SEVERE]    ... 4 more
2014-04-21 14:25:06 [SEVERE] Encountered an unexpected exception ReportedException
net.minecraft.util.ReportedException: Ticking tile entity
    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:889)
    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 mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(requests.scala:191)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply(requests.scala:155)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply(requests.scala:155)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:25)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply$mcV$sp(requests.scala:155)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply(requests.scala:154)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply(requests.scala:154)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
    at mrtjp.projectred.transportation.RequestBranchNode.doCraftReq(requests.scala:153)
    at mrtjp.projectred.transportation.RequestBranchNode.doRequest$1(requests.scala:50)
    at mrtjp.projectred.transportation.RequestBranchNode.<init>(requests.scala:52)
    at mrtjp.projectred.transportation.RequestRoot.<init>(requests.scala:341)
    at mrtjp.projectred.transportation.RequestConsole.makeRequest(requests.scala:669)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply$mcV$sp(ChipStockKeeper.scala:55)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply(ChipStockKeeper.scala:43)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply(ChipStockKeeper.scala:43)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:25)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1.apply$mcVI$sp(ChipStockKeeper.scala:43)
    at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141)
    at mrtjp.projectred.transportation.ChipStockKeeper.update(ChipStockKeeper.scala:42)
    at mrtjp.projectred.transportation.RoutedInterfacePipePart$$anonfun$updateServer$1.apply(RoutedInterfacePipePart.scala:63)
    at mrtjp.projectred.transportation.RoutedInterfacePipePart$$anonfun$updateServer$1.apply(RoutedInterfacePipePart.scala:63)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
    at mrtjp.projectred.transportation.RoutedInterfacePipePart.updateServer(RoutedInterfacePipePart.scala:63)
    at mrtjp.projectred.transportation.RoutedJunctionPipePart.update(RoutedJunctionPipePart.scala:187)
    at codechicken.multipart.TileMultipart$$anonfun$updateEntity$1.apply(TileMultipart.scala:85)
    at codechicken.multipart.TileMultipart$$anonfun$updateEntity$1.apply(TileMultipart.scala:85)
    at codechicken.multipart.TileMultipart.operate(TileMultipart.scala:79)
    at codechicken.multipart.TileMultipart.func_70316_g(TileMultipart.scala:85)
    at net.minecraft.world.World.func_72939_s(World.java:2782)
    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:883)
    ... 4 more

Краш:

Код:
---- Minecraft Crash Report ----
// Daisy, daisy...

Time: 4/21/14 4:12 PM
Description: Ticking tile entity

java.lang.NullPointerException
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(requests.scala:191)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply(requests.scala:155)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1$$anonfun$apply$mcV$sp$1.apply(requests.scala:155)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:25)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply$mcV$sp(requests.scala:155)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply(requests.scala:154)
    at mrtjp.projectred.transportation.RequestBranchNode$$anonfun$doCraftReq$1.apply(requests.scala:154)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
    at mrtjp.projectred.transportation.RequestBranchNode.doCraftReq(requests.scala:153)
    at mrtjp.projectred.transportation.RequestBranchNode.doRequest$1(requests.scala:50)
    at mrtjp.projectred.transportation.RequestBranchNode.<init>(requests.scala:52)
    at mrtjp.projectred.transportation.RequestRoot.<init>(requests.scala:341)
    at mrtjp.projectred.transportation.RequestConsole.makeRequest(requests.scala:669)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply$mcV$sp(ChipStockKeeper.scala:55)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply(ChipStockKeeper.scala:43)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1$$anonfun$apply$mcVI$sp$1.apply(ChipStockKeeper.scala:43)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:13)
    at mrtjp.projectred.core.utils.LabelBreaks.label(LabelBreaks.scala:25)
    at mrtjp.projectred.transportation.ChipStockKeeper$$anonfun$update$1.apply$mcVI$sp(ChipStockKeeper.scala:43)
    at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141)
    at mrtjp.projectred.transportation.ChipStockKeeper.update(ChipStockKeeper.scala:42)
    at mrtjp.projectred.transportation.RoutedInterfacePipePart$$anonfun$updateServer$1.apply(RoutedInterfacePipePart.scala:63)
    at mrtjp.projectred.transportation.RoutedInterfacePipePart$$anonfun$updateServer$1.apply(RoutedInterfacePipePart.scala:63)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
    at mrtjp.projectred.transportation.RoutedInterfacePipePart.updateServer(RoutedInterfacePipePart.scala:63)
    at mrtjp.projectred.transportation.RoutedJunctionPipePart.update(RoutedJunctionPipePart.scala:187)
    at codechicken.multipart.TileMultipart$$anonfun$updateEntity$1.apply(TileMultipart.scala:85)
    at codechicken.multipart.TileMultipart$$anonfun$updateEntity$1.apply(TileMultipart.scala:85)
    at codechicken.multipart.TileMultipart.operate(TileMultipart.scala:79)
    at codechicken.multipart.TileMultipart.func_70316_g(TileMultipart.scala:85)
    at net.minecraft.world.World.func_72939_s(World.java:2782)
    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:883)
    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)

Но при этом дюпы труб на Project Red так же фиксятся.
Кто-нибудь сталкивался с данной проблемой?

И еще второй вопрос, есть ли фиксы IC2E для более старших версий?
 
Project Red 4.3.7 - это не проверенный билд. На тестовом сервере всё конечно работает хорошо, так как там некому пользоваться трубами кроме Вас.
 
Project Red 4.3.7 - это не проверенный билд. На тестовом сервере всё конечно работает хорошо, так как там некому пользоваться трубами кроме Вас.
Можешь подсказать какая версия лучше? Поставил 4.3.5 все равно падает, но уже не так сильно
 
Пытаюсь слепить разрушение блоков от взрыва в моде в основном мире, и оставить в других мирах.
Помогите дописать.
Вот ключевой участок кода:
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 ||
только как это правильно сделать??
 
Пытаюсь слепить разрушение блоков от взрыва в моде в основном мире, и оставить в других мирах.
Помогите дописать.
Вот ключевой участок кода:
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 ||
только как это правильно сделать??
Здесь я не вижу метода, вызывающего взрыв (тут только расчёт). Выкладывай весь класс (запихни в тег code или на rghost закинь).
 
Код:
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 я на данный момент просто убрал разрушения блоков вообще.
 
Последнее редактирование:
BreakEvent breakEvent = new BreakEvent(i, j, k, worldObj, block, worldObj.getBlockMetadata(i, j, k), player);
Опа чё, мод бросает стандартный форджевский эвент.
 
BreakEvent breakEvent = new BreakEvent(i, j, k, worldObj, block, worldObj.getBlockMetadata(i, j, k), player);
Опа чё, мод бросает стандартный форджевский эвент.

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

PS немного подумал, похоже что этот BreakEvent делает только дроп. А уничтожение блоков в от взрыва идёт именно там, где я поставил // (проверял, работает, блоки не рушатся). Надо вечером ещё поэксперементировать, разобраться до конца.
 
Последнее редактирование:
Прошу прилепить к событию открытия Сейфа из IC2 не проверку на op, а проверку на пермиссию, например - ic2.safe.access(для открытия), ic2.safe.destroy(для ломания/сворачивания) или что-то подобное

P.S. Было бы очень полезно, особенно для модерации, для проверки сейфов на предмет дюперства, читерства и т.д. , т.к. в основном плохие игроки там и прячут всё своё "добро".
 
Прошу прилепить к событию открытия Сейфа из IC2 не проверку на op, а проверку на пермиссию, например - ic2.safe.access(для открытия), ic2.safe.destroy(для ломания/сворачивания) или что-то подобное

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


запрети его и всё.
Shevchik, сделай пожалуйста крафт предметов в IC2 Experimental build #397, ибо если я ставлю фикс у меня не работают крафты из Gravity Suite
 
Прошу прилепить к событию открытия Сейфа из IC2 не проверку на op, а проверку на пермиссию, например - ic2.safe.access(для открытия), ic2.safe.destroy(для ломания/сворачивания) или что-то подобное

P.S. Было бы очень полезно, особенно для модерации, для проверки сейфов на предмет дюперства, читерства и т.д. , т.к. в основном плохие игроки там и прячут всё своё "добро".
Данную инфу легко вытащить из TileEntity в этой позиции. Так что закажите кому-нибудь написание плагина который может вытащить такую инфу.
Я работать с IC2 скорее всего уже не буду, слишком занят.
запрети его и всё.
Shevchik, сделай пожалуйста крафт предметов в IC2 Experimental build #397, ибо если я ставлю фикс у меня не работают крафты из Gravity Suite
IC2Fixes установи.
 
В таком случае ничем не могу помочь.

а посмотерть никак не можешь?
решил проблему.
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
 
а посмотерть никак не можешь?
решил проблему.
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
У вас неправильно настоены айди мультиблоков.
 
Последнее редактирование:

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

Назад
Верх