FLUFFY2 Posted November 11, 2015 Share Posted November 11, 2015 Hello there, So i saw that we can register .obj models again wich is cool (thx fry)! But im a little confused why it not loads, i mean it should right? In the preInit, i got this, after the item is registered: if(event.getSide() == Side.CLIENT){ OBJLoader.instance.addDomain(Csgo.ModID); ModelLoader.setCustomModelResourceLocation(Usp, 0, new ModelResourceLocation(ModID + ":Usp", "inventory")); } The modid is already lower case!!! The model are in: assets/modid/models/item Both .obj and .mtl! I didnt forget about: mtllib models/item/Usp.mtl And here is my .mtl newmtl pist_223.bmp Ns 96.078431 Ka 1.000000 1.000000 1.000000 Kd 0.762566 0.426902 0.414958 Ks 0.500000 0.500000 0.500000 Ke 0.000000 0.000000 0.000000 Ni 1.000000 d 1.000000 illum 2 map_Kd csgo:Usp The texture is in: assets/modid/textures! In case, i triangulated the faces, but thats the only thing i have done to the model. Also, can i implement IPerspectiveModelAware, event if its an obj model? Thanks for helping! Quote Link to comment Share on other sites More sharing options...
HassanS6000 Posted November 11, 2015 Share Posted November 11, 2015 First off, don't just thank fry, thank shadekiller666 as well (he wrote the loader). Where exactly are you registering your custom model resource location? In your Main class or in a proxy? What is the unlocalized name of the item "Usp"? Do you have your blockstate for the item in the correct area? You need to give more info. Quote Link to comment Share on other sites More sharing options...
FLUFFY2 Posted November 11, 2015 Author Share Posted November 11, 2015 Oh, i didnt know that. shadekiller666, THANK YOU as well! Its inside my main class, like its should be. This: if(event.getSide() == Side.CLIENT) actullay is useful there, but it shouldnt really matter, the server wont gonan crash. The Unlocalized and Registered name are both "Usp". Now... Why would i exactly need a blocksate file for an item? Quote Link to comment Share on other sites More sharing options...
Earthcomputer Posted November 12, 2015 Share Posted November 12, 2015 You need proxies for this kind of thing. Any *reference* to a class/field/method with the @SideOnly annotation that is detected on the wrong side will crash the game, even if the code isn't ever executed. Try and run your mod on a "dedicated* server, and you'll see it chashes. Quote catch(Exception e) { } Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em). Link to comment Share on other sites More sharing options...
FLUFFY2 Posted November 12, 2015 Author Share Posted November 12, 2015 Look, im not that stupid, i know what im doing thats not the problem anyways. You can trust me i started a server and it worked fine. You can use Side.CLIENT checking if you know how and where. In the matter of fact Side checking, prevents the Client/Server to even see the code. Not like isRemote. Thats why most are confused, and create a crash. Anyways i fixed the 1st problem, now it detects the model, but i get this error: net.minecraftforge.client.model.obj.OBJModel$UVsOutOfBoundsException: Model 'csgo:models/item/Usp.obj' has UVs ('vt') out of bounds 0-1! The missing model will be used instead. Support for UV processing will be added to the OBJ loader in the future. I see what it means, but i dont know how i could fix the model. Quote Link to comment Share on other sites More sharing options...
FLUFFY2 Posted November 12, 2015 Author Share Posted November 12, 2015 Yeah, i was wrong and i wrote the lines about @SideOnly, oups. What i meant was, as far as i know in the inits, you can use event.getSide() checking for resource registering. Quote Link to comment Share on other sites More sharing options...
FLUFFY2 Posted November 12, 2015 Author Share Posted November 12, 2015 Well i got it working! The UVs are pretty sassy tho.... Quote Link to comment Share on other sites More sharing options...
ShetiPhian Posted November 13, 2015 Share Posted November 13, 2015 So how did you get it to work? I'm currently unable use OBJ's for items. (Blocks were easy, just followed the forge debug examples. now waiting on the custom tag one) I know its something relatively simple I'm overlooking, but for the life of me I'm stumped and I wasn't able to fine an example to go by. The 'fun' I've had trying to get this to work is in the spoiler, so unless you care to read you can skip opening it. my proxy's preint already has: OBJLoader.instance.addDomain("terraqueous"); I've tried the following. (all in my proxy's preint) named my OBJ itemScythe.obj and placed it in /models/item/ (the mtl is also there) I attempted each of these line (one by one) ModelLoader.setCustomModelResourceLocation(itemScythe, 0, new ModelResourceLocation("terraqueous:itemScythe", "inventory")); ModelLoader.setCustomModelResourceLocation(itemScythe, 0, new ModelResourceLocation("terraqueous:item/itemScythe", "inventory")); ModelLoader.setCustomModelResourceLocation(itemScythe, 0, new ModelResourceLocation("terraqueous:models/item/itemScythe", "inventory")); I also tried with .obj added to the file name, and all of those again without the "inventory" all gave the same error: terraqueous:itemScythe#inventory not found I figured since my blocks needed ModelBakery.addVariantName I'd give it a try for the item. ModelBakery.addVariantName(itemScythe, "terraqueous:itemScythe.obj"); That got rid of the error but still didn't render. So in my proxy's int I added another line my blocks use ClientFunction.registerItemModel(itemScythe, 0, "terraqueous:itemScythe.obj"); no error, no render Next thing I tried was using a json renamed my model to scythe.obj created a itemScythe.json { "forge_marker": 1, "variants": { "inventory": { "model": "terraqueous:item/scythe.obj" } } } but that throws an error too: com.google.gson.JsonParseException: BlockModel requires either elements or parent, found neither Quote Link to comment Share on other sites More sharing options...
AtomicBlom Posted November 14, 2015 Share Posted November 14, 2015 Texture Coordinates are generally specified as 0-1 along axis named U and V. In 1.7, textures were generally loaded individually, and going outside of 0->1 would result in textures being repeated. In 1.8's model world, textures are stitched onto the main block sheet, which should be a good performance boost. However it means that if you use a UV coordinates less than 0, or greater than 1, you may end up with part of the texture of another block. For this reason, an error was introduced because your model will more than likely not render the way you intended it to. Quote Link to comment Share on other sites More sharing options...
FLUFFY2 Posted November 14, 2015 Author Share Posted November 14, 2015 Yeah, after a bit of testing i figured this out. So i fixed the UV mapping, and also fixed the material. So it renders okay now. I can see that some triangular face has rendering issues, because they are brighter, so it looks wierd. But other than that, i manage to get it working! Quote Link to comment Share on other sites More sharing options...
ShetiPhian Posted November 17, 2015 Share Posted November 17, 2015 Well I had some time to take another crack at this. You can not use a forge state json with the obj defined at a model, works for blocks but not items. Nor can you use a model json with the obj defined as a parent. Both throw the error: com.google.gson.JsonParseException: BlockModel requires either elements or parent, found neither What did work, partly. In the proxy preinit add a variant name that points to the obj file and include the '.obj' In the proxy init register the item model, also needs to point to the obj and include '.obj' That works to get the obj in game, just need to solve how to set transformations. I'm guessing that will need to be done with the ModelBakeEvent but it will have to wait until I get another chance to go digging. Quote Link to comment Share on other sites More sharing options...
FLUFFY2 Posted November 21, 2015 Author Share Posted November 21, 2015 Well i did achived to get items to work. Since my pistol is an item only. I think you have problems with your json. Here is what i did: -Create blockstate folder -Create models/item folders -Put obj with mtl into the models/item folder -In the blockstate create a .json file with the registered name Here is my Usp.json file: { "forge_marker": 1, "defaults": { "textures": { "#Usp": "csgo:Usp" }, "model": "csgo:Usp.obj" }, "variants": { "normal": [{}], "inventory": [{ "transform": { "firstperson": { "translation": [0.1, 0, -0.3], "rotation": [ { "y": 130}, {"x": 0}, {"z": 0} ], "scale": 0.2 }, "thirdperson": { "translation": [0.02, 0.05, -0.05], "rotation": [ { "y": 0}, {"x": -92}, {"z": 0} ], "scale": 0.07 }, "gui": { "translation": [0, -0.1, 0], "scale": 0.16 } } }] } } In the textures "#Usp" has to match the material name, that is in the mtl file. Also check out the Forge's ModelLoaderRegistryDebug.class in github, also the resources and the actual debug obj/mtl files. You need to correct some data in your model, or in wont load! Quote Link to comment Share on other sites More sharing options...
ShetiPhian Posted November 22, 2015 Share Posted November 22, 2015 So my problem was me putting the forge state json in the wrong place, I had put it in the items folder. I ended up writing my own baked model that extended OBJBakedModel. Not a waste of time though as I needed to change the render based on nbt anyway. I ran into the obj/mtl file edits requirement while working on blocks, but the Debug files helped out there. Only issues there is: - not knowing how to get the "custom" tag, but I don't think that can be done as the debug is just a placeholder last I checked. - break particles being white, block renders fine though. Had the same issue when I used a model and mtl from the debug folders, so maybe not implemented yet. Quote 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.