Jump to content

Recommended Posts

Posted (edited)

I have a keybind where you spit like a llama. On singleplayer both the entity and particle spawn and it's sound is played (https://youtu.be/bpxnFDuWw_I). But on a server only the entity is spawned and nothing else (https://youtu.be/veVQ4zSqnIA), no particles nor sound.

Upon starting the server I have noticed this error in the window (https://postimg.cc/K3KDCpMY), don't know if it's relevant. The server works fine but when I want to spit the following pops up in the serverlog '''Attempted to load class net/minecraft/client/player/LocalPlayer for invalid dist DEDICATED_SERVER''' (https://postimg.cc/LqTDP1Sm). I have prepared the following code of the Server-to-Client packet class which I have made to spawn mentioned particles and sounds.

package mett.palemannie.tabakmod.networking.packets;

import net.minecraft.client.Minecraft;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.NetworkEvent;

import java.util.function.Supplier;

public class SpuckEffektS2CPacket {
    public SpuckEffektS2CPacket(){
    }
    public SpuckEffektS2CPacket(FriendlyByteBuf buf){
    }
    public void toBytes(FriendlyByteBuf buf){
    }

    public boolean handle(Supplier<NetworkEvent.Context> supplier){
        NetworkEvent.Context context = supplier.get();
        context.enqueueWork(()-> {


            Player player = Minecraft.getInstance().player; //Attempted to load class net/minecraft/client/player/LocalPlayer for invalid dist DEDICATED_SERVER
            Level level = Minecraft.getInstance().level;


                RandomSource rdm = RandomSource.create();
                float r = rdm.nextInt(80, 120) / 100f;
                player.playSound(SoundEvents.LLAMA_SPIT, 1f, r);

                Vec3 MausPos = player.getEyePosition();
                Vec3 SchauWinkel = player.getLookAngle();
                level.addParticle(ParticleTypes.SPIT, true,
                        MausPos.x, MausPos.y, MausPos.z,
                        SchauWinkel.x/4, SchauWinkel.y/4, SchauWinkel.z/4);

        });
        return true;
    }
}

Is there an alternative to Minecraft.getInstance().player;? dumb question. I have looked at other mods (MrCrayfish's Gun Mod, Ars Noveau, Apotheosis) on how they handle such server-to-client sound and particles but I haven't got any wiser.

 

 

Edited by Pale Mannie
Posted

I have now attempted replacing

Player player = Minecraft.getInstance().player;

with

Player player = NetworkEvent.Context.getSender()

and it doesn't work on either side.This error was thrown: Attempted to load class net/minecraft/client/multiplayer/ClientLevel for invalid dist DEDICATED_SERVER.

Figures since NetworkEvent.Context.getSender() is a ServerPlayer Variable. So is my guess.

  • Pale Mannie changed the title to [SOLVED] Keybind particles not spawning and sounds not playing when on a server
Posted (edited)

I have found a rather simple solution to all this after actually combing through the source codes of Mr Crayfishs Gun Mod and Timeless and Classics Guns Zero. They execute the sounds and particles not in the custom packet class itself but externally. You simply create another class (put it anywhere in your project in main), create a method and put in the desired sounds and particles or whatever you want in it. Create multiple methods for each individual task if you need to. You execute your code in the C2S Packet as follows:

public class SpittingC2SPacket {
    public SpittingC2SPacket(){
    }
    public SpittingC2SPacket(FriendlyByteBuf buf){
    }
    public void toBytes(FriendlyByteBuf buf){
    }

    public boolean handle(Supplier<NetworkEvent.Context> supplier){

        NetworkEvent.Context context = supplier.get();
        context.enqueueWork(()-> {

            ServerPlayer player = context.getSender();
            ServerLevel sevel = player.getLevel();
            RandomSource rdm = RandomSource.create();

          //Entity          
            SpuckeEntity spit = new SpitEntity(sevel, player);
            float r = (float)rdm.nextInt(3500,5000)/10000;
            float y = player.getYRot();
            float x = player.getXRot();
            float z = 0f;
            spucke.shootFromRotation(player, x, y, z, r, 1f);
            sevel.addFreshEntity(spit);

          //External handler
          /////////////////////////////////////////////////////////////////
            ServerPlayHandler.handleSpitting(player);
	/////////////////////////////////////////////////////////////////
        });
        return true;
    }
}

And your external handler class can look like this:

public class ServerPlayHandler {

    public static void handleSpitting(ServerPlayer player){

        if(player.isSpectator()) return;

        Level lvl = player.level;

        //Sounds
        double posX = player.getX();
        double posY = player.getY() + player.getEyeHeight();
        double posZ = player.getZ();
        float r = 0.8f + lvl.random.nextFloat() * 0.3f;

        lvl.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.LLAMA_SPIT, SoundSource.BLOCKS, 1f, r);

        //Particles
        Vec3 vec3 = player.getViewVector(1f);
        Vec3 MausPos = player.getEyePosition();
        Vec3 SchauWinkel = player.getLookAngle();

        double x = player.getX() + vec3.x/4;
        double y = MausPos.y + vec3.y/4;
        double z = player.getZ() + vec3.z/4;

        if(lvl instanceof ServerLevel slevel) {
            slevel.sendParticles(ParticleTypes.SPIT, x, y, z, 3, 0d, 0d, 0d, 0.15d);
        }
    }
}

It works now. On client as well as on a server

Edited by Pale Mannie

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

    • The game crashed whilst unexpected error Error: net.minecraftforge.fml.ModLoadingException: Advanced Mining Dimension (mining_dimension) encountered an error during the done event phase
    • Here is the end of the log. it was way too big to put in pastebin, but I started from when I was online and everything was fine. Error should be in here: https://pastebin.com/Sdhdq593
    • Update: I stand corrected as I was able to dig up a relevant log from my earlier testing which highlights the overall issue but does not explain how to solve it. See, Diagnostic Logs for pack.mcmeta not found: https://pastebin.com/LXS8Rtna
    • Which mod was this? What are all the mods that were in use? It will help if enough information to replicate the problem is available.
    • I have been attempting to create a supplementary resource pack with Patchouli in order to add back the guidebook for Better End but unfortunately in every prototype I have made pack.mcmeta and my resource pack are not recognized. I have tested both zipped and unzipped and either way curseforge does not recognize my resource pack as existing. For testing I stripped my pack down to just the pack.mcmeta file and two empty folders labelled data and assets and I know the data folder is not the problem as firstly my first attempts just had an assets folder following Patchouli instructions and data came later in my flailing attempts to make anything in my pack work. The mcmeta file is not recognized whether or not I use this:  { "pack": { "pack_format": 15, "description": "A replacement for the BetterEnd Guide Book." } "language": { "en_US": { "name": "English", "region": "United States" } } } ,or this:  { "pack": { "pack_format": 15, "description": "A replacement for the BetterEnd Guide Book." } } I have made sure to only use lowercase and the pack folder is named better-end-guide. Is this some magic nonsense from me doing this manually instead of using an IDE or similar tool? Could it be because my files are by default in UTF-8 even though ANSI gives the same results? Is there a specific community secret tool I am supposed to use for zipping or specific settings? I am pulling my hair in distress. Unfortunately as there are no errors involved I lack logs to offer, if that disqualifies this thread please do not be harsh and instead if you can then please direct me to a forum with different rules and sufficiently respectful but knowledgeable as to be of assistance. Most of my experience with the programming community has been poor and so naturally I find myself wary.
  • Topics

×
×
  • Create New...

Important Information

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