SpawnCommand.java 5.11 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
import emu.grasscutter.utils.Position;
AnimeGitB's avatar
AnimeGitB committed
17
import emu.grasscutter.game.world.Scene;
KingRainbow44's avatar
KingRainbow44 committed
18

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

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

    @Override
AnimeGitB's avatar
AnimeGitB committed
28
    public void execute(Player sender, Player targetPlayer, List<String> args) {
AnimeGitB's avatar
AnimeGitB committed
29
        if (targetPlayer == null) {
30
            CommandHandler.sendMessage(sender, translate("commands.execution.need_target"));
KingRainbow44's avatar
KingRainbow44 committed
31
32
33
            return;
        }

AnimeGitB's avatar
AnimeGitB committed
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
        int id = 0;  // This is just to shut up the linter, it's not a real default
        int amount = 1;
        int level = 1;
        switch (args.size()) {
            case 3:
                try {
                    level = Integer.parseInt(args.get(2));
                } catch (NumberFormatException ignored) {
                    CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_arguments);
                }  // Fallthrough
            case 2:
                try {
                    amount = Integer.parseInt(args.get(1));
                } catch (NumberFormatException ignored) {
                    CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_amount);
                }  // Fallthrough
            case 1:
                try {
                    id = Integer.parseInt(args.get(0));
                } catch (NumberFormatException ignored) {
                    CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_entity_id);
                }
                break;
            default:
                CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Spawn_usage);
                return;
KingRainbow44's avatar
KingRainbow44 committed
60
61
        }

AnimeGitB's avatar
AnimeGitB committed
62
63
64
65
66
67
68
69
        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) {
            CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Invalid_entity_id);
            return;
        }
        Scene scene = targetPlayer.getScene();
KingRainbow44's avatar
KingRainbow44 committed
70

AnimeGitB's avatar
AnimeGitB committed
71
72
73
74
75
76
        double maxRadius = Math.sqrt(amount * 0.2 / Math.PI);
        for (int i = 0; i < amount; i++) {
            Position pos = GetRandomPositionInCircle(targetPlayer.getPos(), maxRadius).addY(3);
            GameEntity entity = null;
            if (itemData != null) {
                entity = new EntityItem(scene, null, itemData, pos, 1, true);
KingRainbow44's avatar
KingRainbow44 committed
77
            }
AnimeGitB's avatar
AnimeGitB committed
78
79
80
81
82
83
84
85
86
87
88
89
90
91
            if (gadgetData != null) {
                entity = new EntityVehicle(scene, targetPlayer.getSession().getPlayer(), gadgetData.getId(), 0, pos, targetPlayer.getRotation());  // TODO: does targetPlayer.getSession().getPlayer() have some meaning?
                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);
92
                    }
AnimeGitB's avatar
AnimeGitB committed
93
                    default -> {}
94
                }
KingRainbow44's avatar
KingRainbow44 committed
95
            }
AnimeGitB's avatar
AnimeGitB committed
96
97
98
99
100
            if (monsterData != null) {
                entity = new EntityMonster(scene, monsterData, pos, level);
            }

            scene.addEntity(entity);
KingRainbow44's avatar
KingRainbow44 committed
101
        }
AnimeGitB's avatar
AnimeGitB committed
102
        CommandHandler.sendMessage(sender, Grasscutter.getLanguage().Spawn_message.replace("{amount}", Integer.toString(amount)).replace("{id}", Integer.toString(id)));
KingRainbow44's avatar
KingRainbow44 committed
103
    }
104
105
106
107
108
109
110
111

    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
112
}