dark2222
-
Posts
111 -
Joined
-
Last visited
Posts posted by dark2222
-
-
I am just wondering how I could use localization more.
I've made an attempt to use it with a configuration file as it stands, but I can't find any doc on localization.
So far I've only been able to find localization for creative taps, blocks and items
-
Which "first player"?
I don't think there's any docs on this, because not many people even realize it.
The NullPointerException where only happening for the second client connected to the server.
-
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
-
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
-
Don't use EntityJoinWorldEvent to sync your properties, use PlayerLoginEvent.
thanks it works now
-
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?
-
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(); }
-
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);}
-
Minecraft#thePlayer is an EntityClientPlayerMP. That is a subclass of EntityPlayer.
idea says EntityPlayerSP for me http://puu.sh/dyqxM/78a96e7327.png
-
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.
-
Yes, you will need to delegate your onMessage into your @SidedProxy.
I've read a lot of java but I'm still not sure what delegate means or does
I've try'ed to register the packet in mine @SidedPoxy (ClientProxy) but that made Minecraft.getMinecraft.thePlayer return
an nullExpection
-
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
-
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; } } }
-
You might want to try CoolAlias' tutorial on APIs: http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/1571434-tutorial-modding-with-apis
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
-
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)
-
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)
-
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
-
Don't forget the thank you and applauds
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
-
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
-
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.
-
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
-
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
-
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
-
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.
[1.8] how do I use localization for more then blocks, creative taps and items?
in Modder Support
Posted
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