Jump to content

t_h0e

Members
  • Posts

    12
  • Joined

  • Last visited

Posts posted by t_h0e

  1. 15 hours ago, Cadiboo said:

    Very useful, thank you :)

    It turns out when I called this function:

    	public static void registerDimensions()
    	{
    		DimensionManager.registerDimension(new ResourceLocation(Main.MOD_ID, "sr_dimension"), SUN_REALM_DIMENSION, null, true);
    	}

    It was called by my main function which runs events fired on the MOD bus, not the FORGE bus.

    I ended up creating a new function per this link in your collection https://gist.github.com/Commoble/ac7d7b57c9cbbfcae310c4ab110c3cc0:

    @EventBusSubscriber(modid="yourmodid", bus=Bus.FORGE)
    public class CommonForgeEventHandler
    {
      public static final ResourceLocation DIMENSION_TYPE_RL = new ResourceLocation("yourmodid", "yourdimension");
      
    	@SubscribeEvent
    	public static void onRegisterDimensionsEvent(RegisterDimensionsEvent event)
    	{
    	...  //registerDimensions called here 
    	}
    }

     

  2. I am trying to register a dimension I created, but it doesn't show up in game when I build my mod (via /forge dimensions).

    I pieced together my code using several other references from similar threads and it seems like I have done everything correctly, so I am not exactly sure why it's not working.

     

    Here is where I register my dimension in my Main class.

    	@SubscribeEvent
    	public static void registerDimensions(final RegisterDimensionsEvent event) {
    		ModDimensions.registerDimensions();
    	}
    	
    	
    	@SubscribeEvent
    	public static void registerModDimensions(final RegistryEvent.Register<ModDimension> event) {
    		event.getRegistry().registerAll
    		(
    			ModDimensions.SUN_REALM_DIMENSION
    		);
    		
    		LOGGER.info("Mod dimensions registered.");
    	}

     

    Here is where my dimension is initialized.

    public class ModDimensions {
    	
    	//Mod Dimensions
    	public static final ModDimensionType SUN_REALM_DIMENSION = new ModDimensionType(new ResourceLocation(Main.MOD_ID, "sr_dimension"));
    	
    	//Dimension Types
    	//public static DimensionType SUN_REALM;
    	
    	public static void registerDimensions()
    	{
    		DimensionManager.registerDimension(new ResourceLocation(Main.MOD_ID, "sr_dimension"), SUN_REALM_DIMENSION, null, true);
    	}
    }

     

    Here is my ModDimension class.

    public class ModDimensionType extends ModDimension {
    	public ModDimensionType(final ResourceLocation registryName) 
    	{
    		this.setRegistryName(registryName);
    	}
    
    	public static DimensionType getDimensionType() 
    	{
    		return DimensionType.byName(new ResourceLocation(Main.MOD_ID, "sr_dimension"));
    	}
    	
    	@Override
    	public BiFunction<World, DimensionType, ? extends Dimension> getFactory() 
    	{
    		return SunRealmDimension::new;
    	}
    }

     

     

    My Dimension class is basically just scrapped reusing existing biomes and chunk generation:

    public class SunRealmDimension extends Dimension {
    	public static final BlockPos SPAWN = new BlockPos(100, 50, 0);;
    	public SunRealmDimension(final World worldIn, final DimensionType dimension) {
    		super(worldIn, dimension, 1.0F);
    	}
    	
    	@Override
    	public ChunkGenerator<?> createChunkGenerator() {
    		EndGenerationSettings sunrealmgensettings = (EndGenerationSettings) ChunkGeneratorType.FLOATING_ISLANDS.createSettings();
    		sunrealmgensettings.setDefaultBlock(Blocks.COBBLESTONE.getDefaultState());
    		sunrealmgensettings.setDefaultFluid(Blocks.WATER.getDefaultState());
    		sunrealmgensettings.setSpawnPos(this.getSpawnCoordinate());
    		return ChunkGeneratorType.FLOATING_ISLANDS.create(this.world, BiomeProviderType.FIXED.create(BiomeProviderType.FIXED.func_226840_a_(this.world.getWorldInfo()).setBiome(Biomes.BADLANDS)), sunrealmgensettings);
    		}
    
    	@Override
    	public float calculateCelestialAngle(final long p_76563_1_, final float p_76563_3_) {
    		return 0.0f;
    	}
    	
    	@Override @Nullable @OnlyIn(Dist.CLIENT)
    	public float[] calcSunriseSunsetColors(final float p_76560_1_, final float p_76560_2_) {
    		return null;
    	}
    
    	@Override @OnlyIn(Dist.CLIENT)
    	public Vec3d getFogColor(final float p_76562_1_, final float p_76562_2_) {
    		float f = MathHelper.cos(p_76562_1_ * 6.2831855f) * 2.0f + 0.5f;
    		f = MathHelper.clamp(f, 0.0f, 1.0f);
    		float f2 = 0.7529412f;
    		float f3 = 0.84705883f;
    		float f4 = 1.0f;
    		f2 *= f * 0.94f + 0.06f;
    		f3 *= f * 0.94f + 0.06f;
    		f4 *= f * 0.91f + 0.09f;
    		return new Vec3d((double) f2, (double) f3, (double) f4);
    	}
    	
    	@OnlyIn(Dist.CLIENT)
    	public Vec3d getSkyColor(final BlockPos pos, final float flo) {
    		final float f = this.world.getCelestialAngle(flo);
    		float f2 = MathHelper.cos(f * 6.2831855f) * 2.0f + 0.5f;
    		f2 = MathHelper.clamp(f2, 0.0f, 1.0f);
    		final int i = ForgeHooksClient.getSkyBlendColour(this.world, pos);
    		float f3 = (i >> 16 & 0xFF) / 255.0f;
    		float f4 = (i >> 8 & 0xFF) / 255.0f;
    		float f5 = (i & 0xFF) / 255.0f;
    		f3 *= f2;
    		f4 *= f2;
    		f5 *= f2;
    		return new Vec3d((double) f3, (double) f4, (double) f5);
    	}
    
    	@Override
    	public boolean hasSkyLight() {
    		return true;
    	}
    	
    	@Override @OnlyIn(Dist.CLIENT)
    	public boolean isSkyColored() {
    		return true;
    	}
    
    	@Override
    	public boolean canRespawnHere() {
    		return false;
    	}
    
    	@Override
    	public boolean isSurfaceWorld() {
    		return false;
    	}
    
    	@Override @OnlyIn(Dist.CLIENT)
    	public float getCloudHeight() {
    		return 8.0f;
    	}
    
    	@Override @Nullable
    	public BlockPos findSpawn(final ChunkPos p_206920_1_, final boolean p_206920_2_) {
    		final Random random = new Random(this.world.getSeed());
    		final BlockPos blockpos = new BlockPos(p_206920_1_.getXStart() + random.nextInt(15), 0,
    				p_206920_1_.getZEnd() + random.nextInt(15));
    		return this.world.getGroundAboveSeaLevel(blockpos).getMaterial().blocksMovement() ? blockpos : null;
    	}
    
    	@Override
    	public BlockPos getSpawnCoordinate() {
    		return SunRealmDimension.SPAWN;
    	}
    
    	@Override @Nullable
    	public BlockPos findSpawn(final int p_206921_1_, final int p_206921_2_, final boolean p_206921_3_) {
    		return this.findSpawn(new ChunkPos(p_206921_1_ >> 4, p_206921_2_ >> 4), p_206921_3_);
    	}
    
    	@Override @OnlyIn(Dist.CLIENT)
    	public boolean doesXZShowFog(final int p_76568_1_, final int p_76568_2_) {
    		return false;
    	}
    
    	@Override
    	public void onWorldSave() {
    		final CompoundNBT compoundnbt = new CompoundNBT();
    		this.world.getWorldInfo().setDimensionData(this.world.getDimension().getType(), compoundnbt);
    	}
    
    }

     

    Any help would be greatly appreciated.

  3. Is there a way to delete and then recreate the MOD_ID-server.toml and MOD_ID-client.toml config files while building? I noticed that they are not refreshed and the old default entry values persist. I could see how this could be useful, but is there a way to delete these files automatically instead of going into run/config and deleting them manually?

  4. When I use this code, I receive no message at all. I read another post that said RayTraceResult does not return entities because it is the same as World::RayTraceBlocks, however I'm not sure if that's why I'm receiving nothing at all.

    	@Override
    	public boolean itemInteractionForEntity(ItemStack stackIn, PlayerEntity playerIn, LivingEntity livingIn, Hand handIn) {
    		RayTraceResult rtr = this.rayTrace(playerIn.world, playerIn, RayTraceContext.FluidMode.NONE);
    		if (rtr.getType() == RayTraceResult.Type.ENTITY) {
    			EntityRayTraceResult ertr = (EntityRayTraceResult) m.objectMouseOver;
    			playerIn.sendMessage(ertr.getEntity().getName());
    			
    			return true;
    		}
    	}

     

  5. Thanks for the help! I got it working by changing the method to itemInteractionForEntity after a bit of tweaking. I believe onItemRightClick is called too many times for how I am applying it.

    	@Override
    	public boolean itemInteractionForEntity(ItemStack stackIn, PlayerEntity playerIn, LivingEntity livingIn, Hand handIn) {
    		if (m.objectMouseOver.getType() == RayTraceResult.Type.ENTITY) {
    			EntityRayTraceResult ertr = (EntityRayTraceResult) m.objectMouseOver;
    			playerIn.sendMessage(ertr.getEntity().getName());
    			return true;
    		}
    		else return false;
    	}

     

  6. I'm currently working on a method for a custom item that will print information in the chat about what is being looked at by the player.

     I am using the onItemRightClick method, but my game crashes when this code is ran:

    	@Override
    	public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
    		
    		RayTraceResult rtr = this.rayTrace(worldIn, playerIn, RayTraceContext.FluidMode.NONE);
    		playerIn.sendMessage(ITextComponent.Serializer.fromJson(rtr.hitInfo.toString()));
    		return onItemRightClick(worldIn, playerIn, handIn);
    	}

    There are multiple parts of this snippet that I am very uncertain about, so it wouldn't surprise me if I am doing more than one thing wrong ?.

    Any advice would be much appreciated.

     

    EDIT: Updated my code as well as added crash log

    crash-2019-08-04_12.45.37-client.txt

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.