Jump to content

dark2222

Forge Modder
  • Posts

    111
  • Joined

  • Last visited

Posts posted by dark2222

  1. You can use StatCollector.translateToLocal to translate a key (e.g. "translation.test.none") to the current language.

     

    think I use it wrong or something for I tried to print it to see what it gave me and it just gives me the key I wrote

     

    --EDIT

    also if I try StatCollector.canTranslate("translation.test.none") it returns false on the key

     

    --EDIT

    omg never mind

    I just had assets spelled wrong, it works now Thanks :D

     

  2. As of 1.8 packets are handled asynchronously. That means: Not on the main minecraft thread.

    If you want to interact with the world or players or anything like that from a packet handler you need to pass a Runnable that does the actual work to IThreadListener#addScheduledTask. The IThreadListener implementation is Minecraft.getMinecraft() on the client and the world on the server.

    thanks it works now :)

     

    but would that not mean that the first player also should return NullPointerException?

     

    also where can I find some doc on the IThreadListener? can't hurt to read up on it :)

  3. I've made a test package to learn IMessage and IMessage handler and it works fine if i play singleplayer and multiplayer but when I try to connect with a second player LAN or server the second player will get a NullPointerException when i try to find the player

     

    Here's the package and handler

    public class TestPacket implements IMessage{
    
    private int test;
    
    
    public TestPacket() {}
    
    public TestPacket(int test) {
    	this.test = test;
    }
    
    @Override
    public void toBytes(ByteBuf buf) {
    	buf.writeInt(test);
    }
    
    @Override
    public void fromBytes(ByteBuf buf) {
    	test = buf.readInt();
    }
    
    public static class Handler implements IMessageHandler<TestPacket,IMessage>{
    
    	@Override
    	public IMessage onMessage(TestPacket message, MessageContext ctx) {
    		LogHelper.info(message.test);
    		if(ctx.side.isClient()){
    				EntityPlayer player = (EntityPlayer) Minecraft.getMinecraft().theWorld.getEntityByID(message.test);
    				player.addChatComponentMessage(new ChatComponentText("Awesome!"));
    			}
    		return null;
    	}
    }
    }
    

     

    how i make the network channel

    	@Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    	ConfigurationHandler.init(event.getSuggestedConfigurationFile());
    	FMLCommonHandler.instance().bus().register(new ConfigurationHandler());
    	MinecraftForge.EVENT_BUS.register(new RegisterEvent());
    
    	Network = NetworkRegistry.INSTANCE.newSimpleChannel(Reference.NETWORKCHANNEL);
    	Network.registerMessage(TestPacket.Handler.class,TestPacket.class, 0,Side.CLIENT);
    
    }

     

    The package gets send on PlayerLoggedInEvent

    	@SubscribeEvent
    public void onEntityJoinWorld(PlayerEvent.PlayerLoggedInEvent event) {
    	BloodCore.get(event.player).SyncWithServer();
    }

     

    What it calls in my IEEP

    	public void SyncWithServer(){
    	VampireMain.Network.sendTo(new TestPacket(player.getEntityId()),(EntityPlayerMP) player);
    }

     

    Here's the Log from the second client

    https://gist.github.com/anonymous/674535f7e4ca01055389

     

  4. Why is your EventHandler registered in your CommonProxy? It might be that you only register it on the Dedicated Server, why?

    oh.. i thought that the commonProxy got run server and client side, just trying to keep the code clean. Never mind i moved everything from the preinit method back but the client still have the problem of return NullPointerException :(

     

    client log after login to server https://gist.github.com/anonymous/6a67c1f2464f5eeb9e33

    method called by package

    	@Override
    public void syncWithServerHandler(int currentBlood,int level,int type)
    {
    	EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    	BloodCore bloodCore = BloodCore.get(player);
    
    	bloodCore.setCurrentBlood(currentBlood);
    	bloodCore.setVampireLevel(level);
    	bloodCore.setVampireType(type);
    }

    current preInit

    	@Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    	network = NetworkRegistry.INSTANCE.newSimpleChannel(Referance.MODID);
    	network.registerMessage(syncWithServer.Handler.class, syncWithServer.class, 0, Side.CLIENT);
    	VampireRegister.registerVampire(new BloodVampire());
    	ConfigurationHandler.init(ConfigFile);
    	FMLCommonHandler.instance().bus().register(new ConfigurationHandler());
    }

    the event that starts it all

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

    the syncWithServer method

    	public void syncWithServer()
    {
    	if(!player.worldObj.isRemote)
    	vampiric.network.sendTo(new syncWithServer(this.CurrentBlood,this.VampireLevel,this.VampireType,this.player.getDisplayName().getUnformattedText()),(EntityPlayerMP) player);
    }

    can it be a 1.8 forge bug?

  5. How do you register your IEEP?

    i register the IEEP in EntityConstruction event

    	@SubscribeEvent
    public void handleConstruction(EntityEvent.EntityConstructing event)
    {
    	if (event.entity instanceof EntityPlayer && BloodCore.get((EntityPlayer) event.entity) == null) {
    		BloodCore.register((EntityPlayer) event.entity);
    	}
    
    }

     

    and it calls this method

    	public static void register(EntityPlayer player) {
    	player.registerExtendedProperties(BloodCore.PROP_NAME, new BloodCore(player));
    }

     

    and my eventHandler are registered by my commonProxy

    	public void preInit(){
    	ConfigurationHandler.init(ConfigFile);
    	FMLCommonHandler.instance().bus().register(new ConfigurationHandler());
    }

    	@Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    	network = NetworkRegistry.INSTANCE.newSimpleChannel(Referance.MODID);
    	network.registerMessage(syncWithServer.Handler.class, syncWithServer.class,0, Side.CLIENT);
    	proxy.preInit();
    	proxy.registerVampires();
    }

  6. It's still an EntityPlayer...

    ok... but why does it return null (nullExeption) when i then try to use it with my IExtendedEntity... then?

     

    this is what the onMessage calls

    	@Override
    public void syncWithServerHandler(int currentBlood,int level,int type)
    {
    	EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    	BloodCore bloodCore = BloodCore.get(player); <----- NullPointerException here when trying to connect to server
    
    	bloodCore.setCurrentBlood(currentBlood);
    	bloodCore.setVampireLevel(level);
    	bloodCore.setVampireType(type);
    }

     

    the Bloodcore.get method looks like this

    public static BloodCore get(EntityPlayer player) {return (BloodCore) player.getExtendedProperties(PROP_NAME);}

  7. I did not say register it there, you need to register your packet just like always.

    What I meant was that onMessage just calls a method in your proxy. This method does nothing in your Common(=Server)Proxy (you could even make it through an exception there, it will never be called) and actually handles the message in the ClientProxy.

    ah, ok

    didn't think i should register it there but there are sometimes java just confuses me

    --EDIT

    Minecraft.getMinecraft.thePlayer still returns null

     

    --EDIT

    ok if i make it print to console it does not return null then it return EntityPlayerSP witch is a bit problematic for my get method in a IExtendedEntity... only accepts EntityPlayer and if i try to convert it to a EntityPlayer

    EntityPlayer player = (EntityPlayer) Minecraft.getMinecraft.thePlayer;

    idea says (EntityPlayer) are not in use/necessary.

  8. Your onMessage is called on the Client, so the only "valid" player is Minecraft.getMinecraft().thePlayer. If you want to sync your properties for other players as well, you'll need to send the entityID and use Minecraft.getMinecraft().theWorld.getEntityByID.

    I've try'ed using Minecraft.getMinecraft().thePlayer and makes the server crash https://gist.github.com/anonymous/e531a46eeb7ba5b27804

  9. i'm trying to sync some numbers from server to client but i need to now the player before i can set the numbers

     

    	public static class Handler implements IMessageHandler<syncWithServer,IMessage> {
    	@Override
    	public IMessage onMessage(syncWithServer message, MessageContext ctx) {
    			EntityPlayer player = ctx.getServerHandler().playerEntity.worldObj.getPlayerEntityByName(message.player);
    			BloodCore bloodCore = BloodCore.get(player);
    
    			bloodCore.setCurrentBlood(message.currentBlood);
    			bloodCore.setVampireLevel(message.level);
    			bloodCore.setVampireType(message.type);
    		return null;
    	}
    }

    with this as the code i get this error message https://gist.github.com/anonymous/e497758f2a16710a720d

    when this happens the client does not crash it just say a fatal error has occured, this connection is terminated.

    I've also try'ed to get the player client side (the handler is client sided) but when i do that the server crashes on startup

     

    this is how i register the packets and made the network channel (yes it is in preinit)

    		network = NetworkRegistry.INSTANCE.newSimpleChannel(Referance.MODID);
    	network.registerMessage(syncWithServer.Handler.class, syncWithServer.class,0, Side.CLIENT);

     

    my packet class itself

    public class syncWithServer implements IMessage{
    int currentBlood,level,type;
    String player;
    
    public syncWithServer() {}
    
    public syncWithServer(int currentBlood,int level,int type, String player) {
    	this.currentBlood = currentBlood;
    	this.level = level;
    	this.type = type;
    	this.player = player;
    }
    
    @Override
    public void toBytes(ByteBuf buf) {
    	buf.writeInt(currentBlood);
    	buf.writeInt(level);
    	buf.writeInt(type);
    	ByteBufUtils.writeUTF8String(buf,player);
    }
    
    @Override
    public void fromBytes(ByteBuf buf)
    {
    	this.currentBlood = buf.readInt();
    	this.level = buf.readInt();
    	this.type = buf.readInt();
    }
    
    public static class Handler implements IMessageHandler<syncWithServer,IMessage> {
    	@Override
    	public IMessage onMessage(syncWithServer message, MessageContext ctx) {
    			EntityPlayer player = ctx.getServerHandler().playerEntity.worldObj.getPlayerEntityByName(message.player);
    			BloodCore bloodCore = BloodCore.get(player);
    
    			bloodCore.setCurrentBlood(message.currentBlood);
    			bloodCore.setVampireLevel(message.level);
    			bloodCore.setVampireType(message.type);
    		return null;
    	}
    }
    }
    

  10. i try'ed that and only one of the 3 apis i wan't to use worked

    what i want to use is ae2, buildcraft, thaumcraft 4

    the weird part is that for those apis that don't work (the way the tutorial says how to do) i can't see the classes but the folders are there http://puu.sh/atLSI/397da42ea8.PNG

  11. i'm trying to make a mod where i would like to use stuff from other mods like buildcrafts energy but there are some stuff that are stopping me from using apis

     

    1. i don't now where to put/how to install an api (some come in an jar and other zip) i tryed to add it as an lib (i'm using intellij) but an'y the buildcraft api would work there

    2. i have no clue and can't find any documentation on how to detect if the mod is install once out if the dev workspace

    3. this is almost as number 2, i don't now how to detect items from other mods (if i want to use it in crafting)

  12. i'm trying to make a interface where you need to register it because i can't make methods in a IExtendedEntityProperties  public

     

    Not sure what you mean by this.  I think all Java interfaces are public by definition.  The extended properties loadNBTData() and saveNBTData() classes are public.

     

    The vampire class is your own custom entity class, right?  In that case, even if you had private information in that class you can create public "getter" and "setter" methods for any information that is available in the class.

    yea sorry where tired when wrote that but what i mean where a person would need to register the vampire with a public static void method

     

    yes the vampire class is my own class that extends IExtendedEntityProperties and all my methods i use the the vampire is in there and before any other class can use it i need to define what player it is with

    BloodMain props = BloodMain.get(player);

    when i do that all methods in my vampire class become available for that class

    if you now a way around this feel free to tell me and i got a github so that you can look at the code (it will change al ot when i get the interface implemented)

    https://github.com/henrikse55/Vampiric-Craft

  13. Another thing with API is you need to make sure it works in the deployed situation and not just in the development environment (like Eclipse).

     

    There are pretty much 3 parts to API development:

    1) Decide on what methods you want to expose as an API.  If you expose an interface then you have to make sure you have a way of letting your mod know that it has been used, either by a registry, or by checking all instances in the game for instanceof your interface.  You can also expose actual public methods so that people can directly control the code in your mod.  In other words, the API can be used to extend and/or control your mod.

    2) Set up your Eclipse development environment so the two projects work together.  I always get a bit confused about whether it should be a reference project or a linked source, but in any case the build path has to be set up correctly.

    3) Set up your build (i.e. build.gradle) so that the interface methods aren't obfuscated -- assuming you want people to be able to access the API without having to build with it.

     

    Anyway, it is kinda obvious but I find each of the steps can be a bit confusing and I have to usually work through them.

     

    Not sure if that helps...

    1) i'm trying to make a interface where you need to register it because i can't make methods in a IExtendedEntityProperties  public

    2) i use IDEA

  14. Don't forget the thank you and applauds :P

     

    And your welcome. The whole API concept threw me on a bum steer when I first started too.

    i'm trying to do this outside minecraft right now so i can get a understanding of that but how do you register the class?

    it keep saying [class] cannot be resolved to a variable

  15. That's why the are in the list. I would suggest googling tutorials on lists in Java - very helpful in this situation. Lists have add(Object object) and get(index) methods. So if after all the vampires have been registered, to access all of them you would go:

    for (int i = 0; i < vampiresList.size(); i++)
    {
        IVampire vampire = vampiresList.get(i);
        // do stuff here
    }
    

    nice thanks for help :)

  16. For retrieving the text from that method, you could go:

    IVampire vampire = new SomeClassThatImplementsIVampire();
    String string = vampire.string(); // gets the string from the class.
    

     

    is it possible to get the class from the list the the registry made?

    i will not now all the classes that implements the interface.

  17. API's are actually quite confusing. But only in the misconception people seem to have about them. What I would do, is make an interface that is called say, IVampire. This interface contains all the methods needed for a vampire in your mod. Then, for every vampire that gets added in, make it implement your IVampire interface. After this, create a method for registering a vampire. Then you just keep track of all the registered vampires etc..                                                                                                                                           

    i tried that and i got 2 problems that i run into

    1. i have no clue how the register function should work

    2. i can't seem to find a way to get the information from the implementing class

    ex class a is my interface, b is my other file

    if i make b implement a and i got method string in my interface and make that string return "test"; in file b i can't get what the string is without breaking something

  18. hi everyone

    this may be a newbie question

    i'm working on a vampire mod where you can be different kind of vampires (3 for now) and my friends keep saying other kind of vampires that they would see so i though that if i could make an API.

    but i have no clue on how to do that. I have searched for maybe 4 weeks now and cannot find any tut's or srcs

  19. There is definitely a better way.

    You should use 3 nested for loops (one each for x, y, z).

    It could look something like this:

     

    int diameter; // from config or whatever you want
    int playerX, playerY, playerZ; // fill those in
    for (int x = playerX - diameter; x < (playerX + diameter); ++x) {
        for (int y = playerY - diameter; y < (playerY + diameter); ++y) {
            for (int z = playerZ - diameter; z < (playerZ + diameter); ++z) {
                // do stuff at x, y, z
            }
        }
    }

    thanks that works a hole lot better then the other code xD

  20. hi.

     

    is there a way to efficient check what blocks there around the player?

    i'm trying to make so i update crops around the player right now and i made it work but it breaks about every time i think i'm done and start on something else.

    i check a 5x5 area right now but i wan't to make it *x*x* (* = changeable in config)

    (here the code i use now https://gist.github.com/henrikse55/c7a33c0154ba146eb2cb)

    if theres a more effective way to do so please tell me because i can't find anything about this.

×
×
  • Create New...

Important Information

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