Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

How do you get the world outside of a function that has the world as one of its arguments?  I don't know why but I've found absolutely nothing on this from google or the forum's search tool.  :(

Minecraft.getMinecraft().theWorld. Duh

 

//EDIT: MniencraftServer.getServer().worldServers for the server

And just for future preference too, you can do the same for the player too if needed.

Minecraft.getMinecraft().thePlayer;

 

This returns an instance of the player (I think, on the server. It returns an EntityClientPlayerMP, I think. I haven't got eclipse here to check as I am on a school pc.)

I ask complicated questions, and apparently like to write really long detailed posts. But I also help others when I can.

  • Author

I needed to get the world instance to call either isDaytime() or getCelestialAngleRadians() on it.  worldServers doesn't have access to either of those, by the way, so how would I detect day/night if I wanted to get the day/night cycle on a server?  Speaking of which, I wont clutter the forum with a new post about this, so if I want to then update an item based on the day/night cycle, do I have to use a player tick handler, or something else?

  • Author

Ties in with the other thread I made, I'm trying to use reflection to alter a ToolMaterial, depending on the day/night cycle.

Use worldserver.getCurrentTime or something like that.

Check out my mod, Realms of Chaos, here.

 

If I helped you, be sure to press the "Thank You" button!

  • Author

I'm not sure I understand how you would use that.  This is the statement so far:

 

if(Minecraft.getMinecraft().theWorld != null)
	{
		if (Minecraft.getMinecraft().theWorld.isDaytime())
		{
			ReflectionHelper.setPrivateValue(Main.class, this, orichalcumTMDay, 0);
			ReflectionHelper.setPrivateValue(Main.class, this, mithrilAMDay, 9);
		}
		else
		{
			ReflectionHelper.setPrivateValue(Main.class, this, orichalcumTMNight, 0);
			ReflectionHelper.setPrivateValue(Main.class, this, mithrilAMNight, 9);
		}
	}

Wouldn't this need to go into an overriden tick handler of some sort to make it re-evaluate isDaytime every x ticks?  Also I'm not finding worldServers.getCurrentTime, worldServers doesn't have any methods.

  • Author

For mithril, the protection array of the armor increases at night, for orichalcum the damage and mining speed of the tools increases during the day.  All items of those types should change, though only in the Overworld.  I suppose what I have atm would make the items change in other dimensions based on the overworld's day/night cycle?

  • Author

Seems like using reflection is easier and cleaner, but ok.  I still don't know how to check for the conditions every few ticks though.

 

Also I'm not sure how I should be using the ArmorProperites override (I assume this is the one you were referring to) from implementing ISpecialArmor to dynamically change them.

  • Author

Ok, I think I see how ArmorPropeties is supposed to work.  :P

 

Where's an example of AbsorbRatio and AbsorbMax though?  I'm not sure what to put here.

 

PS once I've done this, putting a piece in makes the other armor slots go black.  Only the boots add armor points on the HUD as well.

 

Update:  After some testing, it's not switching between the two ArmorProperties, and it's not getting damaged when I take damage.

 

Here's one of the armor classes:

 

public class ItemMithrilBoots extends ItemArmor implements ISpecialArmor
{
public ItemMithrilBoots(ArmorMaterial armorMat, int renderIndex, int slot)
{
	super(armorMat, renderIndex, slot);
	setUnlocalizedName("mithrilBoots");
	setTextureName(Reference.MODID + ":" + getUnlocalizedName().substring(5));
	setCreativeTab(Main.artificeauguryTab);
	setMaxDamage(2456);
	maxStackSize = 1;
}

@Override
public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot)
{
	ArmorProperties mithBoot = new ArmorProperties(2, 1, 250);
	WorldClient worldInst = Minecraft.getMinecraft().theWorld;
	if(worldInst != null)
		if(worldInst.isDaytime())
			mithBoot.AbsorbMax = 250;
		else
			mithBoot.AbsorbMax = 300;
	return mithBoot;
}

@Override
public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot){return 0;}

@Override
public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot)
{
	this.setDamage(stack, stack.getItemDamage() - damage);
}
}

  • Author

Ok, I think I see how ArmorPropeties is supposed to work.  :P

 

Where's an example of AbsorbRatio and AbsorbMax though?  I'm not sure what to put here.

 

PS once I've done this, putting a piece in makes the other armor slots go black.  Only the boots add armor points on the HUD as well.

 

Update:  After some testing, it's not switching between the two ArmorProperties, and it's not getting damaged when I take damage.

 

Here's one of the armor classes:

 

public class ItemMithrilBoots extends ItemArmor implements ISpecialArmor
{
public ItemMithrilBoots(ArmorMaterial armorMat, int renderIndex, int slot)
{
	super(armorMat, renderIndex, slot);
	setUnlocalizedName("mithrilBoots");
	setTextureName(Reference.MODID + ":" + getUnlocalizedName().substring(5));
	setCreativeTab(Main.artificeauguryTab);
	setMaxDamage(2456);
	maxStackSize = 1;
}

@Override
public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot)
{
	ArmorProperties mithBoot = new ArmorProperties(4, 1, 250);
	WorldClient worldInst = Minecraft.getMinecraft().theWorld;
	if(worldInst != null)
		if(worldInst.isDaytime())
		{
			mithBoot.AbsorbMax = 250;
			System.out.println("day");
		}
		else
		{
			mithBoot.AbsorbMax = 500;
			System.out.println("night");
		}
	return mithBoot;
}

@Override
public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot){return 0;}

@Override
public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot)
{
	this.setDamage(stack, stack.getItemDamage() - damage);
}
}

 

Something's not right with the day/night detection, the AbsorbMax isn't switching.

 

Edit: I added console outputs to the conditional, it's saying "day" when its night, so isDaytime is always evaluating true.

for those whom are interested , when serverside you can use

 

MinecraftServer.getServer().worldServers[n].provider.isDaytime()

 

or other methods to get or set other info

 

  • Author

for those whom are interested , when serverside you can use

 

MinecraftServer.getServer().worldServers[n].provider.isDaytime()

 

or other methods to get or set other info

 

Since SSP runs on an internal server, do you need to do this for both SSP and SMP?

 

Edit: yes, yes this is the case, the detection is working fine now.

 

And here's the working method for future reference:

 

@Override
public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot)
{
	ArmorProperties mithChest = new ArmorProperties(4, 1, 250);
	WorldServer overworldInst = MinecraftServer.getServer().worldServers[0];
	if(overworldInst != null)
		if(overworldInst.isDaytime())
			mithChest.AbsorbMax = 250;
		else
			mithChest.AbsorbMax = 500;
	return mithChest;
}

 

Now the problems remaining on the armor are: it isn't taking damage, it doesn't show up in the armor section of the HUD, it causes rendering issues with the armor slots in the player inventory.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.