Jump to content

Recommended Posts

Posted

Ok, so my problem is, that the serverSide object defined by @SidedProxy, when playing in single-player mode, does not get created. I most likely understand why, as the field has to be static, and only one (client) would exist in the JVM. Therefore, I'd like to know, how can I have a common method, preferably defined in an interface, that has different logic executed on the server and on the client? Or, in case of single player mode, execute the server logic.

 

What I'm trying to achieve is the following:

- server stores some information in files on the server and allows access to this information internally to the mod running on server, via direct method access,

- mod when the information is requested, while running on the client, sends the request to server using a packet and returns a "pending" response to the caller, and after the response is returned from the server (via a packet) stores it locally in a cache, so any call done for the same information later on, is returned from cache.

 

So, what I did was the following:

- the serverSide proxy has an implementation for the getInformation() method that returns the information by reading it from file,

- the clientSide proxy has a Map that was used for cache, and if the getInformation() method was called, and the information was not in cache, was sending a packet to server to request the information to be sent to it,

- I've defined a PacketHandler on the server that when a packet was received, it used the getInformation() method of the server proxy and was sending the information to client in a packet,

- I've defined a PacketHandler on the client that when a packet was received, it stored the information in the client proxy's cache.

 

All great, and clean, however when I run this in single player, there is no server proxy, and the clientSide sends the packet to server PacketHandler, packet handler then goes to the proxy class and invokes the getInformation() method to send the response to client, however the proxy class is not the server flavor, but the client one.

 

I have a feeling that either the @SidedProxy was not really designed well for the single player mode, or I'm using it incorrectly. Please advise on how to solve this problem and maybe explain what is the purpose of the @SidedProxy.

Posted

SideProxy is used for the environments, not the actually connection side.

The Client side has a lot more classes and functions then the server side.

Mainly because the obfusicator Mojang uses trips unused classes/functions from minecraft when they ship it.

So the client have a ton more stuff related to rendering, and languages, and the like.

There is no clean way to detect these differences, so, SideProxy was born to help modders keep a cohesive codebase. Basically anything that doesn't exist on both sides should be gated through the SideProxy.

 

As for your situation, you need to detect which side of the connection you're on. Typically you're given a world reference. Using world.isRemote will tell you which side you're on. If it's true, then you're in the client thread, if its false then you're in the server thread.

 

If that doesn't work, Somewhere, I think in SideCommonHandler there is a function to attempt to guess the current thread context.

 

As for how people use SideProxy, most cases i've seen people have a 'CommonProxy' class where they define there defualt functionality for what happens when they are in the dedicated server environment. And then a ClientProxy which extends CommonProxy to deal with the ClientEnvironment.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

Posted

Thank you for your answer, however when I check using World, if I'm on client or server, in case of single-player mode, it will tell me I'm on client, but in this case, I have to actually call the server routine to look into the file, rather than sending the packet to server.

 

So, I guess my question becomes, how can I differentiate that I'm on client running against remote server, or on client running in single-player mode?

Posted

You don't and you shouldn't, though its not the most optimal performance to do network negotiations on a local system, it's the best way to do it as 1) it emulates the dedicated server environment and 2) It does the delicate process of cross thread communication that is needed in a standard way.

 

So basically.. there is no difference between a client on localhost and a client of a dedicated server and you shouldn't treat it as different.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

Posted

I guess in the server PacketHandler I'll make a call to a static method in my main Mod class getServerProxy() which will check if the static proxy injected by Forge is instanceof the Server Proxy I want to use, and if not, just create and store an instance of it.

 

That way, on the real server, it will be injected by the Forge, on the single-player mode "server" it will be lazily created by this method, and all the calls that are done specifically on the server side, will use that method to get the proxy they require.

 

Thanks!

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

    • Reach Out To Rapid Digital: What sapp Info: +1 41 4 80 7 14 85 Email INFO: rap iddi gita lrecov ery @ exe cs. com Hello, my name is Jayson, and I’m 35 years old from the United Kingdom. My family and I recently endured an incredibly challenging experience that I wouldn’t wish on anyone. We became victims of a cryptocurrency investment fraud scheme that saw us lose a staggering $807,000 in USDT and Bitcoins. The fraudsters had created a convincing facade, and we were lured into investing, only to discover later that the platform was a complete scam. We were left devastated, not just financially, but emotionally, as we had trusted these people and believed in the legitimacy of the investment. After the initial shock wore off, we desperately searched for ways to recover the lost funds. It seemed like an impossible task, and we felt as though there was no hope. That’s when, by sheer luck, we stumbled across a post about Rapid Digital Recovery, a cryptocurrency and funds recovery organization with a proven track record in cybersecurity and fraud recovery. We decided to reach out to them, and from the first interaction, we were impressed with their professionalism and transparency. They explained the recovery process in detail and reassured us that they had the skills and expertise to track down the perpetrators and recover our funds. This gave us a renewed sense of hope, something we hadn’t felt in months. What truly stood out during our experience with Rapid Digital Recovery was their dedication to the recovery process. The team went above and beyond, using sophisticated tracking tools and cyber forensics to gather critical information. Within a matter of weeks, they had successfully located the funds and traced the scam back to the fraudsters responsible. They worked with the authorities to ensure the criminals were held accountable for their actions. To our relief, the team at Rapid Digital Recovery was able to recover every single penny we had lost. The funds were returned in full, and the sense of closure we felt was invaluable. We couldn’t have imagined such a positive outcome in the early stages of our recovery journey, and we are deeply grateful for the work they did. If you ever find yourself in a similar situation, I highly recommend contacting Rapid Digital Recovery. Their expertise, transparency, and dedication to their clients make them the go-to choice for anyone seeking to recover lost cryptocurrency or funds. They truly gave us back our financial future.  
    • This is my first time modding anything, so maybe just skill issue. I'm using Forge 54.0.12 and Temurin 21.0.5+11-LTS I wanted to create a custom keybind and to check whether it works I'd like to send a chat message. I tried using Minecraft.getInstance().player.sendSystemMessage(Component.literal("test")); but IntelliJ couldnt resolve sendSystemMessage(...). Since I saw people using it in earlier versions, I tried the same thing with 1.20.6(- 50.1.0), where it works fine, now I can't figure out if this is intentional and whether there are other options for sending chat messages. On that note, is there more documentation than https://docs.minecraftforge.net/en/1.21.x/? It seems very incomplete compared to something like the Oracle Java docs
    • Hi, i'm having this error and I wanna fix it. we try: -Reload drivers -Eliminate .minecraft -Eliminate Java -Restart launcher -Verify if minecraft is using gpu -Mods  in .minecraft is empty -Install the latest and recomended version of forge idk what i have to do, help me pls. the lastest log is: https://mclo.gs/WAMao8x  
    • Read the FAQ, Rule #2. (https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/)  
    • The link to your log does not work, it says it is forbidden, Error, this is a private paste or is pending moderation.
  • Topics

×
×
  • Create New...

Important Information

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