Jump to content

[1.7.10] How to Drag-and-Drop an element in GuiScrollingList?


Recommended Posts

Posted

I have several questions on it.

1. Is it possible to drag-and-drop the element in GuiScrollingList? Is there any limit prohibiting the dragging?

2. Please give any tutorials or instruction for checking if it is dragging, or when it got dropped.

3. Is there any easy ways for this purpose? If any, please let me know; I'm looking forward at it.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted

Honestly, I have no clue how to do this. I have tried before but could never understand how the scrolling works. I would suggest finding a mod the implements some of what you want and decompiling it or, finding their github. :)

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

I can honestly say that there is no such implementation in normal source (forge+mc).

 

As to how to make it - 1st thing would be to understand how ScrollingList works, then your best option would to be make new class that would consist of 2 scrolling lists. Then you will need to, inside mouseClicked get the index clicked in one list (there is parent-child relation) and save that index to some temporary element. In your drawScreen you would need to draw this temporary element in place of mouse (also save x and y offset of element). mouseClicked has int event - you can use that to check when element is being hold and dropped, when dropped you can check if it was dropped inside same/other scrolling list and put it in index closest to separator between 2 existing indexes (if such are there). Obviously this will require you to understand how thay are being moved via scroll.

 

This is NOT very hard, it just requires shitload of reading and understanding mechanism to most basic state.

 

Structure:

MyGuiScreen (main screen)

---MyDoubleList extends Gui (and you will need to call methods inside from parent GuiScreen above)

---//MyDoubleList will containt:

------GuiScrollingList (first)

------GuiScrollingList (second)

------ElementHeld (the element that can be put into GuiScrollingList)

 

MyGuiScren calls renders/actions of MyDoubleList and MyDoubleList operates between 2 scrolling lists and element held. ElementHeld is ofc type that can be put inside those lists so it has some method that can be called from drawSlot(). You will call that method on drawScreen and draw it on mouse (with x/y offset saved), instead on one of lists. If Element is dropped not-in-one-of-lists then you can put it back to one you pulled it from.

 

I have somewhat expertise in those Guis, so to fully understand what I mean you need to 1st understand guis.

  Quote

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

Posted
  On 3/25/2015 at 9:20 PM, Ernio said:

I can honestly say that there is no such implementation in normal source (forge+mc).

 

As to how to make it - 1st thing would be to understand how ScrollingList works, then your best option would to be make new class that would consist of 2 scrolling lists. Then you will need to, inside mouseClicked get the index clicked in one list (there is parent-child relation) and save that index to some temporary element. In your drawScreen you would need to draw this temporary element in place of mouse (also save x and y offset of element). mouseClicked has int event - you can use that to check when element is being hold and dropped, when dropped you can check if it was dropped inside same/other scrolling list and put it in index closest to separator between 2 existing indexes (if such are there). Obviously this will require you to understand how thay are being moved via scroll.

 

This is NOT very hard, it just requires shitload of reading and understanding mechanism to most basic state.

 

Structure:

MyGuiScreen (main screen)

---MyDoubleList extends Gui (and you will need to call methods inside from parent GuiScreen above)

---//MyDoubleList will containt:

------GuiScrollingList (first)

------GuiScrollingList (second)

------ElementHeld (the element that can be put into GuiScrollingList)

 

MyGuiScren calls renders/actions of MyDoubleList and MyDoubleList operates between 2 scrolling lists and element held. ElementHeld is ofc type that can be put inside those lists so it has some method that can be called from drawSlot(). You will call that method on drawScreen and draw it on mouse (with x/y offset saved), instead on one of lists. If Element is dropped not-in-one-of-lists then you can put it back to one you pulled it from.

 

I have somewhat expertise in those Guis, so to fully understand what I mean you need to 1st understand guis.

 

Thanks, but what I want was drag-and-drop on one list, to move position.

anyway I got some understanding on how to do it. I was just too lazy...  ;| (+ I have only 2 hours per day u.u)

 

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted

Wait, I found a vital limit..

There is a field which represents how much the list was scrolled: GuiScrollingList#scrollDistance.

I should access to the field to find the position the element will be.

But it is private, so there is no way to access the field without reflection.

So, how can I solve this problem? Is there any breakthrough?

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted

No, no, no, no...

 

Just copy that code and make mod-owned gui class. (MyGuiScrollingList). Who cares about ClassLoader (meaning amout of loaded classes) anyway?

 

You are better off making new one - gives you lot more power over handling stuff, that you are going to need to make universal drag-drop-scroll list.

 

Why would anyone make that field private... cmon forge :c

  Quote

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

Posted
  On 3/26/2015 at 5:23 PM, shadowfacts said:

Access Transformers

What.. I don't want to reflection AS WELL AS AT(ASM)!

 

 

  Quote

No, no, no, no...

 

Just copy that code and make mod-owned gui class. (MyGuiScrollingList). Who cares about ClassLoader (meaning amout of loaded classes) anyway?

 

You are better off making new one - gives you lot more power over handling stuff, that you are going to need to make universal drag-drop-scroll list.

 

Why would anyone make that field private... cmon forge :c

 

I didn't really want to copy the code... but if I should, I'd do it.

+ Would making a PR which simply changes the field to public be acceptable?

+ Actually I solved that. There is a method named GuiScrollingList#func_27256_c(int x, int y).

  It checks that a specific position is in the list, so I can get what I want by some trick.! (like putting y-slotheight/2)

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted
  On 3/26/2015 at 11:37 PM, diesieben07 said:

Using reflection is just fine. You won't get a PR in with just this change, Reflection is the way to go.

Hm. Thanks, so the those PRs are not acceptable.

& I'll not use reflection to do this, since there is another way. (..actually I doubt that you read my thread, but nevermind)

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted
  On 3/27/2015 at 2:06 PM, diesieben07 said:

I did read your thread...

Yes, there are other ways, you could copy-pasta the whole thing (ugly) use an AccessTransformer (hacky, overkill, doesn't work as well as most people think) or just use custom ASM code instead of an AccessTransformer (even more ugly).

In my opinion Reflection is just fine to use in this situation.

Oh, that sounds interesting. So I'd use Refelction in similar situation, when it is necessary. Thanks.

+ What I mean by 'another way', it means that there is normal way, which is just 'calling normal method'.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

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

    • This mod lets you choose an element power, Earth, Wind, Fire, or Water. Also two secret element powers Light and Darkness. Each power gives good a bad things, Earth lets you dig through anything but ores and bedrock, Wind lets you jump high in the air every three seconds, Fir lets you throw fire balls and you are immune to any flame/lava but you can't go into water or else you take damage, Water you swim and break blocks under water quicker and you can get rid of water like a sponge but you take more damage when in fire/lava, Light makes you faster at day but slower at night you are able to throw light spears that do four hearts and can go through any armor, Darkness let's you be faster at night but slower at day mobs don't harm you but peaceful mobs run away from you you are able to spawn ink creatures around you that are like dogs but are stronger. another thing in the mod is that there are other dimensions that can get you ores to make better armor and weapons, each dimensions are are good for a certain element though each dimension has a boss depending on which dimension one dimension has more than one boss, each elements are required to defeat the bosses with each others help.
    • Read the posts above yours, it tells you exactly how to do it, instructions are the same if it's making a forge installation or a vanilla one, just make a new folder for the game directory.
    • Yes that’s the full log, I managed to get it working last night, the anvil fix mod is what was causing it to crash
    • Hey guys, i'm currently developping a mod with forge 1.12.2 2860 and i'm using optifine and gradle 4.9. The thing is i'm trying to figure out how to show the player's body in first person. So far everything's going well since i've try to use a shader. The player's body started to blink dark when using a shader. I've try a lot of shader like chocapic, zeus etc etc but still the same issue. So my question is : How should i apply the current shader to the body ? At the same time i'm also drawing a HUD so maybe it could be the problem?   Here is the issue :    And here is the code where i'm trying to display the body :    private static void renderFirstPersonBody(EntityPlayerSP player, float partialTicks) { Minecraft mc = Minecraft.getMinecraft(); GlStateManager.pushMatrix(); GlStateManager.pushAttrib(); try { // Préparation OpenGL GlStateManager.enableDepth(); GlStateManager.depthMask(true); GlStateManager.enableAlpha(); GlStateManager.alphaFunc(GL11.GL_GREATER, 0.1F); GlStateManager.enableBlend(); GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); // Éclairage correct pour shaders GlStateManager.enableLighting(); RenderHelper.enableStandardItemLighting(); GlStateManager.enableRescaleNormal(); // Active la lightmap pour les shaders mc.entityRenderer.enableLightmap(); // Position de rendu interpolée double px = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks; double py = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; double pz = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; GlStateManager.translate( px - mc.getRenderManager().viewerPosX, py - mc.getRenderManager().viewerPosY, pz - mc.getRenderManager().viewerPosZ ); // Rendu du joueur sans la tête Render<?> render = mc.getRenderManager().getEntityRenderObject(player); if (render instanceof RenderPlayer) { RenderPlayer renderPlayer = (RenderPlayer) render; boolean oldHeadHidden = renderPlayer.getMainModel().bipedHead.isHidden; boolean oldHeadwearHidden = renderPlayer.getMainModel().bipedHeadwear.isHidden; renderPlayer.getMainModel().bipedHead.isHidden = true; renderPlayer.getMainModel().bipedHeadwear.isHidden = true; setArmorHeadVisibility(renderPlayer, false); renderPlayer.doRender(player, 0, 0, 0, player.rotationYaw, partialTicks); renderPlayer.getMainModel().bipedHead.isHidden = oldHeadHidden; renderPlayer.getMainModel().bipedHeadwear.isHidden = oldHeadwearHidden; setArmorHeadVisibility(renderPlayer, !oldHeadwearHidden); } // Nettoyage post rendu mc.entityRenderer.disableLightmap(); GlStateManager.disableRescaleNormal(); } catch (Exception e) { // silent fail } finally { GlStateManager.popAttrib(); GlStateManager.popMatrix(); } }   Ty for your help. 
    • Item successfully registered, but there was a problem with the texture of the item, it did not insert and has just the wrong texture.     
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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