Jump to content

[1.7.10] Getting Current World


Izzy Axel

Recommended Posts

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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);
}
}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

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