Paradox Posted February 23, 2016 Share Posted February 23, 2016 Hello everyone, as the title says I currently develop a mod that I would the code to execute only if it is connected to a server with my mod on it (Ideally my server). If the player is logged in single player I would just want my mod to behave like it is not even installed. I apologize for my English and I hope you get what I want to do Quote Link to comment Share on other sites More sharing options...
jeffryfisher Posted February 23, 2016 Share Posted February 23, 2016 Because of the subtle distinction between them, there's probably a combination of SideOnly and isRemote that would distinguish between SP and MP. However, mods load before a player even chooses how and where to play. The trick would be for the mod to ignore itself if/when an SP world is created or loaded. Quote The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting. Link to comment Share on other sites More sharing options...
Paradox Posted February 23, 2016 Author Share Posted February 23, 2016 Well, the main Idea is to mine block coordinates out of a database and then spawn them to my servers's world. I need though work only if the player is connected to my server. I want to avoid single player worlds spawning the blocks. If I use world.isRemote and use setBlock here will only work on server? Will it spawn the block to client side? And when a player use it in singleplayer wont get any blocks spawned? Quote Link to comment Share on other sites More sharing options...
Paradox Posted February 23, 2016 Author Share Posted February 23, 2016 Thanks diesieben07 I tested and this is what I was looking for. I dont want to work single player because I couldnt be sure in which singleplayer worlds the blocks are spawned or need to be spawned. The number of blocks that my database will have is not fixed. So I want to spawn the blocks on the world of the singleplayer clients and if there is new blocks I need to add them too. The only way I can think of doing this is too check if there is a block placed in every block's coordinates I have in my database. But if I got 10.000 (thousand) blocks I think this wouldnt be efficient at all, it may cause lag etc. I would really appreciate if anyone got any ideas to offer. Quote Link to comment Share on other sites More sharing options...
Paradox Posted February 24, 2016 Author Share Posted February 24, 2016 Yeah I understand. It is kinda hard to explain. So, I got a database table with 3 fields that are X,Y and Z. This are coordinates of a block and I got plenty of entries, each entrie represent the position the block should have in the world, and by time I add more and more entries so there are more blocks represented by the coordinates. I want to spawn these blocks to the signleplayer worlds, but I couldnt be sure which are the worlds that blocks need to be spawned. My idea was to check every entrie with observe if they are spawned in the world. But with 10000 entries that would be extremely inefficient. By executing my code (that spawns the blocks) only my multiplayer server will solve the problem because there is only one world to worry about. I hope I explained better this time. Quote Link to comment Share on other sites More sharing options...
SM68 Posted February 24, 2016 Share Posted February 24, 2016 I think he meant it would be much faster on a single world (the one on the server) than for all worlds in one's Minecraft, though I do have to wonder why it would apply to all worlds at once, unless he's thinking that having a bunch of crap accessing an online spreadsheet would bog it down. Quote Link to comment Share on other sites More sharing options...
Paradox Posted February 24, 2016 Author Share Posted February 24, 2016 Forget about the Dedicated Server. I 've gotten off topic to discuss how I can make my mod work on singleplayer too. Lets take the case I wanted my mod to work on single player worlds. 2 players download my mod and the start playing and by their first log in I spawn all the blocks available in the db. After that I got a thousand more blocks to my db and I need them spawned to both players world as well. In this point I could not possible know where the last block was builded so I am not able to identify where the new entries of block should start. Sorry for confusing you guys. This is an academic project and I am neither Java veteran or very experienced in Minecraft moding. Quote Link to comment Share on other sites More sharing options...
Draco18s Posted February 24, 2016 Share Posted February 24, 2016 Just to clarify things: You are using a rational database (MySQL, etc) hosted independently of any server to store block information (for some purpose that is irrelevant here)? Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given. Link to comment Share on other sites More sharing options...
Paradox Posted February 24, 2016 Author Share Posted February 24, 2016 Yeah I am using MySQL database. I am running a script that calculates the position of blocks so when they spawned all together they will form "houses" on minecraft. The script will run on some irrelevant conditions and will continuously add more blocks to the database. Quote Link to comment Share on other sites More sharing options...
Draco18s Posted February 24, 2016 Share Posted February 24, 2016 I think he's planning a private mod for a private server. But yeah, this kind of stuff should just be stored in WorldSavedData. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given. Link to comment Share on other sites More sharing options...
jeffryfisher Posted February 25, 2016 Share Posted February 25, 2016 I want to spawn the blocks on the world of the singleplayer clients and if there is new blocks I need to add them too. I think that English translation is an issue. Please bring in a native English speaker/writer. Server is always the canonical authority on block values. A client may only tell its server what its player has attempted to do. Does that help? To summarize: Player acts, client tells server of action, server changes blocks/data (and server automatically tells client of block changes). If you are rigidly methodical, then your code should work both SP and MP. Quote The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting. Link to comment Share on other sites More sharing options...
Paradox Posted February 25, 2016 Author Share Posted February 25, 2016 It is not the same. In a deticated server you have only one world to spawn the blocks and then the server do its job and send this world to the connected clients. But if the players play singlepalyer their worlds will be random. My problem is that I couldnt sync (Spawn all the blocks that need to be spawned) my db with all these different worlds. Is there any way to store an integer for every world a player creates? Quote Link to comment Share on other sites More sharing options...
Elix_x Posted February 25, 2016 Share Posted February 25, 2016 I will repeate questions that have already been asked. Please answer all of them precisely and we will be able to help you: -You want to generate blocks in worlds from remote database, right? -Database can be changed by you at any time? -Blocks, should they be generated in already generated chunks? -How many dimensions do you want to affect (only overworld, all vanilla or you can configure for any dimension from database)? If you do not understand a question please ask us to say it in different way. Quote Check out my mods: BTAM Armor sets Avoid Exploding Creepers Tools compressor Anti Id Conflict Key bindings overhaul Colourfull blocks Invisi Zones Link to comment Share on other sites More sharing options...
Paradox Posted February 25, 2016 Author Share Posted February 25, 2016 I will repeate questions that have already been asked. Please answer all of them precisely and we will be able to help you: -You want to generate blocks in worlds from remote database, right? -Database can be changed by you at any time? -Blocks, should they be generated in already generated chunks? -How many dimensions do you want to affect (only overworld, all vanilla or you can configure for any dimension from database)? If you do not understand a question please ask us to say it in different way. Hello, I will happily answer all the questions the best I can. -You want to generate blocks in worlds from remote database, right? Yes, I got a remote MySQL database that holds coordinates of Blocks. This is the structure of my table: ID | posX | posY | posX posX, posY and posZ is the block should be in the world. -Database can be changed by you at any time? Yes. I got a script running that affects the table I mention above. It is not changing the table, it is just adds more and more coordinates to the database. -Blocks, should they be generated in already generated chunks? Well, I am not sure I understand this question. -How many dimensions do you want to affect (only overworld, all vanilla or you can configure for any dimension from database)? The only dimension I want to affect is the overworld. Quote Link to comment Share on other sites More sharing options...
Paradox Posted February 25, 2016 Author Share Posted February 25, 2016 Well guys, I figured something out. I need to store an integer that will hold the ID value of the last block builded on the world. Then I will query my database and fetch the coordinates past the stored ID and then updated with the latest value. I am searching over the internet and I found I can use WorldSavedData to achieve that but I really dont know how to do it. Can anyone guide me through it. This is my class: public class BlockIDWorldData extends WorldSavedData{ private final static String ident = "LatestBlockIDWorldData"; public int blockID ; public BlockIDWorldData() { super(ident); } @Override public void readFromNBT(NBTTagCompound p_76184_1_) { } @Override public void writeToNBT(NBTTagCompound p_76187_1_) { } } Quote Link to comment Share on other sites More sharing options...
Elix_x Posted February 25, 2016 Share Posted February 25, 2016 I will repeate questions that have already been asked. Please answer all of them precisely and we will be able to help you: -You want to generate blocks in worlds from remote database, right? -Database can be changed by you at any time? -Blocks, should they be generated in already generated chunks? -How many dimensions do you want to affect (only overworld, all vanilla or you can configure for any dimension from database)? If you do not understand a question please ask us to say it in different way. Hello, I will happily answer all the questions the best I can. -You want to generate blocks in worlds from remote database, right? Yes, I got a remote MySQL database that holds coordinates of Blocks. This is the structure of my table: ID | posX | posY | posX posX, posY and posZ is the block should be in the world. -Database can be changed by you at any time? Yes. I got a script running that affects the table I mention above. It is not changing the table, it is just adds more and more coordinates to the database. -Blocks, should they be generated in already generated chunks? Well, I am not sure I understand this question. -How many dimensions do you want to affect (only overworld, all vanilla or you can configure for any dimension from database)? The only dimension I want to affect is the overworld. Thanks for answer. Question 3 is very important, so i will try to explain it to you: When you explore a world, new chunks are generated. When you exit the world, they are stored. When you load world back up, it loads chunks from drive, but it does not generate them. So, question 3 is asking: if one day you change your database, and add coordinates that for "the given player" are in already generated chunk (chunk stored on drive), do you want to place (from code) blocks you just added in this chunk? Quote Check out my mods: BTAM Armor sets Avoid Exploding Creepers Tools compressor Anti Id Conflict Key bindings overhaul Colourfull blocks Invisi Zones Link to comment Share on other sites More sharing options...
Paradox Posted February 25, 2016 Author Share Posted February 25, 2016 Thanks for answer. Question 3 is very important, so i will try to explain it to you: When you explore a world, new chunks are generated. When you exit the world, they are stored. When you load world back up, it loads chunks from drive, but it does not generate them. So, question 3 is asking: if one day you change your database, and add coordinates that for "the given player" are in already generated chunk (chunk stored on drive), do you want to place (from code) blocks you just added in this chunk? I want the blocks to be spawned in the world no matter what. I am using world.setBlock() to spawn the blocks and I got no problem with blocks spawning or dissapearing after a player exits the world. The only problem I got was how I could sync the new coordinates added to my table with the world since I cant know where the last block was builded. I searched over the internet and saw that I can save custom data with the WorldSavedData but I cant impement it. Thanks for taking the time to try helping me Quote Link to comment Share on other sites More sharing options...
Elix_x Posted February 25, 2016 Share Posted February 25, 2016 Thanks for answer. Question 3 is very important, so i will try to explain it to you: When you explore a world, new chunks are generated. When you exit the world, they are stored. When you load world back up, it loads chunks from drive, but it does not generate them. So, question 3 is asking: if one day you change your database, and add coordinates that for "the given player" are in already generated chunk (chunk stored on drive), do you want to place (from code) blocks you just added in this chunk? I want the blocks to be spawned in the world no matter what. I am using world.setBlock() to spawn the blocks and I got no problem with blocks spawning or dissapearing after a player exits the world. The only problem I got was how I could sync the new coordinates added to my table with the world since I cant know where the last block was builded. I searched over the internet and saw that I can save custom data with the WorldSavedData but I cant impement it. Thanks for taking the time to try helping me Ok. That clarifies a lot of things. I suppose that you already have a class that connects to your database and reads blocks. Now, you have 3 things to do: 1) Considering you are in 1.7.10, create BlockPos (holding x, y, z), read and write to nbt methods and with your IDE generate hashCode and equals methods. 2) Create your WorldSavedData class, following tutorial, including get(World) method to get data instance. You can use perMapStorage , I suppose you already have one. In there, add Set<BlockPos> field. This set will hold all blocks that were already generated. To save and load Set to/from nbt, use NBTTagList. 3) Use world generator and chunk load events to generate blocks. Do first 2 steps, and try to do 3rd yourself. If you have any problems, ask them here, we will help. EDIT: Official WorldSavedData tutorial: https://mcforge.readthedocs.org/en/latest/datastorage/worldsaveddata/. Quote Check out my mods: BTAM Armor sets Avoid Exploding Creepers Tools compressor Anti Id Conflict Key bindings overhaul Colourfull blocks Invisi Zones Link to comment Share on other sites More sharing options...
Paradox Posted February 25, 2016 Author Share Posted February 25, 2016 I still do not see how this is an issue of server vs. Singleplayer. A singleplayer game runs one world at a time (with multiple dimensions). A server also runs one world at a time (with multiple dimensions). There is not much difference between playing singleplayer and playing on a dedicated server, it is merely that in singleplayer the server runs on your own computer. Hello, in the dedicated server every player are in only one world. The one that the server hosting. In singleplayer this is not the case, every single player has a different world hosted by his integrated server. Thanks for answer. Question 3 is very important, so i will try to explain it to you: When you explore a world, new chunks are generated. When you exit the world, they are stored. When you load world back up, it loads chunks from drive, but it does not generate them. So, question 3 is asking: if one day you change your database, and add coordinates that for "the given player" are in already generated chunk (chunk stored on drive), do you want to place (from code) blocks you just added in this chunk? I want the blocks to be spawned in the world no matter what. I am using world.setBlock() to spawn the blocks and I got no problem with blocks spawning or dissapearing after a player exits the world. The only problem I got was how I could sync the new coordinates added to my table with the world since I cant know where the last block was builded. I searched over the internet and saw that I can save custom data with the WorldSavedData but I cant impement it. Thanks for taking the time to try helping me Ok. That clarifies a lot of things. I suppose that you already have a class that connects to your database and reads blocks. Now, you have 3 things to do: 1) Considering you are in 1.7.10, create BlockPos (holding x, y, z), read and write to nbt methods and with your IDE generate hashCode and equals methods. 2) Create your WorldSavedData class, following tutorial, including get(World) method to get data instance. You can use perMapStorage , I suppose you already have one. In there, add Set<BlockPos> field. This set will hold all blocks that were already generated. To save and load Set to/from nbt, use NBTTagList. 3) Use world generator and chunk load events to generate blocks. Do first 2 steps, and try to do 3rd yourself. If you have any problems, ask them here, we will help. EDIT: Official WorldSavedData tutorial: https://mcforge.readthedocs.org/en/latest/datastorage/worldsaveddata/. Thanks for your answer, I just finished tryint to figured our how WorldSavedData works and I did I only store an integer which is the ID of the last block builded in the world, then when a player log in to the world I will compare the locally stored ID value with the value of the latest block there is in the database and they are not the same I will spawn the remaing block than need to be spawned. Thank you everyone for help Quote Link to comment Share on other sites More sharing options...
Choonster Posted February 25, 2016 Share Posted February 25, 2016 I only store an integer which is the ID of the last block builded in the world, then when a player log in to the world I will compare the locally stored ID value with the value of the latest block there is in the database and they are not the same I will spawn the remaing block than need to be spawned. Thank you everyone for help Keep in mind that IDs for modded block/items are automatically assigned and will likely be different for every world, they're not a very reliable way to store persistent data. Registry names are a much more reliable identifier for blocks/items. RegistryNamespaced#getNameForObject can be called on Block.blockRegistry or Item.itemRegistry to get the registry name of a Block / Item respectively. Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future. Link to comment Share on other sites More sharing options...
Paradox Posted February 25, 2016 Author Share Posted February 25, 2016 I only store an integer which is the ID of the last block builded in the world, then when a player log in to the world I will compare the locally stored ID value with the value of the latest block there is in the database and they are not the same I will spawn the remaing block than need to be spawned. Thank you everyone for help Keep in mind that IDs for modded block/items are automatically assigned and will likely be different for every world, they're not a very reliable way to store persistent data. Registry names are a much more reliable identifier for blocks/items. RegistryNamespaced#getNameForObject can be called on Block.blockRegistry or Item.itemRegistry to get the registry name of a Block / Item respectively. I dont mean blocks IDs. By ID I mean a row in my database name ID in the dedicated server every player are in only one world. The one that the server hosting. In singleplayer this is not the case, every single player has a different world hosted by his integrated server. Yes, there are many singleplayer worlds active because every player playing has their own integrated server. But it's not like there is only one dedicated server out there? There are many servers active as well... Oh I see your point. I was thinking that my database only would accessed by my server, but if another server administrator wants my mod to his server then I got more worlds accessing my database. You are totally right. Thank you very much for pointing this out. Quote Link to comment Share on other sites More sharing options...
Choonster Posted February 25, 2016 Share Posted February 25, 2016 I dont mean blocks IDs. By ID I mean a row in my database name ID Ah, that makes more sense. Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future. Link to comment Share on other sites More sharing options...
Draco18s Posted February 25, 2016 Share Posted February 25, 2016 in the dedicated server every player are in only one world. The one that the server hosting. In singleplayer this is not the case, every single player has a different world hosted by his integrated server. Yes, there are many singleplayer worlds active because every player playing has their own integrated server. But it's not like there is only one dedicated server out there? There are many servers active as well... Oh I see your point. I was thinking that my database only would accessed by my server, but if another server administrator wants my mod to his server then I got more worlds accessing my database. You are totally right. Thank you very much for pointing this out. Cough I think he's planning a private mod for a private server. But yeah, this kind of stuff should just be stored in WorldSavedData. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given. Link to comment Share on other sites More sharing options...
jeffryfisher Posted February 25, 2016 Share Posted February 25, 2016 Your table probably needs a new column for metadata value. It would not only distinguish between colors of things but also some orientations. Do your structures also need to store tile entity data? Or will you either accept defaults or simply not use block types needing tile entities? Quote The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting. Link to comment Share on other sites More sharing options...
Recommended Posts
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.