File size: 12,080 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package net.minecraft.server.commands;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.FloatArgumentType;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import java.util.Collection;
import net.minecraft.commands.CommandBuildContext;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.commands.arguments.ParticleArgument;
import net.minecraft.commands.arguments.coordinates.Vec3Argument;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.phys.Vec3;

public class ParticleCommand {
    private static final SimpleCommandExceptionType ERROR_FAILED = new SimpleCommandExceptionType(Component.translatable("commands.particle.failed"));

    public static void register(CommandDispatcher<CommandSourceStack> p_138123_, CommandBuildContext p_248587_) {
        p_138123_.register(
            Commands.literal("particle")
                .requires(p_138127_ -> p_138127_.hasPermission(2))
                .then(
                    Commands.argument("name", ParticleArgument.particle(p_248587_))
                        .executes(
                            p_138148_ -> sendParticles(
                                    p_138148_.getSource(),
                                    ParticleArgument.getParticle(p_138148_, "name"),
                                    p_138148_.getSource().getPosition(),
                                    Vec3.ZERO,
                                    0.0F,
                                    0,
                                    false,
                                    p_138148_.getSource().getServer().getPlayerList().getPlayers()
                                )
                        )
                        .then(
                            Commands.argument("pos", Vec3Argument.vec3())
                                .executes(
                                    p_138146_ -> sendParticles(
                                            p_138146_.getSource(),
                                            ParticleArgument.getParticle(p_138146_, "name"),
                                            Vec3Argument.getVec3(p_138146_, "pos"),
                                            Vec3.ZERO,
                                            0.0F,
                                            0,
                                            false,
                                            p_138146_.getSource().getServer().getPlayerList().getPlayers()
                                        )
                                )
                                .then(
                                    Commands.argument("delta", Vec3Argument.vec3(false))
                                        .then(
                                            Commands.argument("speed", FloatArgumentType.floatArg(0.0F))
                                                .then(
                                                    Commands.argument("count", IntegerArgumentType.integer(0))
                                                        .executes(
                                                            p_138144_ -> sendParticles(
                                                                    p_138144_.getSource(),
                                                                    ParticleArgument.getParticle(p_138144_, "name"),
                                                                    Vec3Argument.getVec3(p_138144_, "pos"),
                                                                    Vec3Argument.getVec3(p_138144_, "delta"),
                                                                    FloatArgumentType.getFloat(p_138144_, "speed"),
                                                                    IntegerArgumentType.getInteger(p_138144_, "count"),
                                                                    false,
                                                                    p_138144_.getSource().getServer().getPlayerList().getPlayers()
                                                                )
                                                        )
                                                        .then(
                                                            Commands.literal("force")
                                                                .executes(
                                                                    p_138142_ -> sendParticles(
                                                                            p_138142_.getSource(),
                                                                            ParticleArgument.getParticle(p_138142_, "name"),
                                                                            Vec3Argument.getVec3(p_138142_, "pos"),
                                                                            Vec3Argument.getVec3(p_138142_, "delta"),
                                                                            FloatArgumentType.getFloat(p_138142_, "speed"),
                                                                            IntegerArgumentType.getInteger(p_138142_, "count"),
                                                                            true,
                                                                            p_138142_.getSource().getServer().getPlayerList().getPlayers()
                                                                        )
                                                                )
                                                                .then(
                                                                    Commands.argument("viewers", EntityArgument.players())
                                                                        .executes(
                                                                            p_138140_ -> sendParticles(
                                                                                    p_138140_.getSource(),
                                                                                    ParticleArgument.getParticle(p_138140_, "name"),
                                                                                    Vec3Argument.getVec3(p_138140_, "pos"),
                                                                                    Vec3Argument.getVec3(p_138140_, "delta"),
                                                                                    FloatArgumentType.getFloat(p_138140_, "speed"),
                                                                                    IntegerArgumentType.getInteger(p_138140_, "count"),
                                                                                    true,
                                                                                    EntityArgument.getPlayers(p_138140_, "viewers")
                                                                                )
                                                                        )
                                                                )
                                                        )
                                                        .then(
                                                            Commands.literal("normal")
                                                                .executes(
                                                                    p_138138_ -> sendParticles(
                                                                            p_138138_.getSource(),
                                                                            ParticleArgument.getParticle(p_138138_, "name"),
                                                                            Vec3Argument.getVec3(p_138138_, "pos"),
                                                                            Vec3Argument.getVec3(p_138138_, "delta"),
                                                                            FloatArgumentType.getFloat(p_138138_, "speed"),
                                                                            IntegerArgumentType.getInteger(p_138138_, "count"),
                                                                            false,
                                                                            p_138138_.getSource().getServer().getPlayerList().getPlayers()
                                                                        )
                                                                )
                                                                .then(
                                                                    Commands.argument("viewers", EntityArgument.players())
                                                                        .executes(
                                                                            p_138125_ -> sendParticles(
                                                                                    p_138125_.getSource(),
                                                                                    ParticleArgument.getParticle(p_138125_, "name"),
                                                                                    Vec3Argument.getVec3(p_138125_, "pos"),
                                                                                    Vec3Argument.getVec3(p_138125_, "delta"),
                                                                                    FloatArgumentType.getFloat(p_138125_, "speed"),
                                                                                    IntegerArgumentType.getInteger(p_138125_, "count"),
                                                                                    false,
                                                                                    EntityArgument.getPlayers(p_138125_, "viewers")
                                                                                )
                                                                        )
                                                                )
                                                        )
                                                )
                                        )
                                )
                        )
                )
        );
    }

    private static int sendParticles(
        CommandSourceStack p_138129_,
        ParticleOptions p_138130_,
        Vec3 p_138131_,
        Vec3 p_138132_,
        float p_138133_,
        int p_138134_,
        boolean p_138135_,
        Collection<ServerPlayer> p_138136_
    ) throws CommandSyntaxException {
        int i = 0;

        for (ServerPlayer serverplayer : p_138136_) {
            if (p_138129_.getLevel()
                .sendParticles(
                    serverplayer,
                    p_138130_,
                    p_138135_,
                    false,
                    p_138131_.x,
                    p_138131_.y,
                    p_138131_.z,
                    p_138134_,
                    p_138132_.x,
                    p_138132_.y,
                    p_138132_.z,
                    (double)p_138133_
                )) {
                i++;
            }
        }

        if (i == 0) {
            throw ERROR_FAILED.create();
        } else {
            p_138129_.sendSuccess(
                () -> Component.translatable("commands.particle.success", BuiltInRegistries.PARTICLE_TYPE.getKey(p_138130_.getType()).toString()), true
            );
            return i;
        }
    }
}