Jump to content

Recommended Posts

Posted

I created a class extending IExtendedEntityProperties:

 

  Reveal hidden contents

 

 

And here's it's handler:

 

  Reveal hidden contents

 

 

And here's the GUI

 

  Reveal hidden contents

 

 

And it's hander:

 

  Reveal hidden contents

 

 

And both are registered in the mod class

 

  Reveal hidden contents

 

 

Here's an item's onItemRightClick code:

 

  Reveal hidden contents

 

 

And when right clicked the gui values don't change

  • Replies 68
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted
  On 6/9/2016 at 1:14 PM, diesieben07 said:

  • Why are you still using IExtendedEntityProperties? Update and use Capabilities, IEEP is gone in newer forge versions.
  • Why do you have basically the same code twice in the entity constructing event? Why do you even check if your properties are already there? If they would be, something would be seriously wrong and you should not just ignore and carry on.
  • Your IEEP identifier should include your ModID.
  • You should choose one of
    RenderGameOverlayEvent.Pre

    or

    RenderGameOverlayEvent.Post

    , don't use both.

  • Why are you drawing in the constructor of
    GUIManaBar

    ? I have seen this style before, what tutorial did you get it from? The maker needs to be properly yelled at...

  • GUIs are entirely client-side, but modifying your IEEP happens on the server. This does not magically sync, you need to send packets to keep your IEEP in sync whenever it changes on the server.

 

  • I am making a mod for 1.7.10. (Just incase you ask, I will be updating it to 1.8 and don't ask why I am using 1.7.10)
  • I don't know why. I was following coolAlias' tutorial on this thing. What should I have in the handler then?
  • Where do I put my mod id then? (As I said I was following coolAlias' tutorial on IEEP)
  • Ok I'll change  that
  • How should I draw it then? I followed this tutorial : https://emxtutorials.wordpress.com/simple-in-game-gui-overlay/
  • Where can I find a good and detailed tutorial on packets in 1.7.10?

Posted
  On 6/9/2016 at 1:44 PM, diesieben07 said:

  Quote
I am making a mod for 1.7.10. (Just incase you ask, I will be updating it to 1.8 and don't ask why I am using 1.7.10)
No, I won't ask. But I will say: stop.

  Quote
I don't know why. I was following coolAlias' tutorial on this thing. What should I have in the handler then?
Never have code in your mod (or any other programming project) that you don't understand. You should simply register your IEEP. Nothing more.

  Quote
Where do I put my mod id then? (As I said I was following coolAlias' tutorial on IEEP)
You put it in the identifier. Like I said.

  Quote

How should I draw it then? I followed this tutorial : https://emxtutorials.wordpress.com/simple-in-game-gui-overlay/

Not in the constructor.

  Quote
Where can I find a good and detailed tutorial on packets in 1.7.10?
I don't know, I don't keep track of 1.7.10 tutorials.

 

Alright, So I created two messages and two handlers for them:

 

Message about current mana:

 

  Reveal hidden contents

 

 

and it's handler

 

  Reveal hidden contents

 

 

Message about max mana:

 

  Reveal hidden contents

 

 

and it's handler:

 

  Reveal hidden contents

 

 

So how do I integrate these into my GUI and IEEP?

Posted
  On 6/9/2016 at 3:33 PM, diesieben07 said:

Why are these two messages? Why are they sent to the server?

They are supposed to be sent to the client to update the GUI with the player's current and max mana

Posted

If hander is supposed to receive on client, why are your using server side?

 

EntityPlayer player = ctx.getClientHandler().playerEntity;

or

Minecraft#thePlayer

 

When registering packet you need to use Side.CLIENT (its the side of handler).

 

Then when you have client-side player, you simlpy get his IEEP and update it.

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 3:46 PM, Ernio said:

If hander is supposed to receive on client, why are your using server side?

 

EntityPlayer player = ctx.getClientHandler().playerEntity;

or

Minecraft#thePlayer

 

When registering packet you need to use Side.CLIENT (its the side of handler).

 

Then when you have client-side player, you simlpy get his IEEP and update it.

 

I though the receiving end was registered here:

network.registerMessage(HandlerCurrentManaMessage.class, CurrentManaMessage.class, 1, Side.CLIENT);

 

But I did change to this:

EntityPlayer player = ctx.getClientHandler().playerEntity;

 

and it's saying that playerEntity cannot be resolved

Posted
  On 6/9/2016 at 3:51 PM, Melonslise said:

I though the receiving end was registered here:

network.registerMessage(HandlerCurrentManaMessage.class, CurrentManaMessage.class, 1, Side.CLIENT);

 

This is correct, I just pointed that out since i didn't see you register it. (missed it or you didn't provide code).

 

Anyway - handler is the receiver so it is logical that if receiver is client you can (should) use client-only stuff, in this case - use client player.

 

EDIT

 

In case you would want to update client's data about entity that is NOT Minecraft#thePlayer, you will need to send Entity#entityId (via packet) and use Minecraft#theWorld#getEntityById(entityId) to retrieve it.

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 3:53 PM, Ernio said:

  Quote

I though the receiving end was registered here:

network.registerMessage(HandlerCurrentManaMessage.class, CurrentManaMessage.class, 1, Side.CLIENT);

 

This is correct, I just pointed that out since i didn't see you register it. (missed it or you didn't provide code).

 

Anyway - handler is the receiver so it is logical that if receiver is client you can (should) use client-only stuff, in this case - use client player.

 

EDIT

 

In case you would want to update client's data about entity that is NOT Minecraft#thePlayer, you will need to send Entity#entityId (via packet) and use Minecraft#theWorld#getEntityById(entityId) to retrieve it.

 

 

But I did change to this:

EntityPlayer player = ctx.getClientHandler().playerEntity;

 

and it's saying that playerEntity cannot be resolved

Posted

Because there is no such thing (that was my wild guess / pseudo code). Use Minecraft#thePlayer.

 

Note - As Minecraft is @SideOnly class, referencing it from handler should crash on server (dedic).

There are few ways to resolve it, one of them is to make a Proxy getter for Minecraft#thePlayer that returns Minecraft#thePlayer on client and null on server.

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 4:07 PM, Ernio said:

Because there is no such thing (that was my wild guess / pseudo code). Use Minecraft#thePlayer.

 

Note - As Minecraft is @SideOnly class, referencing it from handler should crash on server (dedic).

There are few ways to resolve it, one of them is to make a Proxy getter for Minecraft#thePlayer that returns Minecraft#thePlayer on client and null on server.

So how exactly would I make this proxy? As in a new class? How would the getter look like? A small snippet of code would help me understand better.

Posted

CommonProxy#getClientPlayer() - abstract/interface OR return null;

ClientProxy#getClientPlayer() return Minecraft#thePlayer;

ServerProxy#getClientPlayer() return null; (if you alredy return null in Common, ServerProxy is not even needed (Common will be server))

 

Then you have @SidedProxy CommonProxy in your main mod class, ay?

Now when you are on client.jar you will have Minecraft#thePlayer returned, and on server - null (where on server should never even be reached).

 

http://mcforge.readthedocs.io/en/latest/concepts/sides/

 

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 4:24 PM, Ernio said:

CommonProxy#getClientPlayer() - abstract/interface OR return null;

ClientProxy#getClientPlayer() return Minecraft#thePlayer;

ServerProxy#getClientPlayer() return null; (if you alredy return null in Common, ServerProxy is not even needed (Common will be server))

 

Then you have @SidedProxy CommonProxy in your main mod class, ay?

Now when you are on client.jar you will have Minecraft#thePlayer returned, and on server - null (where on server should never even be reached).

 

http://mcforge.readthedocs.io/en/latest/concepts/sides/

 

I started off creating getClientPlayer() in the client proxy, but now it's telling me that it cannot create a static reference to a non-static field /:

Posted

Do you know Java? You got everything you need to make it work, only thing that can stop you is lack of java knowledge which won't really be found here - google said error or just read what static means.

 

Hint:

#getClientPlayer should be a member method (not static).

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 4:35 PM, Ernio said:

Do you know Java? You got everything you need to make it work, only thing that can stop you is lack of java knowledge which won't really be found here - google said error or just read what static means.

 

Hint:

#getClientPlayer should be a member method (not static).

Alright I found the solution, but I did google around a little and found this:

EntityPlayer thePlayer = (ctx.side.isClient() ? Minecraft.getMinecraft().thePlayer : ctx.getServerHandler().playerEntity);

 

wouldn't this be better than calling methods from the proxies?

Posted

No it wouldn't be better (tho, it might work, still - it is bad way).

 

Anything marked by @SideOnly is NOT PRESENT on other side. Minecraft is @SideOnly(Side.CLIENT) which means it is not loaded by VM when you fire mod on dedicated server. Because of that if you try to reference Minecraft class from common code - it will crash (in this case - on dedicated server).

 

Whenever you need sided access - you need proxy.

 

You will need proxies at some point, just make them now. God, look into some open sources.

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 4:52 PM, Ernio said:

No it wouldn't be better (tho, it might work, still - it is bad way).

 

Anything marked by @SideOnly is NOT PRESENT on other side. Minecraft is @SideOnly(Side.CLIENT) which means it is not loaded by VM when you fire mod on dedicated server. Because of that if you try to reference Minecraft class from common code - it will crash (in this case - on dedicated server).

 

Whenever you need sided access - you need proxy.

 

You will need proxies at some point, just make them now. God, look into some open sources.

There's still one thing that I don't understand. What do I return in my common proxy?

public EntityClientPlayerMP getClientPlayer()
{
	return ;
}

Posted

3mLydMU.png

 

abstract CommonProxy
{
    public abstract getClientPlayer();
}

ClientProxy extends CommonProxy
{
    public getClientPlayer()
    {
        return Minecraft#thePlayer;
    }
}

ServerProxy extends CommonProxy
{
    public getClientPlayer()
    {
        return null;
    }
}

 

Main
{
    @SidedProxy(clientSide="packages.ClientProxy", serverSide="packages.ServerProxy")
    public static CommonProxy proxy;
}

 

PacketHandler
{
    onMessage(...)
    {
        Main.proxy#getClientPlayer();
    }
}

 

PLEASE, use google sometimes. :)

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 5:13 PM, Ernio said:

abstract CommonProxy
{
    public abstract getClientPlayer();
}

ClientProxy extends CommonProxy
{
    public abstract getClientPlayer()
    {
        return Minecraft#thePlayer;
    }
}

ServerProxy extends CommonProxy
{
    public abstract getClientPlayer()
    {
        return null;
    }
}

 

Main
{
    @SidedProxy(clientSide="packages.ClientProxy", serverSide="packages.ServerProxy")
    public static CommonProxy proxy;
}

 

PacketHandler
{
    onMessage(...)
    {
        Main.proxy#getClientPlayer();
    }
}

 

PLEASE, use google sometimes. :)

Ahahah. Dat meme.

 

In the common proxy it's telling me to change getClientPlayer to void which I cannot do. I also can't change client proxy's getClientPlayer to abstract (I don't think). And I had registered the proxies in the main mod class a long time ago.

 

EDIT: Where did the meme go? ;(

Posted

be7.jpg

 

DUDE, that was pseudocode!!! #getClientPlayer() will obviously have EntityPlayer return.

 

abstract CommonProxy
{
    public abstract EntityPlayer getClientPlayer();
}

  Quote

1.7.10 is no longer supported by forge, you are on your own.

Posted
  On 6/9/2016 at 5:24 PM, Ernio said:

be7.jpg

 

DUDE, that was pseudocode!!! #getClientPlayer() will obviously have EntityPlayer return.

 

abstract CommonProxy
{
    public abstract EntityPlayer getClientPlayer();
}

Ahh, I see now. Wow, sometimes I am suprised at my stupidness

Posted

Ok, now we got that out of the way. Now how would I go about sending packets to the client? Would I need to create a LivingUpdateEvent in my IEEP handler and send packets from there?

Posted
  On 6/9/2016 at 5:37 PM, diesieben07 said:

You need to send the packet whenever the value changes.

SO would this be the correct way of sending the packet? (this is located in my IEEP)

public final void syncCurrentMana()
{
	RunicInscription.network.sendTo(new CurrentManaMessage(this.currentMana), (EntityPlayerMP) player);
}

 

The method is being called in the IEEP's handler

@SubscribeEvent
public void onUpdatePlayer(LivingUpdateEvent event)
{
	ManaProperties.get((EntityPlayer) event.entity).syncCurrentMana();
}

Posted
  On 6/9/2016 at 6:14 PM, diesieben07 said:

Did you even read what I said?

Does the value change every tick? No. So why send it every tick?

Because I'm supposed to have a mana regen which is handled after every tick

Posted
  On 6/9/2016 at 6:34 PM, diesieben07 said:

And if the mana is full...?

Sorry for my retardedness, but here all my code so far and the GUI is still not being updated:

 

Here's my IEEP:

 

package melonslise.runicinscription.Network;

import melonslise.runicinscription.RunicInscription;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;
import net.minecraftforge.common.util.Constants;

public class ManaProperties implements IExtendedEntityProperties
{
    public final static String EXT_PROP_MANA = RunicInscription.MODID + "_Mana";
    
    private final EntityPlayer player;
    private int currentMana;
    private int maxMana;
    
    
    
    public ManaProperties(EntityPlayer player)
    {
        this.player = player;
        this.currentMana = 30;
        this.maxMana = 30;
    }
    
    public static final void register(EntityPlayer player)
    {
        player.registerExtendedProperties(ManaProperties.EXT_PROP_MANA, new ManaProperties(player));
    }
    
    public static final ManaProperties get(EntityPlayer player)
    {
        return (ManaProperties) player.getExtendedProperties(EXT_PROP_MANA);
    }
    
    @Override
    public void saveNBTData(NBTTagCompound compound)
    {
        NBTTagCompound properties = new NBTTagCompound();
        
        properties.setInteger("CurrentMana", this.currentMana);
        properties.setInteger("MaxMana", this.maxMana);
        
        compound.setTag(EXT_PROP_MANA, properties);    
    }
    
    @Override
    public void loadNBTData(NBTTagCompound compound)
    {
        if(compound.hasKey(EXT_PROP_MANA, Constants.NBT.TAG_COMPOUND))
        {
            NBTTagCompound properties = compound.getCompoundTag(EXT_PROP_MANA);
            
            this.currentMana = properties.getInteger("CurrentMana");
            this.maxMana = properties.getInteger("MaxMana");
        }
    }
    
    @Override
    public void init(Entity entity, World world)
    {
        
    }
    
    public boolean consumeMana(int amount)
    {
        if(this.currentMana >= amount)
        {
            currentMana = currentMana - amount;
            return true;
        }
        
        this.syncMana();
        
        return false;
    }
    
    public void replenishMana()
    {
        this.currentMana = this.maxMana;
        
        this.syncMana();
    }
    
    public int getMaxMana() 
    {
        return this.maxMana;
    }
    
    public int getCurrentMana()
    {
        return this.maxMana;
    }
    
    public final void syncMana()
    {
        RunicInscription.network.sendTo(new MaxManaMessage(this.maxMana), (EntityPlayerMP) player);
        RunicInscription.network.sendTo(new CurrentManaMessage(this.currentMana), (EntityPlayerMP) player);
    }
}

 

 

 

 

 

and it's handler:

 

 

package melonslise.runicinscription.Handler;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import melonslise.runicinscription.Network.ManaProperties;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.Clone;

public class HandlerManaEvents
{
@SubscribeEvent
public void onEntityConstructing(EntityConstructing event)
{
if (event.entity instanceof EntityPlayer)
{
event.entity.registerExtendedProperties(ManaProperties.EXT_PROP_MANA, new ManaProperties((EntityPlayer) event.entity));
}
}

@SubscribeEvent
public void onClonePlayer(Clone event)
{
if(event.wasDeath)
{
NBTTagCompound compound = new NBTTagCompound();
ManaProperties.get(event.original).saveNBTData(compound);
ManaProperties.get(event.entityPlayer).loadNBTData(compound);
}
}

@SubscribeEvent
public void onEntityJoinWorld(EntityJoinWorldEvent event)
{
if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer)
ManaProperties.get((EntityPlayer) event.entity).syncMana();
}
}

 

 

which is registered in the main mod class:

 

 

@EventHandler
public void init(FMLInitializationEvent event)
{
MinecraftForge.EVENT_BUS.register(new HandlerManaEvents());

 

 

and here's the GUI:

 

 

package melonslise.runicinscription.GUI;

import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import melonslise.runicinscription.Network.ManaProperties;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;

public class GUIManaBar extends Gui
{
private Minecraft mc;

public GUIManaBar(Minecraft mc)
{
super();

this.mc = mc;
}

@SubscribeEvent
public void OnRender(RenderGameOverlayEvent event)
{
if (event.isCancelable() || event.type != ElementType.EXPERIENCE)
{
return;
}

ManaProperties props = ManaProperties.get(this.mc.thePlayer);

if (props == null)
{
return;
}

System.out.print("Drawn");

mc.fontRenderer.drawStringWithShadow("§1" + props.getCurrentMana() + "/" + props.getMaxMana(), 2, 2, 1);
}
}

 

 

and here's it's handler:

 

 

package melonslise.runicinscription.Handler;

import cpw.mods.fml.client.GuiNotification;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import melonslise.runicinscription.GUI.GUIManaBar;
import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;

public class HandlerGUI
{
@SubscribeEvent
public void onRenderGUI(RenderGameOverlayEvent.Post event)
{

}
}

 

 

And here's the handler and the GUI in the main class:

 

 

 @EventHandler
public void init(FMLInitializationEvent event)
{
MinecraftForge.EVENT_BUS.register(new HandlerGUI());
}

@EventHandler
public void postInit(FMLPostInitializationEvent event)
{
{
if (FMLCommonHandler.instance().getEffectiveSide().isClient())
MinecraftForge.EVENT_BUS.register(new GUIManaBar(Minecraft.getMinecraft()));
}
}

 

 

And here's a packet for the players' max mana

 

 

 package melonslise.runicinscription.Network;

import cpw.mods.fml.common.network.simpleimpl.IMessage;
import io.netty.buffer.ByteBuf;

public class MaxManaMessage implements IMessage
{
private int maxMana;

public MaxManaMessage()
{

}

public MaxManaMessage(int maxMana)
{
this.maxMana = maxMana;
}

@Override
public void toBytes(ByteBuf buf)
{
buf.writeInt(maxMana);
}

@Override
public void fromBytes(ByteBuf buf)
{
maxMana = buf.readInt();
}

public int getMaxMana()
{
return maxMana;
}
}

 

 

and it's handler:

 

 

package melonslise.runicinscription.Handler;

import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import melonslise.runicinscription.RunicInscription;
import melonslise.runicinscription.Network.CurrentManaMessage;
import melonslise.runicinscription.Proxy.CommonProxy;
import net.minecraft.entity.player.EntityPlayer;

public class HandlerCurrentManaMessage implements IMessageHandler<CurrentManaMessage, IMessage>
{
@Override
public IMessage onMessage(CurrentManaMessage message, MessageContext ctx)
{
EntityPlayer player = RunicInscription.proxy.getClientPlayer();

int currentMana = message.getCurrentMana();

return null;
}

}

 

 

and here's the packet for the players' current mana:

 

package melonslise.runicinscription.Network;

import cpw.mods.fml.common.network.simpleimpl.IMessage;
import io.netty.buffer.ByteBuf;

public class CurrentManaMessage implements IMessage
{
private int currentMana;

public CurrentManaMessage()
{

}

public CurrentManaMessage(int currentMana)
{
this.currentMana = currentMana;
}

@Override
public void toBytes(ByteBuf buf)
{
buf.writeInt(currentMana);
}

@Override
public void fromBytes(ByteBuf buf)
{
currentMana = buf.readInt();
}

public int getCurrentMana()
{
return currentMana;
}
}

 

 

and it's handler:

 

 

 package melonslise.runicinscription.Handler;

import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import melonslise.runicinscription.RunicInscription;
import melonslise.runicinscription.Network.MaxManaMessage;
import net.minecraft.entity.player.EntityPlayer;

public class HandlerMaxManaMessage implements IMessageHandler<MaxManaMessage, IMessage>
{
@Override
public IMessage onMessage(MaxManaMessage message, MessageContext ctx)
{
EntityPlayer player = RunicInscription.proxy.getClientPlayer();

int amount = message.getMaxMana();

return null;
}
}

 

 

And both are registered in the main class:

 

public static SimpleNetworkWrapper network;[/p]

network = NetworkRegistry.INSTANCE.newSimpleChannel("RunicInscription");
        
        network.registerMessage(HandlerCurrentManaMessage.class, CurrentManaMessage.class, 1, Side.CLIENT);
        network.registerMessage(HandlerMaxManaMessage.class, MaxManaMessage.class, 2, Side.CLIENT);

 

 

And there's a method in the client proxy and server proxy which return either the player(for clients) or null(for servers) which is used in the packet handlers:

 

 

ClientProxy

 

public EntityClientPlayerMP getClientPlayer()
{
return Minecraft.getMinecraft().thePlayer;
}

 

ServerProxy

 

    public EntityClientPlayerMP getClientPlayer()
    {
        return null;
    }

 

 

 

And here's a snippet of code from an item which decreases the player's mana:

 

 

 if (props.consumeMana(15))
{
System.out.println("Player had enough mana. Do something awesome!");
}
else
{
System.out.println("Player ran out of mana. Sad face.");
props.replenishMana();
}

 

Posted

Top->bottom:

 

1. Let's make utility method for registering and then not use it...

public static final void register(EntityPlayer player)

Why does it exist if yo uare not using if (in constructing event)?

 

2. This is useless:

public GUIManaBar(Minecraft mc)
{
super();

* super() is empty, no need to call it.

* having constructor is close to useless - seriosuly, you don't have to make additional reference.

 

3. Why does this class even exist? HandlerGUI

 

4. What the fuck? How many init events do you have?

1st you post:

@EventHandler
public void init(FMLInitializationEvent event)
{
MinecraftForge.EVENT_BUS.register(new HandlerManaEvents());

Then:

@EventHandler
public void init(FMLInitializationEvent event)
{
MinecraftForge.EVENT_BUS.register(new HandlerGUI());
}

You should have one...

 

5. PostInit is NOT for constructing your mod... registering events should be in pre or init.

 

6. Whet the fuck is this?

if (FMLCommonHandler.instance().getEffectiveSide().isClient())

 

I just taught you (yesterday) how to use proxies - use them!

 

7. What the hell is this class? "EntityClientPlayerMP" - "EntityPlayer" if any... (proxies).

 

8. How do even expect those packet handlers to work - you literally do nothing in them!

 

@Override
public IMessage onMessage(CurrentManaMessage message, MessageContext ctx)
{
EntityPlayer player = RunicInscription.proxy.getClientPlayer();

int currentMana = message.getCurrentMana();

Properties.get(player).setMana(currentMana); // THIS IS LIKE SO OBVIOUS!!

return null;
}

 

9. There are so many wrong things here... have one event class, not shitload, besides - you don't need to learn java, you need to learn programming.

 

  Quote

1.7.10 is no longer supported by forge, you are on your own.

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




  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Temu Coupon Code 40% Off is a fantastic opportunity to save big on a wide range of products from the popular online marketplace, Temu. With this exclusive code, you can enjoy significant discounts on electronics, clothing, home goods, and much more. The acu729640 Temu coupon code is specifically designed to provide maximum benefits for shoppers in the USA, Canada, and European nations. This code unlocks exclusive deals and offers that are not available elsewhere, making it a valuable asset for savvy shoppers. This article will guide you through everything you need to know about the Temu coupon code 2025 for existing customers, including how to redeem it and the amazing benefits it offers. We'll also explore the Temu 40% discount coupon for new users and how to maximize your savings on your next Temu purchase. What Is The Temu Coupon Code 40% Off? The Temu coupon 40% off is an exclusive offer that allows both new and existing customers to enjoy significant savings on their Temu purchases. By using this code, you can unlock a range of exciting benefits, including: acu729640 for a flat 40% discount for new users. acu729640 for 40% off for existing users. acu729640 for a $100 coupon pack for multiple uses. acu729640 for a $100 flat discount for new customers. acu729640 for an extra $100 off promo code for existing customers. acu729640 for a $100 coupon for new USA/Canada users. Temu Coupon Code 40% Off For New Users. New users can unlock the highest benefits by using our Temu coupon 40% off code on the Temu app. This code provides exclusive perks specifically designed for first-time shoppers, such as: acu729640 for a flat 40% discount for new users. acu729640 for a $100 coupon bundle for new customers. acu729640 for up to $100 coupon bundle for multiple uses. acu729640 for free shipping to 68 countries. acu729640 for an extra 30% off on any purchase for first-time users. How To Redeem The Temu 40% Off Coupon Code For New Customers? Create a Temu account: If you don't have one already, create a new account on the Temu app or website. Browse and select items: Add the items you wish to purchase to your cart. Apply the coupon code: During the checkout process, enter the Temu 40 off coupon code acu729640 in the designated field. Click "Apply": The discount will be automatically applied to your order. Complete your purchase: Proceed with the payment and complete your order. Temu Coupon Code 40% Off For Existing Users Existing users can also enjoy the benefits of our Temu 40 off coupon code. This code offers exclusive perks tailored to loyal customers, including: acu729640 for a 40% extra discount for existing Temu users. acu729640 for a $100 coupon bundle for multiple purchases. acu729640 for a free gift with express shipping all over the USA/Canada. acu729640 for an extra 30% off on top of the existing discount. acu729640 for free shipping to 68 countries. How To Use The Temu Coupon Code 40% Off For Existing Customers? Log in to your Temu account: Access your existing account on the Temu app or website. Browse and select items: Add the items you wish to purchase to your cart. Apply the coupon code: During the checkout process, enter the Temu discount code for existing users acu729640 in the designated field. Click "Apply": The discount will be automatically applied to your order. Complete your purchase: Proceed with the payment and complete your order. How To Find The Temu Coupon Code 40% Off? Finding verified and tested coupons is easy. You can: Sign up for the Temu newsletter: Subscribe to the Temu newsletter to receive exclusive offers and coupon codes directly to your inbox. Visit Temu’s social media pages: Follow Temu on social media platforms like Facebook, Instagram, and Twitter to get updates on the latest Temu coupons 40 off and other promotions. Visit trusted coupon sites: Our website is a reliable source for the latest and working Temu coupon codes 40% off first order. How Temu 40% Off coupons work? Temu 40% Off coupons work by providing a discount on eligible purchases made through the Temu platform. When you apply a valid Temu coupon code 40 percent off during the checkout process, the discount will be automatically deducted from the total amount of your order. This effectively reduces the price you pay for your desired items. How To Earn 40% Off Coupons In Temu As A New Customer? Earning 40% off coupons as a new Temu customer is straightforward: Create a new account: Sign up for a new account on the Temu app or website. Explore the "New User" section: Look for exclusive offers and coupons specifically designed for first-time shoppers. **Use the Temu coupon code 40% off first order acu729640 during checkout to unlock your discount. What Are The Advantages Of Using Temu 40% Off Coupons? Using Temu 40% off coupon code legit offers numerous advantages: 40% discount on the first order 40% discount for existing customers $100 coupon bundle for multiple uses 70% discount on popular items Extra 30% off for existing Temu customers Up to 90% off in selected items Free gift for new users Free delivery to 68 countries Temu Free Gift And Special Discount For New And Existing Users Using our Temu 40% off coupon code unlocks a world of benefits: acu729640 for a 40% discount for first order. acu729640 for 40% off for existing customers. acu729640 for an extra 30% off on any item. acu729640 for a free gift for new Temu users. acu729640 for up to 70% discount on any item on the Temu app. acu729640 for a free gift with free shipping in 68 countries including the USA and UK. Pros And Cons Of Using Temu Coupon Code 40% Off Pros: Significant savings: Enjoy substantial discounts on a wide range of products. Exclusive offers: Access exclusive deals and promotions not available elsewhere. Easy to use: Simple and straightforward application process. Suitable for everyone: Applicable to both new and existing customers. Free shipping options: Enjoy free shipping on eligible orders. Cons: August not be applicable to all products: Some exclusions August apply. Limited-time offers: Some coupons August have limited validity periods. August require minimum purchase amounts: Some coupons August have minimum purchase requirements. Terms And Conditions Of The Temu 40% Off Coupon Code In 2025 No expiration date: Our coupon code doesn't have any expiration date, and you can use it anytime you want. Valid for all users: Our coupon code is valid for both new and existing users in 68 countries worldwide. No minimum purchase requirements: There are no minimum purchase requirements for using our Temu coupon code. Final Note The Temu coupon code 40% off is an excellent opportunity to save money on your next Temu purchase. By utilizing this code, you can significantly reduce your spending and enjoy more for less. We encourage you to take advantage of this incredible offer and experience the joy of shopping with Temu. FAQs Of Temu 40% Off Coupon How can I get a Temu 40% off coupon?   You can find the Temu 40% off coupon on our website or by subscribing to the Temu newsletter. Is the Temu 40% off coupon valid for all products?   While the Temu 40% off coupon offers significant discounts, there August be some exclusions or limitations on certain products. Can I combine the Temu 40% off coupon with other offers?   In some cases, you August be able to combine the Temu 40% off coupon with other available offers. However, this August vary depending on the specific terms and conditions of each offer. How long is the Temu 40% off coupon valid for?   The validity period of the Temu 40% off coupon August vary. Some coupons August have limited-time offers, while others August be valid for an extended period. Can I use the Temu 40% off coupon more than once?   The number of times you can use the Temu 40% off coupon August depend on the specific terms and conditions of the offer. Some coupons August be restricted to single-use only, while others August allow multiple uses.  
    • Temu Coupon Code $100 Off is a fantastic opportunity to save big on your next purchase from Temu. This popular online marketplace offers a wide range of products at incredibly low prices, and with our exclusive coupon code, you can enjoy even more savings. The acu729640 Temu coupon code is designed to provide maximum benefits for shoppers in the USA, Canada, and various European nations. Whether you're looking for electronics, clothing, home goods, or anything in between, this code can help you get the best deals.   We understand that finding the right Temu coupon $100 off and Temu 100 off coupon code can be challenging. That's why we've compiled this comprehensive guide to help you maximize your savings on Temu.   What Is The Coupon Code For Temu $100 Off? Both new and existing customers can enjoy amazing benefits when they use our $100 off Temu coupon on the Temu app and website.   acu729640 for a flat $100 off your purchase.   acu729640 for a $100 coupon pack that can be used for multiple purchases.   acu729640 to receive a $100 flat discount as a new customer.   acu729640 to get an extra $100 promo code for existing customers.   acu729640 to enjoy a $100 coupon for users in the USA and Canada.   Temu Coupon Code $100 Off For New Users In 2025 New users can unlock the highest savings by using our coupon code on the Temu app.   acu729640 for a flat $100 discount for new users.   acu729640 to receive a $100 coupon bundle for new customers.   acu729640 to enjoy up to a $100 coupon bundle for multiple uses.   acu729640 to get free shipping to 68 countries worldwide.   acu729640 to receive an extra 30% off on any purchase for your first time using Temu.   How To Redeem The Temu Coupon $100 Off For New Customers? Create a Temu Account: If you're a new user, start by creating an account on the Temu app or website.   Browse and Shop: Explore the vast selection of products available on Temu and add your desired items to your cart.   Apply the Coupon Code: During the checkout process, enter the Temu $100 coupon code acu729640 in the designated field.   Confirm Your Order: Review your order summary, including the applied discount, and complete the checkout process.   Temu Coupon $100 Off For Existing Customers Existing customers can also benefit significantly from using our coupon code on the Temu app.   acu729640 to receive an extra $100 discount as an existing Temu user.   acu729640 to get a $100 coupon bundle for multiple purchases.   acu729640 to enjoy a free gift with express shipping all over the USA and Canada.   acu729640 to receive an extra 30% off on top of your existing discount.   acu729640 to get free shipping to 68 countries worldwide.   How To Use The Temu Coupon Code $100 Off For Existing Customers? Log In To Your Account: Log in to your existing Temu account.   Shop and Add To Cart: Browse the website, select your desired items, and add them to your cart.   Apply the Coupon Code: During checkout, enter the Temu coupon code $100 off acu729640 in the designated field.   Complete Your Purchase: Review your order summary, including the applied discount, and complete the checkout process.   Latest Temu Coupon $100 Off First Order Customers can unlock the highest savings by using our coupon code during their first order.   acu729640 for a flat $100 discount on your first order.   acu729640 to receive a $100 Temu coupon code for your first order.   acu729640 to enjoy up to a $100 coupon for multiple uses.   acu729640 to get free shipping to 68 countries worldwide.   acu729640 to receive an extra 30% off on any purchase during your first order.   How To Find The Temu Coupon Code $100 Off? We recommend signing up for the Temu newsletter to receive verified and tested coupons directly to your inbox.   You can also visit Temu's social media pages for the latest coupons and promotions.   Finally, remember to check reputable coupon websites like ours for the latest and working Temu coupon $100 off and Temu coupon $100 off Reddit codes.   Is Temu $100 Off Coupon Legit? Yes, our Temu $100 Off Coupon Legit and Temu 100 off coupon legit code acu729640 is absolutely legitimate.   Any customer can safely use our Temu coupon code to get $100 off on their first order and then on recurring orders.   Our code is not only legit but also regularly tested and verified.   Furthermore, our Temu coupon code is valid worldwide and doesn't have any expiration date.   How Does Temu $100 Off Coupon Work? The Temu coupon code $100 off first-time user and Temu coupons 100 off code acu729640 works by directly deducting $100 from your total purchase amount at checkout. This discount can be applied to a wide range of products across various categories on the Temu platform.   How To Earn Temu $100 Coupons As A New Customer? The easiest way to earn Temu coupon code $100 off and 100 off Temu coupon code as a new customer is by using our exclusive code acu729640 during your first purchase.   Additionally, you can explore other options such as:   Refer-a-friend programs: Invite your friends to join Temu and earn rewards, including potential $100 coupons.   Completing surveys and offers: Participate in surveys and complete offers within the Temu app to earn points that can be redeemed for discounts or coupons.   Following Temu on social media: Keep an eye on Temu's social media pages for exclusive deals, contests, and giveaways that August include $100 coupons.   What Are The Advantages Of Using The Temu Coupon $100 Off? $100 discount on your first order.   $100 coupon bundle for multiple uses.   70% discount on popular items.   Extra 30% off for existing Temu customers.   Up to 90% off in selected items.   Free gift for new users.   Free delivery to 68 countries.   Temu $100 Discount Code And Free Gift For New And Existing Customers There are multiple benefits to using our Temu $100 off coupon code and $100 off Temu coupon code acu729640:   acu729640 for a $100 discount for your first order.   acu729640 for an extra 30% off on any item.   acu729640 to receive a free gift for new Temu users.   acu729640 to enjoy up to a 70% discount on any item on the Temu app.   acu729640 to receive a free gift with free shipping in 68 countries, including the USA and UK.   Pros And Cons Of Using The Temu Coupon Code $100 Off This Month Pros:   Significant savings: The Temu coupon $100 off code and Temu 100 off coupon can lead to substantial savings on your Temu purchases.   Wide applicability: The code can be used on a wide range of products, from electronics and clothing to home goods and more.   Easy to use: Applying the code during checkout is simple and straightforward.   Valid for both new and existing users: Both new and existing customers can benefit from this exclusive offer.   No expiration date: Enjoy the flexibility of using the code at your convenience.   Cons:   August not be applicable to all products or categories.   Some exclusions or limitations August apply.   Terms And Conditions Of Using The Temu Coupon $100 Off In 2025 Our coupon code acu729640 doesn't have any expiration date.   Our coupon code is valid for both new and existing users in 68 countries worldwide.   There are no minimum purchase requirements for using our Temu coupon code acu729640. Final Note   The Temu coupon code 100% Off provides a fantastic opportunity to save money on your purchases at Temu.   By utilizing the Temu 100% off coupon and following the simple steps outlined in this article, you can easily redeem your discount and enjoy significant savings on a wide range of products. FAQs Of Temu $100 Off Coupon Q: Is the Temu $100 off coupon code valid for all products? A: While the coupon offers significant savings, it August not be applicable to all products or categories.   Q: Can I combine the Temu $100 off coupon with other offers? A: The possibility of combining this coupon with other offers August vary.   Q: How long is the Temu $100 off coupon valid?    A: Our Temu coupon code acu729640 does not have an expiration date.   Q: Is the Temu $100 off coupon applicable to international orders? A: Yes, our Temu coupon code acu729640 is valid for users in 68 countries worldwide, including the USA, Canada, and various European nations.   Q: Do I need a minimum purchase amount to use the Temu $100 off coupon?    A: No, there are no minimum purchase requirements for using our Temu coupon code acu729640.
    • I am Playing on a server with my friends, but for some reason there are a few random chunks that where if I go into them, all the visuals stop. The game runs in the background but I can only see the last frame I was on before the freeze. If I tab out of the game, it flashes fastly between a snapshot of the forge loading screen and a black screen. Here is my log. Is there any way to fix this?  https://mclo.gs/lXTTXMv
    • The crash directly points to an issue with Immersive Portals - start with removing this mod first
    • Make a test without crittersandcompanions
  • Topics

×
×
  • Create New...

Important Information

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