SpawnCommand.java 4.46 KB
Newer Older
KingRainbow44's avatar
KingRainbow44 committed
1
2
package emu.grasscutter.command.commands;

方块君's avatar
方块君 committed
3
import emu.grasscutter.Grasscutter;
KingRainbow44's avatar
KingRainbow44 committed
4
5
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
6
import emu.grasscutter.data.GameData;
7
8
9
import emu.grasscutter.data.def.AvatarData;
import emu.grasscutter.data.def.GadgetData;
import emu.grasscutter.data.def.ItemData;
KingRainbow44's avatar
KingRainbow44 committed
10
import emu.grasscutter.data.def.MonsterData;
11
12
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.entity.*;
Melledy's avatar
Melledy committed
13
import emu.grasscutter.game.player.Player;
14
15
import emu.grasscutter.game.props.EntityType;
import emu.grasscutter.game.props.FightProperty;
KingRainbow44's avatar
KingRainbow44 committed
16
17
import emu.grasscutter.utils.Position;

18
import javax.swing.text.html.parser.Entity;
KingRainbow44's avatar
KingRainbow44 committed
19
import java.util.List;
20
import java.util.Random;
KingRainbow44's avatar
KingRainbow44 committed
21

22
@Command(label = "spawn", usage = "spawn <entityId> [amount] [level(monster only)]",
KingRainbow44's avatar
KingRainbow44 committed
23
24
25
26
        description = "Spawns an entity near you", permission = "server.spawn")
public final class SpawnCommand implements CommandHandler {

    @Override
27
    public void execute(Player sender, List<String> args) {
KingRainbow44's avatar
KingRainbow44 committed
28
        if (sender == null) {
方块君's avatar
方块君 committed
29
            CommandHandler.sendMessage(null, Grasscutter.getLanguage().Run_this_command_in_game);
KingRainbow44's avatar
KingRainbow44 committed
30
31
32
33
            return;
        }

        if (args.size() < 1) {
方块君's avatar
方块君 committed
34
            CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Spawn_usage);
KingRainbow44's avatar
KingRainbow44 committed
35
36
37
38
            return;
        }

        try {
39
40
41
            int id = Integer.parseInt(args.get(0));
            int amount = args.size() > 1 ? Integer.parseInt(args.get(1)) : 1;
            int level = args.size() > 2 ? Integer.parseInt(args.get(2)) : 1;
KingRainbow44's avatar
KingRainbow44 committed
42

43
44
45
46
            MonsterData monsterData = GameData.getMonsterDataMap().get(id);
            GadgetData gadgetData = GameData.getGadgetDataMap().get(id);
            ItemData itemData = GameData.getItemDataMap().get(id);
            if (monsterData == null && gadgetData == null && itemData == null) {
方块君's avatar
方块君 committed
47
                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_entity_id);
KingRainbow44's avatar
KingRainbow44 committed
48
49
50
                return;
            }

51
            double maxRadius = Math.sqrt(amount * 0.2 / Math.PI);
KingRainbow44's avatar
KingRainbow44 committed
52
            for (int i = 0; i < amount; i++) {
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
                Position pos = GetRandomPositionInCircle(sender.getPos(), maxRadius).addY(3);
                GameEntity entity = null;
                if (itemData != null) {
                    entity = new EntityItem(sender.getScene(), null, itemData, pos, 1, true);
                }
                if (gadgetData != null) {
                    entity = new EntityVehicle(sender.getScene(), sender.getSession().getPlayer(), gadgetData.getId(), 0, pos, sender.getRotation());
                    int gadgetId = gadgetData.getId();
                    switch (gadgetId) {
                        // TODO: Not hardcode this. Waverider (skiff)
                        case 45001001, 45001002 -> {
                            entity.addFightProperty(FightProperty.FIGHT_PROP_BASE_HP, 10000);
                            entity.addFightProperty(FightProperty.FIGHT_PROP_BASE_ATTACK, 100);
                            entity.addFightProperty(FightProperty.FIGHT_PROP_CUR_ATTACK, 100);
                            entity.addFightProperty(FightProperty.FIGHT_PROP_CUR_HP, 10000);
                            entity.addFightProperty(FightProperty.FIGHT_PROP_CUR_DEFENSE, 0);
                            entity.addFightProperty(FightProperty.FIGHT_PROP_CUR_SPEED, 0);
                            entity.addFightProperty(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, 0);
                            entity.addFightProperty(FightProperty.FIGHT_PROP_MAX_HP, 10000);
                        }
                        default -> {}
                    }
                }
                if (monsterData != null) {
                    entity = new EntityMonster(sender.getScene(), monsterData, pos, level);
                }

                sender.getScene().addEntity(entity);
KingRainbow44's avatar
KingRainbow44 committed
81
            }
82
            CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Spawn_message.replace("{amount}", Integer.toString(amount)).replace("{id}", Integer.toString(id)));
KingRainbow44's avatar
KingRainbow44 committed
83
        } catch (NumberFormatException ignored) {
方块君's avatar
方块君 committed
84
            CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_entity_id);
KingRainbow44's avatar
KingRainbow44 committed
85
86
        }
    }
87
88
89
90
91
92
93
94

    private Position GetRandomPositionInCircle(Position origin, double radius){
        Position target = origin.clone();
        double angle = Math.random() * 360;
        double r = Math.sqrt(Math.random() * radius * radius);
        target.addX((float) (r * Math.cos(angle))).addZ((float) (r * Math.sin(angle)));
        return target;
    }
KingRainbow44's avatar
KingRainbow44 committed
95
}