Jump to content
  • Home
  • Files
  • Docs
Status Updates
  • All Content

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • SCAREX

SCAREX

Members
 View Profile  See their activity
  • Content Count

    28
  • Joined

    January 4, 2015
  • Last visited

    June 5, 2016

 Content Type 

  • All Activity

Profiles

  • Status Updates
  • Status Replies

Forums

  • Topics
  • Posts

Calendar

  • Events

Posts posted by SCAREX

  1. [1.7]Naming Item

    in Modder Support

    Posted November 2, 2015


    Your instance annotation should have the modid inside, not the name

  2. Making an add-on mod / Using an API

    in Modder Support

    Posted November 2, 2015


    You can download all the mods you want using gradle : just use the dev version (de-obfuscated) or add the code chicken core (/code chicken lib) in your dev workspace to play with obfuscated mods without de-deobfuscating the mod, I've made a tutorial for this here : http://www.minecraftforgefrance.fr/showthread.php?tid=2689 (in french sorry)

     

    There is 3 types of jars : the obfuscated (the one used to play), the de-obfuscated (to use in your dev environment), the source (uncompiled files).

     

    the API seems to be only the files to use to make your classpath happy

  3. [solved][1.7.10] Crash with particles

    in Modder Support

    Posted July 3, 2015


    Correction :  it seems to work, before I tested it no particles appeared.

     

    EDIT : no particles appeared because I was using world.spawnParticle.

  4. [solved][1.7.10] Crash with particles

    in Modder Support

    Posted July 3, 2015


    Before I used if (this.worldObj.isRemote) but no particles appeared. I think it's because the particles are entities, and entities need to be spawned from the server.

  5. [solved][1.7.10] Crash with particles

    in Modder Support

    Posted July 3, 2015


    Recently I had to create a smoke grenade. In order to do this, I used particles but the problem was that the player could deactivate them in the options so I used another way to do it. All were fine during a time but after my game crashes with different crash reports :

     

    [02:20:38] [Client thread/INFO] [sTDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:388]: ---- Minecraft Crash Report ----

    // Uh... Did I do that?

     

    Time: 03/07/15 02:20

    Description: Ticking entity

     

    java.lang.NullPointerException: Ticking entity

    at net.minecraft.entity.Entity.moveEntity(Entity.java:709)

    at net.minecraft.entity.EntityLivingBase.moveEntityWithHeading(EntityLivingBase.java:1680)

    at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:2023)

    at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:431)

    at net.minecraft.entity.EntityAgeable.onLivingUpdate(EntityAgeable.java:138)

    at net.minecraft.entity.passive.EntityAnimal.onLivingUpdate(EntityAnimal.java:56)

    at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1816)

    at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:250)

    at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298)

    at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:684)

    at net.minecraft.world.World.updateEntity(World.java:2258)

    at net.minecraft.world.World.updateEntities(World.java:2108)

    at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:515)

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

     

    A detailed walkthrough of the error, its code path and all known details is as follows:

    ---------------------------------------------------------------------------------------

     

    -- Head --

    Stacktrace:

    at net.minecraft.entity.Entity.moveEntity(Entity.java:709)

    at net.minecraft.entity.EntityLivingBase.moveEntityWithHeading(EntityLivingBase.java:1680)

    at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:2023)

    at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:431)

    at net.minecraft.entity.EntityAgeable.onLivingUpdate(EntityAgeable.java:138)

    at net.minecraft.entity.passive.EntityAnimal.onLivingUpdate(EntityAnimal.java:56)

    at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1816)

    at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:250)

    at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298)

    at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:684)

    at net.minecraft.world.World.updateEntity(World.java:2258)

     

    -- Entity being ticked --

    Details:

    Entity Type: Pig (net.minecraft.entity.passive.EntityPig)

    Entity ID: 688

    Entity Name: Pig

    Entity's Exact location: -479,50, 70,00, 77,50

    Entity's Block location: World: (-480,70,77), Chunk: (at 0,4,13 in -30,4; contains blocks -480,0,64 to -465,255,79), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511)

    Entity's Momentum: 0,00, -0,08, 0,00

    Stacktrace:

    at net.minecraft.world.World.updateEntities(World.java:2108)

    at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:515)

     

    -- Affected level --

    Details:

    Level name: New World

    All players: 1 total; [EntityPlayerMP['SCAREXgaming'/595, l='New World', x=-223,77, y=79,01, z=180,91]]

    Chunk stats: ServerChunkCache: 1237 Drop: 0

    Level seed: -2073836179758848201

    Level generator: ID 00 - default, ver 1. Features enabled: true

    Level generator options:

    Level spawn location: World: (-152,64,256), Chunk: (at 8,4,0 in -10,16; contains blocks -160,0,256 to -145,255,271), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511)

    Level time: 1217482 game time, 6000 day time

    Level dimension: 0

    Level storage version: 0x04ABD - Anvil

    Level weather: Rain time: 68985 (now: false), thunder time: 48921 (now: false)

    Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true

    Stacktrace:

    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703)

    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)

    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)

    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)

    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

     

    -- System Details --

    Details:

    Minecraft Version: 1.7.10

    Operating System: Windows 8.1 (amd64) version 6.3

    Java Version: 1.7.0_71, Oracle Corporation

    Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation

    Memory: 2019293568 bytes (1925 MB) / 2340945920 bytes (2232 MB) up to 4772069376 bytes (4551 MB)

    JVM Flags: 2 total; -Xmx5G -Xms2G

    AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95

    FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.4.1481 4 mods loaded, 4 mods active

    States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored

    UCHIJAAAAAAAAA mcp{9.05} [Minecraft Coder Pack] (minecraft.jar)

    UCHIJAAAAAAAAA FML{7.10.99.99} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.4.1481-1.7.10.jar)

    UCHIJAAAAAAAAA Forge{10.13.4.1481} [Minecraft Forge] (forgeSrc-1.7.10-10.13.4.1481-1.7.10.jar)

    UCHIJAAAAAAAAA hilium{1.0.0} [Hilium Mod] (bin)

    GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.

    Profiler Position: N/A (disabled)

    Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used

    Player Count: 1 / 8; [EntityPlayerMP['SCAREXgaming'/595, l='New World', x=-223,77, y=79,01, z=180,91]]

    Type: Integrated Server (map_client.txt)

    Is Modded: Definitely; Client brand changed to 'fml,forge'

    [02:20:38] [Client thread/INFO] [sTDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:393]: #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2015-07-03_02.20.38-server.txt

    [02:20:38] [Client thread/INFO] [FML]: Waiting for the server to terminate/save.

    [02:20:38] [server thread/INFO]: Saving worlds

    [02:20:38] [server thread/INFO]: Saving chunks for level 'New World'/Overworld

    [02:20:38] [server thread/INFO]: Saving chunks for level 'New World'/Nether

    [02:20:38] [server thread/INFO]: Saving chunks for level 'New World'/The End

    [02:20:38] [server thread/INFO] [FML]: Unloading dimension 0

    [02:20:38] [server thread/INFO] [FML]: Unloading dimension -1

    [02:20:38] [server thread/INFO] [FML]: Unloading dimension 1

    [02:20:38] [server thread/INFO] [FML]: Applying holder lookups

    [02:20:38] [server thread/INFO] [FML]: Holder lookups applied

    [02:20:38] [server thread/INFO] [FML]: The state engine was in incorrect state SERVER_STOPPING and forced into state SERVER_STOPPED. Errors may have been discarded.

    [02:20:38] [Client thread/INFO] [FML]: Server terminated.

    AL lib: (EE) alc_cleanup: 1 device not closed

     

    My class : (EntityGrenade.class)

    public void performAction(MovingObjectPosition mop) {
    	switch (this.metadata) {
    	case 1:
    		if (this.fuse > 0) {
    			for (int i = 0; i < 4; i++) {
    				Minecraft mc = Minecraft.getMinecraft();
    				if (mc.renderViewEntity != null && mc.effectRenderer != null) {
    					float multi = 1.6F;
    					double x = this.posX + this.rand.nextGaussian() * multi;
    					double y = this.posY + ((this.rand.nextDouble() - 0.2D) * 3) * multi;
    					double z = this.posZ + this.rand.nextGaussian() * multi;
    
    					double d = mc.renderViewEntity.posX - x;
    					double d1 = mc.renderViewEntity.posY - y;
    					double d2 = mc.renderViewEntity.posZ - z;
    					if (d * d + d1 * d1 + d2 * d2 <= 1024.0D) mc.effectRenderer.addEffect(new EntitySmokeFX(this.worldObj, x, y, z, 0.0D, 0.0D, 0.0D, 2.0F)); // Particles are created here
    				}
    			}
    			if (this.fuse >= 20) this.setDead();
    		}
    		break;
    	default:
    		if (!this.worldObj.isRemote && this.fuse >= 40 || (mop != null && mop.entityHit != null)) {
    			this.setDead();
    			this.worldObj.createExplosion(this, this.posX, this.posY + 1.0D, this.posZ, 3.4F, this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"));
    		}
    		break;
    	}
    }

     

    The crash report is not always the same : the entity type change every time. Once it was an EntityItem and another time a particle.

     

    But the NPE is in these loops :

    List list = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(p_70091_1_, p_70091_3_, p_70091_5_));
    
                for (int i = 0; i < list.size(); ++i)
                {
                    p_70091_3_ = ((AxisAlignedBB)list.get(i)).calculateYOffset(this.boundingBox, p_70091_3_); // here (Entity.class:692)
                }
    
                this.boundingBox.offset(0.0D, p_70091_3_, 0.0D);
    
                if (!this.field_70135_K && d7 != p_70091_3_)
                {
                    p_70091_5_ = 0.0D;
                    p_70091_3_ = 0.0D;
                    p_70091_1_ = 0.0D;
                }
    
                boolean flag1 = this.onGround || d7 != p_70091_3_ && d7 < 0.0D;
                int j;
    
                for (j = 0; j < list.size(); ++j)
                {
                    p_70091_1_ = ((AxisAlignedBB)list.get(j)).calculateXOffset(this.boundingBox, p_70091_1_); // Or here (Entity.class:709)
                }
    
                this.boundingBox.offset(p_70091_1_, 0.0D, 0.0D);
    
                if (!this.field_70135_K && d6 != p_70091_1_)
                {
                    p_70091_5_ = 0.0D;
                    p_70091_3_ = 0.0D;
                    p_70091_1_ = 0.0D;
                }
    
                for (j = 0; j < list.size(); ++j)
                {
                    p_70091_5_ = ((AxisAlignedBB)list.get(j)).calculateZOffset(this.boundingBox, p_70091_5_); // Or here (Entity.class:723)
                }

     

    The only thing that can cause a NPE is the method "calculateYOffset" / "calculateXOffset" / "calculateZOffset". But when I see the code when the list comes from :

    public List getCollidingBoundingBoxes(Entity p_72945_1_, AxisAlignedBB p_72945_2_)
        {
            this.collidingBoundingBoxes.clear();
            int i = MathHelper.floor_double(p_72945_2_.minX);
            int j = MathHelper.floor_double(p_72945_2_.maxX + 1.0D);
            int k = MathHelper.floor_double(p_72945_2_.minY);
            int l = MathHelper.floor_double(p_72945_2_.maxY + 1.0D);
            int i1 = MathHelper.floor_double(p_72945_2_.minZ);
            int j1 = MathHelper.floor_double(p_72945_2_.maxZ + 1.0D);
    
            for (int k1 = i; k1 < j; ++k1)
            {
                for (int l1 = i1; l1 < j1; ++l1)
                {
                    if (this.blockExists(k1, 64, l1))
                    {
                        for (int i2 = k - 1; i2 < l; ++i2)
                        {
                            Block block;
    
                            if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000)
                            {
                                block = this.getBlock(k1, i2, l1);
                            }
                            else
                            {
                                block = Blocks.stone;
                            }
    
                            block.addCollisionBoxesToList(this, k1, i2, l1, p_72945_2_, this.collidingBoundingBoxes, p_72945_1_);
                        }
                    }
                }
            }
    
            double d0 = 0.25D;
            List list = this.getEntitiesWithinAABBExcludingEntity(p_72945_1_, p_72945_2_.expand(d0, d0, d0));
    
            for (int j2 = 0; j2 < list.size(); ++j2)
            {
                AxisAlignedBB axisalignedbb1 = ((Entity)list.get(j2)).getBoundingBox();
    
                if (axisalignedbb1 != null && axisalignedbb1.intersectsWith(p_72945_2_)) // NullPointerCheck with "axisalignedbb1 != null"
                {
                    this.collidingBoundingBoxes.add(axisalignedbb1);
                }
    
                axisalignedbb1 = p_72945_1_.getCollisionBox((Entity)list.get(j2));
    
                if (axisalignedbb1 != null && axisalignedbb1.intersectsWith(p_72945_2_)) // Same here
                {
                    this.collidingBoundingBoxes.add(axisalignedbb1);
                }
            }
    
            return this.collidingBoundingBoxes;
        }

     

    So it can't be the source of the crash. If you know why, tell me, it's been 4 days since I'm looking for an answer but it seems impossible for me.

     

    Forge version : tested in 1.7.10-10.13.4.1448 and 1.7.10-10.13.4.1481.

  6. [1.7.10] Entity mountable not working (problem with synchronization)

    in Modder Support

    Posted June 23, 2015


    I can get it to work by implementing IEntityAdditionalSpawnData, but it takes a bit of time to update the y offset :

     

    iA5xl.jpg

     

    After a bit of time :

    iA5zS.jpg

  7. [1.7.10] Entity mountable not working (problem with synchronization)

    in Modder Support

    Posted June 23, 2015


    Now, I can sit on thee block but the mounted Y offset is correct only for the server :

     

    package fr.scarex.hilium.block;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.world.World;
    import fr.scarex.hilium.Hilium;
    import fr.scarex.hilium.entity.EntitySit;
    import fr.scarex.hilium.tileentity.TileEntitySit;
    
    /**
    * @author SCAREX
    * 
    */
    public class BlockSit extends Block
    {
    protected BlockSit(Material material) {
    	super(material);
    }
    
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
    	if (this.canSit(world, x, y, z, player, side, hitX, hitY, hitZ)) {
    		EntitySit entity = new EntitySit(world, x + 0.5D, y + 0.5D, z + 0.5D, this.getOffsetY(world, x, y, z));
    		world.spawnEntityInWorld(entity);
    		entity.interactFirst(player);
    		return true;
    	}
    	return false;
    }
    
    public boolean canSit(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
    	return true;
    }
    
    public double getOffsetY(World world, int x, int y, int z) {
    	return 0.5D;
    }
    }
    

     

    package fr.scarex.hilium.block;
    
    import net.minecraft.block.material.Material;
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    import cpw.mods.fml.common.registry.GameRegistry;
    import fr.scarex.hilium.Hilium;
    import fr.scarex.hilium.client.ClientProxy;
    import fr.scarex.hilium.tileentity.TileEntitySit;
    import fr.scarex.hilium.tileentity.TileEntityUseless;
    
    /**
    * @author SCAREX
    * 
    */
    public class BlockToilet extends BlockSit
    {
    public static final String NAME = "toilet";
    
    protected BlockToilet() {
    	super(Material.glass);
    	this.setHardness(0.5F);
    	this.setResistance(5.0F);
    
    	this.setStepSound(this.soundTypeGlass);
    	this.setCreativeTab(CreativeTabs.tabDecorations);
    
    	this.setBlockName(Hilium.MODID + "_" + NAME);
    	this.setBlockTextureName(Hilium.MODID + ":" + NAME);
    
    	this.register();
    }
    
    private void register() {
    	GameRegistry.registerBlock(this, NAME);
    	GameRegistry.registerTileEntity(TileEntitySit.class, Hilium.MODID + ":" + NAME);
    }
    
    @Override
    public boolean renderAsNormalBlock() {
    	return false;
    }
    
    @Override
    public int getRenderType() {
    	return ClientProxy.RENDER_ID;
    }
    
    @Override
    public boolean isOpaqueCube() {
    	return false;
    }
    
    @Override
    public boolean hasTileEntity(int metadata) {
    	return true;
    }
    
    @Override
    public TileEntity createTileEntity(World world, int metadata) {
    	return new TileEntitySit();
    }
    
    @Override
    public void setBlockBoundsForItemRender() {
    	this.setBlockBounds(0.05F, 0.0F, 0.05F, 0.95F, 0.88F, 0.95F);
    }
    
    @Override
    public void registerBlockIcons(IIconRegister register) {
    	this.blockIcon = register.registerIcon("glass");
    }
    
    @Override
    public boolean canPlaceBlockAt(World world, int x, int y, int z) {
    	return super.canPlaceBlockAt(world, x, y, z) && World.doesBlockHaveSolidTopSurface(world, x, y - 1, z);
    }
    
    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) {
    	int direction = MathHelper.floor_double((double) (entity.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
    	world.setBlockMetadataWithNotify(x, y, z, direction == 3 ? 0 : direction + 1, 2);
    }
    
    @Override
    public double getOffsetY(World world, int x, int y, int z) {
    	return 0.3D;
    }
    }
    

     

    package fr.scarex.hilium.entity;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    import fr.scarex.hilium.Hilium;
    import fr.scarex.hilium.block.BlockSit;
    
    /**
    * @author SCAREX
    * 
    */
    public class EntitySit extends Entity
    {
    protected double offsetY;
    
    public EntitySit(World world) {
    	super(world);
    	this.noClip = true;
    	this.preventEntitySpawning = true;
    	this.setSize(0.0F, 0.0F);
    	this.offsetY = 0.0F;
    }
    
    public EntitySit(World world, double x, double y, double z, double offsetY) {
    	this(world);
    	this.setPosition(x, y, z);
    	this.offsetY = offsetY;
    }
    
    @Override
    protected void entityInit() {}
    
    @Override
    protected void readEntityFromNBT(NBTTagCompound comp) {}
    
    @Override
    protected void writeEntityToNBT(NBTTagCompound comp) {}
    
    @Override
    public void onEntityUpdate() {
    	if (this.riddenByEntity == null || this.riddenByEntity.isDead) this.setDead();
    	super.onEntityUpdate();
    }
    
    @Override
    public boolean interactFirst(EntityPlayer p) {
    	if (this.riddenByEntity != null) return true;
    	if (!this.worldObj.isRemote) p.mountEntity(this);
    	return true;
    }
    
    @Override
    public double getMountedYOffset() {
    	return this.offsetY;
    }
    }
    

  8. [1.7.10] Entity mountable not working (problem with synchronization)

    in Modder Support

    Posted June 23, 2015


    I found out that the method onBlockAdded is fired only on the server, And when I spawn the entity, the client doesn't know that the entity is actually there : I will put the spawn of the mob in another method to see if there is a difference.

  9. Main menu event and getting uuid

    in Modder Support

    Posted June 22, 2015


    The name of the event is InitGuiEvent, but you can also use the postInitializationEvent

  10. Main menu event and getting uuid

    in Modder Support

    Posted June 22, 2015


    Minecraft.getMinecraft().thePlayer.getGameProfile()

  11. Replace vanilla block texture/make invisible

    in Modder Support

    Posted June 22, 2015


    You can replace the block with GameRegistry.addSubstitute (or something like that).

  12. make colored glass drop itself

    in Modder Support

    Posted June 22, 2015


    The break event gives you all the parameters you need to get the block metadata, new ItemStack(evt.block, 1, evt.blockMetadata)

  13. Attack animation not working [1.7.10]

    in Modder Support

    Posted June 22, 2015


    File corruption with techne example :

    LegR = new ModelRenderer(this, 46, 0);
          LegR.addBox(0F, 0F, 0F, 4, 16, 4); // The variables names should begin with a lower case letter
          LegR.setRotationPoint(1F, 8F, -2F);
          LegR.setTextureSize(64, 64);
          LegR.mirror = true; // Miror texture should be after the initialization
          setRotation(LegR, 0F, 0F, 0F);

     

    The reason that your animation doesn't work is because your event is fired once, but the method setLivingAnimation is fired every render tick.

    • Like 1
  14. [SOLVED][1.8] Crash when placing underwater plant

    in Modder Support

    Posted June 22, 2015


    You are using a liquid material :

    super(Material.water);

     

    try with a correct Material.

  15. ItemSmeltedEvent stack size 0 when shift-clicking

    in Modder Support

    Posted June 22, 2015


    I tested what you said, and I confirm : this is a bug. Another thing I found is that when you shift click, the event is fired 4 times but a simple click fires it 2 times (client and server I suppose).

  16. Main menu event and getting uuid

    in Modder Support

    Posted June 22, 2015


    There events fired after game initialization, but why do you need their UUID ? And why do you want to see if the players is logged in ?

  17. [SOLVED][1.8] Crash when placing underwater plant

    in Modder Support

    Posted June 22, 2015


    Can you give us the crash report ?

  18. ItemSmeltedEvent stack size 0 when shift-clicking

    in Modder Support

    Posted June 22, 2015


    I don't understand what you mean, the ItemSmeltedEvent is fired when the Item has been smelt, where do you see a shift-click ?

  19. Placing blocks

    in Modder Support

    Posted June 22, 2015


    Blocks.theBlockYouWant.getDefaultState()

  20. Attack animation not working [1.7.10]

    in Modder Support

    Posted June 22, 2015


    You are using a corrupted model from techne, that's not your fault but techne creates corrupted files, you can correct your file here : http://scarex.fr/model_corrector.php.

     

    For the animation, I found this :

    /**
         * Used for easily adding entity-dependent animations. The second and third float params here are the same second
         * and third as in the setRotationAngles method.
         */
        public void setLivingAnimations(EntityLivingBase p_78086_1_, float p_78086_2_, float p_78086_3_, float p_78086_4_)
        {
            EntityIronGolem entityirongolem = (EntityIronGolem)p_78086_1_;
            int i = entityirongolem.getAttackTimer();
    
            if (i > 0)
            {
                this.ironGolemRightArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float)i - p_78086_4_, 10.0F);
                this.ironGolemLeftArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float)i - p_78086_4_, 10.0F);
            }
            else
            {
                int j = entityirongolem.getHoldRoseTick();
    
                if (j > 0)
                {
                    this.ironGolemRightArm.rotateAngleX = -0.8F + 0.025F * this.func_78172_a((float)j, 70.0F);
                    this.ironGolemLeftArm.rotateAngleX = 0.0F;
                }
                else
                {
                    this.ironGolemRightArm.rotateAngleX = (-0.2F + 1.5F * this.func_78172_a(p_78086_2_, 13.0F)) * p_78086_3_;
                    this.ironGolemLeftArm.rotateAngleX = (-0.2F - 1.5F * this.func_78172_a(p_78086_2_, 13.0F)) * p_78086_3_;
                }
            }
        }

     

    Class : net.minecraft.client.model.ModelIronGolem

  21. [1.7.10] Entity mountable not working (problem with synchronization)

    in Modder Support

    Posted June 22, 2015


    Recently, I had to create a new block for sitting but I had problem with synchronization : the player was correctly placed for the server but not for the client (I'm playing in single player).

    I posted this problem on the MinecraftForgeFrance forum but no one could find an answer to my problem (http://www.minecraftforgefrance.fr/showthread.php?tid=2225).

     

    My classes :

    package fr.scarex.hilium.block;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.world.World;
    import fr.scarex.hilium.entity.EntitySit;
    import fr.scarex.hilium.tileentity.TileEntitySit;
    
    /**
    * @author SCAREX
    * 
    */
    public class BlockSit extends Block
    {
    protected BlockSit(Material material) {
    	super(material);
    }
    
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
    	if (this.canSit(world, x, y, z, player, side, hitX, hitY, hitZ)) {
    		Entity entity = world.getEntityByID(((TileEntitySit) world.getTileEntity(x, y, z)).getEntityId());
    		if (entity != null) ((EntitySit) entity).interactFirst(player);
    		return true;
    	}
    	return false;
    }
    
    public boolean canSit(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
    	return true;
    }
    
    @Override
    public void onBlockAdded(World world, int x, int y, int z) {
    	EntitySit e = new EntitySit(world, x + 0.5D, y + 0.5D, z + 0.5D, this.getOffsetY(world, x, y, z));
    	world.spawnEntityInWorld(e);
    	((TileEntitySit) world.getTileEntity(x, y, z)).setEntityId(e.getEntityId());
    }
    
    public float getOffsetY(World world, int x, int y, int z) {
    	return 0.5F;
    }
    }
    

     

    package fr.scarex.hilium.tileentity;
    
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.network.NetworkManager;
    import net.minecraft.network.Packet;
    import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
    import net.minecraft.tileentity.TileEntity;
    
    /**
    * @author SCAREX
    * 
    */
    public class TileEntitySit extends TileEntity
    {
    protected int entityId;
    
    public int getEntityId() {
    	return this.entityId;
    }
    
    public void setEntityId(int id) {
    	this.entityId = id;
    }
    
    @Override
    public void readFromNBT(NBTTagCompound comp) {
    	super.readFromNBT(comp);
    	this.entityId = comp.getInteger("entityId");
    }
    
    @Override
    public void writeToNBT(NBTTagCompound comp) {
    	super.writeToNBT(comp);
    	comp.setInteger("entityId", this.entityId);
    }
    
    @Override
    public Packet getDescriptionPacket() {
    	NBTTagCompound comp = new NBTTagCompound();
    	this.writeToNBT(comp);
    	return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, comp);
    }
    
    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
    	this.readFromNBT(pkt.func_148857_g());
    }
    }
    

     

    package fr.scarex.hilium.entity;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    import fr.scarex.hilium.Hilium;
    import fr.scarex.hilium.block.BlockSit;
    
    /**
    * @author SCAREX
    * 
    */
    public class EntitySit extends Entity
    {
    protected float offsetY;
    
    public EntitySit(World world) {
    	super(world);
    	this.noClip = true;
    	this.preventEntitySpawning = true;
    	this.setSize(0.0F, 0.0F);
    	this.offsetY = 0.0F;
    }
    
    public EntitySit(World world, double x, double y, double z, float offsetY) {
    	this(world);
    	this.setPosition(x, y, z);
    	this.offsetY = offsetY;
    }
    
    @Override
    protected void entityInit() {}
    
    @Override
    protected void readEntityFromNBT(NBTTagCompound comp) {}
    
    @Override
    protected void writeEntityToNBT(NBTTagCompound comp) {}
    
    @Override
    public void onUpdate() {
    	super.onUpdate();
    	if (!(this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) instanceof BlockSit)) this.kill();
    }
    
    @Override
    public boolean interactFirst(EntityPlayer p) {
    	if (this.riddenByEntity != null) return true;
    	if (!this.worldObj.isRemote) p.mountEntity(this);
    	return true;
    }
    
    @Override
    public double getMountedYOffset() {
    	return this.offsetY;
    }
    }
    

     

    When I click the block the first time, it works, but after the game show the message "Press shift to dismount" but I can move around, and when I throw an Item on the floor, it is threw beside the block, which indicates that this is a problem with synchronization.

  22. (Solved) [1.8] Gson error

    in Modder Support

    Posted April 29, 2015


    Problem solved, it was just eclipse doing strange things :

     

    The debug mode was telling me that the problem was from Gson but the problem was from a pattern in my class (I found it when I launch the game in run mode instead of debug mode)

  23. (Solved) [1.8] Gson error

    in Modder Support

    Posted April 29, 2015


    The gson is in my buildpath : http://puu.sh/hv727/bb86fe2872.png

  24. (Solved) [1.8] Gson error

    in Modder Support

    Posted April 29, 2015


    Recently I've been using Gson but in the last days I had problems with Gson, so I have deleted my last modifications but nothing could correct this problem. (I'm using MinecraftForge 1.8-11.14.1.1397)

     

    Stacktrace :

     

    Thread [updater Thread] (Suspended (exception NoClassDefFoundError))

    Gson.fromJson(JsonReader, Type) line: 820

    Gson.fromJson(Reader, Type) line: 768

    Gson.fromJson(String, Type) line: 717

    Gson.fromJson(String, Class<T>) line: 689

    Updater$1.run() line: 114

     

    My code :

    package fr.scarex.updater;
    
    import java.io.InputStream;
    import java.lang.reflect.Method;
    import java.lang.reflect.Type;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.Proxy;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map.Entry;
    import java.util.TreeMap;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import net.minecraft.client.Minecraft;
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.fml.common.Loader;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.ModContainer;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    
    import org.apache.commons.io.Charsets;
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonDeserializationContext;
    import com.google.gson.JsonDeserializer;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParseException;
    
    import fr.scarex.updater.exception.VersionFormatException;
    import fr.scarex.updater.handler.UpdaterHandler;
    
    /**
    * @author SCAREX
    */
    @Mod(modid = Updater.MODID, name = Updater.NAME, version = Updater.VERSION, clientSideOnly = true)
    public class Updater
    {
    public static final String MODID = "supdater";
    public static final String NAME = "Updater";
    public static final String VERSION = "0.1.0-SNAPSHOT";
    
    public static final Logger logger = LogManager.getLogger("Updater");
    
    public static Gson gson;
    
    public static Version mcversion;
    
    @Mod.EventHandler
    public void init(FMLInitializationEvent event) {
    	GsonBuilder builder = new GsonBuilder();
    	builder.registerTypeAdapter(Version.class, new VersionDeserializer());
    	builder.registerTypeAdapter(ModVersions.class, new ModVersionsDeserializer());
    	gson = builder.create();
    	MinecraftForge.EVENT_BUS.register(new UpdaterHandler());
    	doUpdate();
    }
    
    public static ArrayList<ModVersions> modsList = new ArrayList<Updater.ModVersions>();
    
    public String getVersionFileURL() {
    	return "http://scarex.on.vg/Updater/versions.json";
    }
    
    public String getUpdaterVersion() {
    	return Updater.VERSION;
    }
    
    public static void doUpdate() {
    	Thread t = new Thread("Updater Thread") {
    		@Override
    		public void run() {
    			try {
    				mcversion = Version.parseMcVersion();
    			} catch (VersionFormatException e1) {
    				e1.printStackTrace();
    			}
    
    			modsList.clear();
    			for (ModContainer mod : Loader.instance().getModList()) {
    				if (mod.getMod() != null) {
    					Class<?> clazz = mod.getMod().getClass();
    					if (!clazz.getCanonicalName().startsWith("net.minecraft")) {
    						try {
    							String rawVersion;
    							Version currentVersion;
    							try {
    								Method versionMethod = clazz.getDeclaredMethod("getUpdaterVersion");
    								rawVersion = (String) versionMethod.invoke(mod.getMod());
    								currentVersion = Version.parseVersion(rawVersion);
    							} catch (Exception e) {
    								rawVersion = mod.getVersion();
    								currentVersion = Version.parseVersion(rawVersion);
    							}
    							String stringUrl = (String) clazz.getDeclaredMethod("getVersionFileURL").invoke(mod.getMod());
    							URL versionFile = new URL(stringUrl);
    
    							InputStream is = null;
    							try {
    								HttpURLConnection con = (HttpURLConnection) versionFile.openConnection(Proxy.NO_PROXY);
    								con.setConnectTimeout(15000);
    								con.setReadTimeout(15000);
    
    								is = con.getInputStream();
    								ModVersions modV = gson.fromJson(IOUtils.toString(is, Charsets.UTF_, ModVersions.class);
    								modV.setModContainer(mod);
    								modV.setVersionFileLink(stringUrl);
    								modV.setCurrentVersion(currentVersion);
    								modsList.add(modV);
    							} catch (Exception e) {
    								logger.warn("Couldn't get version file with given url : " + versionFile, e);
    							}
    							IOUtils.closeQuietly(is);
    						} catch (Exception e) {
    							logger.warn("Couldn't retrieve mod's informations from mod " + mod.getName() + "(" + clazz.getCanonicalName() + ")", e);
    						}
    					}
    				}
    			}
    		}
    	};
    	t.start();
    }
    
    public static class ModVersions
    {
    	public static final Comparator<String> comparator = new Comparator<String>() {
    		@Override
    		public int compare(String s, String s1) {
    			try {
    				return Version.parseVersion(s).isNewerOrEqualWithSameIndex(mcversion, 1) ? (Version.parseVersion(s1).isNewerOrEqualWithSameIndex(mcversion, 1) ? s.compareTo(s1) : 1) : -1;
    			} catch (VersionFormatException e) {
    				e.printStackTrace();
    			}
    			return 0;
    		}
    	};
    	public static final Pattern PARAMETERS_FINDER = Pattern.compile("{{(.+)}}");
    	private ModContainer modContainer;
    	private String versionFileLink;
    	private String downloadLink;
    	private TreeMap<String, Version[]> versions;
    	private Version currentVersion;
    
    	public ModVersions(ModContainer modC, String modid, String versionFile, String dlink, TreeMap<String, Version[]> versions, Version currentV) {
    		this.modContainer = modC;
    		this.versionFileLink = versionFile;
    		this.downloadLink = dlink;
    		this.versions = versions;
    		this.currentVersion = currentV;
    	}
    
    	public ModVersions(String dlink, TreeMap<String, Version[]> versions) {
    		this.downloadLink = dlink;
    		this.versions = versions;
    	}
    
    	public Version getLatestVersionForUser(byte usertype, boolean acceptSnapshots) {
    		Entry<String, Version[]> entry = this.versions.lastEntry();
    		if ((entry.getKey().substring(0, 3)).equalsIgnoreCase(Minecraft.getMinecraft().getVersion().substring(0, 3))) {
    			Version[] versions = entry.getValue();
    			Version version = versions[0];
    			for (int i = 0; i < versions.length; i++) {
    				if (versions[i].isNewerThanOrEqual(version) && versions[i].getUserType() == usertype && (versions[i].isSnapshot() && acceptSnapshots)) version = versions[i];
    			}
    			return version;
    		}
    		return null;
    	}
    
    	public URL getDownloadLinkForVersion(Version v, String mcversion) {
    		String beginning = this.versionFileLink.replaceFirst("/(*)$", "");
    		String middle = this.downloadLink != null ? this.downloadLink : "";
    		String end = v.getDownloadLink() != null ? v.getDownloadLink() : "";
    		logger.info(beginning + " | " + middle + " | " + end);
    		String fullURL = "";
    		if (v.getDownloadLink().startsWith("http://") || v.getDownloadLink().startsWith("https://")) {
    			fullURL = v.getDownloadLink();
    		} else {
    			if (middle.startsWith("http://") || middle.startsWith("https://"))
    				fullURL = middle + end;
    			else
    				fullURL = beginning + middle + end;
    		}
    		StringBuffer sb = new StringBuffer(fullURL);
    		Matcher m = PARAMETERS_FINDER.matcher(fullURL);
    		while (m.find()) {
    			if ("name".equalsIgnoreCase(m.group(1)))
    				m.appendReplacement(sb, v.getName());
    			else if ("version".equalsIgnoreCase(m.group(1)))
    				m.appendReplacement(sb, v.getVersionString());
    			else if ("user-type".equalsIgnoreCase(m.group(1)))
    				m.appendReplacement(sb, "" + v.getUserType());
    			else if ("importance".equalsIgnoreCase(m.group(1)))
    				m.appendReplacement(sb, "" + v.getImportance());
    			else if ("mc-version".equalsIgnoreCase(m.group(1))) m.appendReplacement(sb, mcversion);
    		}
    		m.appendTail(sb);
    		logger.info(sb.toString());
    		URL url = null;
    		try {
    			url = new URL(sb.toString());
    		} catch (MalformedURLException e) {
    			logger.warn(e);
    		}
    		return url;
    	}
    
    	public ModContainer getModContainer() {
    		return this.modContainer;
    	}
    
    	public void setModContainer(ModContainer modC) {
    		this.modContainer = modC;
    	}
    
    	public String getVersionFileLink() {
    		return versionFileLink;
    	}
    
    	public void setVersionFileLink(String versionFileLink) {
    		this.versionFileLink = versionFileLink;
    	}
    
    	public Version getCurrentVersion() {
    		return currentVersion;
    	}
    
    	public void setCurrentVersion(Version currentVersion) {
    		this.currentVersion = currentVersion;
    	}
    
    	public TreeMap<String, Version[]> getVersions() {
    		return versions;
    	}
    
    	public void setVersions(TreeMap<String, Version[]> versions) {
    		this.versions = versions;
    	}
    
    	@Override
    	public String toString() {
    		return "ModVersions [modContainer=" + modContainer + ", versionFileLink=" + versionFileLink + ", downloadLink=" + downloadLink + "]";
    	}
    
    	public String getMapAsString() {
    		Iterator ite = versions.entrySet().iterator();
    		String output = "";
    		while (ite.hasNext()) {
    			Entry<String, Version[]> entry = (Entry<String, Updater.Version[]>) ite.next();
    			output += "[Mc-version=" + entry.getKey() + ", versions=" + Arrays.toString(entry.getValue()) + "]\n";
    		}
    		return output;
    	}
    }
    
    public static class Version implements Comparable<Version>
    {
    	private static final Pattern pattern = Pattern.compile("(?i)(\\d+)((?:\\.\\d+)*)([a-zA-Z])?(-snapshot)?");
    	private static final Pattern patternMC = Pattern.compile("(?i)(\\d+)((?:\\.\\d+)*)([a-z- ]*)");
    	private String name;
    	private String changes;
    	private String downloadLink;
    	private String versionString;
    	private int[] releases;
    	private char releaseChar;
    	private boolean snapshot;
    	private byte userType;
    	private byte importance;
    
    	public Version(String versionS, char releaseChar, boolean snapshot, int ... releases) {
    		this.versionString = versionS;
    		this.releaseChar = releaseChar;
    		this.snapshot = snapshot;
    		this.releases = releases;
    	}
    
    	public boolean isNewerThanOrEqual(Version v) {
    		if (v.getLength() > this.getLength())
    			return false;
    		else if (v.getLength() < this.getLength()) return true;
    		for (int i = 0; i < this.getLength(); i++) {
    			if (v.getIndex(i) > this.getIndex(i))
    				return false;
    			else if (v.getIndex(i) < this.getIndex(i)) return true;
    		}
    		if (v.getReleaseChar() < this.getReleaseChar()) return true;
    		return true;
    	}
    
    	public boolean isNewerOrEqualWithSameIndex(Version v, int index) {
    		for (int i = 0; i <= index; i++) {
    			if (v.getIndex(i) != this.getIndex(i)) return false;
    		}
    		for (int i = index + 1; i < Math.min(this.getLength(), v.getLength()); i++) {
    			if (this.getIndex(i) < v.getIndex(i)) return false;
    		}
    		return true;
    	}
    
    	@Override
    	public int compareTo(Version v) {
    		return this.isNewerThanOrEqual(v) ? -1 : 1;
    	}
    
    	public static Version parseVersion(String version) throws VersionFormatException {
    		Matcher m = pattern.matcher(version);
    		if (m.matches()) {
    			List<Integer> list = new ArrayList<Integer>();
    			list.add(new Integer(m.group(1)));
    			String[] array = m.group(2).split("\\.");
    			for (int i = 1; i < array.length; i++) {
    				list.add(Integer.parseInt(array[i]));
    			}
    			char c = m.group(3) != null && m.group(3).length() == 1 && Character.isAlphabetic(m.group(3).charAt(0)) ? m.group(3).charAt(0) : 'a';
    			boolean snapshot = "-snapshot".equalsIgnoreCase(m.group(4)) ? true : false;
    			return new Version(version, c, snapshot, ArrayUtils.toPrimitive(list.toArray(new Integer[0])));
    		} else {
    			throw new VersionFormatException(version);
    		}
    	}
    
    	public static Version parseMcVersion() throws VersionFormatException {
    		Matcher m = patternMC.matcher(Minecraft.getMinecraft().getVersion());
    		if (m.matches()) {
    			List<Integer> list = new ArrayList<Integer>();
    			list.add(new Integer(m.group(1)));
    			String[] array = m.group(2).split("\\.");
    			for (int i = 1; i < array.length; i++) {
    				list.add(Integer.parseInt(array[i]));
    			}
    			return new Version(Minecraft.getMinecraft().getVersion(), 'a', false, ArrayUtils.toPrimitive(list.toArray(new Integer[0])));
    		} else {
    			throw new VersionFormatException(Minecraft.getMinecraft().getVersion());
    		}
    	}
    
    	public int getIndex(int i) {
    		return this.releases[i];
    	}
    
    	public int getLength() {
    		return this.releases.length;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public char getReleaseChar() {
    		return releaseChar;
    	}
    
    	public void setReleaseChar(char releaseChar) {
    		this.releaseChar = releaseChar;
    	}
    
    	public boolean isSnapshot() {
    		return snapshot;
    	}
    
    	public void setSnapshot(boolean snapshot) {
    		this.snapshot = snapshot;
    	}
    
    	public byte getUserType() {
    		return userType;
    	}
    
    	public void setUserType(byte userType) {
    		this.userType = userType;
    	}
    
    	public String getChanges() {
    		return changes;
    	}
    
    	public void setChanges(String changes) {
    		this.changes = changes;
    	}
    
    	public String getDownloadLink() {
    		return downloadLink;
    	}
    
    	public void setDownloadLink(String downloadLink) {
    		this.downloadLink = downloadLink;
    	}
    
    	public byte getImportance() {
    		return importance;
    	}
    
    	public void setImportance(byte importance) {
    		this.importance = importance;
    	}
    
    	public String getVersionString() {
    		return versionString;
    	}
    
    	public void setVersionString(String versionString) {
    		this.versionString = versionString;
    	}
    
    	@Override
    	public String toString() {
    		return "Version [name=" + name + ", releases=" + Arrays.toString(releases) + ", releaseChar=" + releaseChar + ", snapshot=" + snapshot + ", userType=" + userType + "]";
    	}
    
    	public String toName() {
    		String output = "";
    		for (int i = 0; i < releases.length - 1; i++) {
    			output += releases[i] + ".";
    		}
    		return output + releases[releases.length - 1] + (releaseChar == 'a' ? "" : releaseChar) + (snapshot ? "-snapshot" : "");
    	}
    }
    
    public static class VersionDeserializer implements JsonDeserializer<Version>
    {
    	@Override
    	public Version deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) throws JsonParseException {
    		JsonObject obj = json.getAsJsonObject();
    		Version version = null;
    		try {
    			version = Version.parseVersion(obj.get("version").getAsString());
    		} catch (VersionFormatException e) {
    			throw new JsonParseException("version couldn't be deserialized");
    		}
    		String name = obj.has("name") ? obj.get("name").getAsString() : "";
    		version.setName(name);
    
    		byte usertype = obj.has("user-type") ? obj.get("user-type").getAsByte() : 0;
    		version.setUserType(usertype);
    
    		String changes = obj.has("changes") ? obj.get("changes").getAsString() : "";
    		version.setChanges(changes);
    
    		byte imp = obj.has("importance") ? obj.get("importance").getAsByte() : 0;
    		version.setImportance(imp);
    
    		String dl = obj.has("download-link") ? obj.get("download-link").getAsString() : "";
    		version.setDownloadLink(dl);
    		return version;
    	}
    }
    
    public static class ModVersionsDeserializer implements JsonDeserializer<ModVersions>
    {
    	@Override
    	public ModVersions deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) throws JsonParseException {
    		JsonObject obj = json.getAsJsonObject();
    
    		TreeMap<String, Version[]> map = new TreeMap<String, Version[]>(ModVersions.comparator);
    		String dlink = obj.has("download-link") ? obj.get("download-link").getAsString() : "";
    
    		JsonObject mcvobj = obj.get("mc-versions").getAsJsonObject();
    		Iterator ite = mcvobj.entrySet().iterator();
    		while (ite.hasNext()) {
    			Entry<String, JsonElement> entry = (Entry<String, JsonElement>) ite.next();
    			JsonArray jarray = entry.getValue().getAsJsonArray();
    
    			Version[] versions = new Version[jarray.size()];
    			Iterator ite1 = jarray.iterator();
    			int i = 0;
    			while (ite1.hasNext()) {
    				JsonObject vobj = (JsonObject) ite1.next();
    				versions[i] = ctx.<Version> deserialize(vobj, Version.class);
    				i++;
    			}
    			Arrays.sort(versions);
    			map.put(entry.getKey(), versions);
    		}
    		return new ModVersions(dlink, map);
    	}
    }
    }
    

     

    I searched on Google and MinecraftForgeFrance but no one could help me.

  25. [1.8] Anti-cheats checks disabled

    in Suggestions

    Posted January 4, 2015


    It could be great if there were an option in the server.properties file to disable some anti-cheats checks, example :

     

    (the code is from NetHandlerPlayServer.class)

     

    if(*boolean*) //*boolean* is the boolean from the server.properties file

    if (!this.hasMoved)

                    {

                        return;

                    }

     

                    double d11 = d8 - this.playerEntity.posX;

                    double d12 = d9 - this.playerEntity.posY;

                    double d13 = d10 - this.playerEntity.posZ;

                    //BUGFIX: min -> max, grabs the highest distance

                    double d14 = Math.max(Math.abs(d11), Math.abs(this.playerEntity.motionX));

                    double d15 = Math.max(Math.abs(d12), Math.abs(this.playerEntity.motionY));

                    double d16 = Math.max(Math.abs(d13), Math.abs(this.playerEntity.motionZ));

                    double d17 = d14 * d14 + d15 * d15 + d16 * d16;

     

                    if (d17 > 100.0D && (!this.serverController.isSinglePlayer() || !this.serverController.getServerOwner().equals(this.playerEntity.getName())))

                    {

                        logger.warn(this.playerEntity.getName() + " moved too quickly! " + d11 + "," + d12 + "," + d13 + " (" + d14 + ", " + d15 + ", " + d16 + ")");

                        this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, this.playerEntity.rotationYaw, this.playerEntity.rotationPitch);

                        return;

                    }

    }

     

    Because currently my server has a lot of "[Player] move to quickly..." but this check is useless because it will be a friends-only server.

     

    (sorry if my english is bad)

  • All Activity
  • Home
  • SCAREX
  • Theme

Copyright © 2019 ForgeDevelopment LLC · Ads by Longitude Ads LLC Powered by Invision Community