Skip to content

Commit 0ccaacd

Browse files
committed
feat: done
1 parent 10322b3 commit 0ccaacd

File tree

12 files changed

+210
-44
lines changed

12 files changed

+210
-44
lines changed

src/main/java/me/daoge/daogelab/DaogeLab.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
import com.google.gson.GsonBuilder;
55
import eu.okaeri.configs.ConfigManager;
66
import lombok.Getter;
7-
import lombok.extern.slf4j.Slf4j;
87
import me.daoge.daogelab.api.ConnectionManager;
8+
import me.daoge.daogelab.mode.DefaultMode;
9+
import me.daoge.daogelab.mode.Mode;
910
import me.daoge.daogelab.network.WebSocketServer;
1011
import org.allaymc.api.eventbus.EventHandler;
1112
import org.allaymc.api.eventbus.event.player.PlayerQuitEvent;
@@ -14,17 +15,40 @@
1415
import org.allaymc.api.server.Server;
1516
import org.allaymc.api.utils.Utils;
1617

18+
import java.util.HashMap;
19+
import java.util.Map;
20+
1721
/**
1822
* @author daoge_cmd
1923
*/
20-
@Slf4j
2124
public class DaogeLab extends Plugin {
2225

2326
public static DaogeLab INSTANCE;
2427
public static Gson GSON;
2528

2629
@Getter
2730
protected DaogeLabConfig config;
31+
protected Map<String, Mode> modes;
32+
protected Mode currentMode;
33+
34+
public void switchMode(String modeName) {
35+
var mode = modes.get(modeName);
36+
if (mode == null) {
37+
pluginLogger.error("Mode {} not found! Fallback to default mode", modeName);
38+
mode = modes.get(DefaultMode.NAME);
39+
}
40+
41+
if (currentMode != null) {
42+
currentMode.onDisable();
43+
}
44+
currentMode = mode;
45+
currentMode.onEnable();
46+
pluginLogger.info("Mode switched to {}", modeName);
47+
}
48+
49+
public boolean hasMode(String modeName) {
50+
return modes.containsKey(modeName);
51+
}
2852

2953
@Override
3054
public void onEnable() {
@@ -36,14 +60,16 @@ public void onEnable() {
3660
);
3761
Registries.COMMANDS.register(new DaogeLabCommand());
3862
Server.getInstance().getEventBus().registerListener(this);
63+
registerModes();
64+
switchMode(this.config.mode());
3965
WebSocketServer.run();
40-
log.info("DaogeLab plugin is enabled!");
66+
pluginLogger.info("DaogeLab plugin is enabled!");
4167
}
4268

4369
@Override
4470
public void onDisable() {
4571
WebSocketServer.stop();
46-
log.info("DaogeLab plugin is disabled!");
72+
pluginLogger.info("DaogeLab plugin is disabled!");
4773
}
4874

4975
@EventHandler
@@ -53,4 +79,13 @@ protected void onPlayerQuit(PlayerQuitEvent event) {
5379
connection.disconnect();
5480
}
5581
}
82+
83+
protected void registerModes() {
84+
this.modes = new HashMap<>();
85+
registerMode(new DefaultMode());
86+
}
87+
88+
protected void registerMode(Mode mode) {
89+
this.modes.put(mode.getModeName(), mode);
90+
}
5691
}

src/main/java/me/daoge/daogelab/DaogeLabCommand.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,26 @@ public void prepareCommandTree(CommandTree tree) {
4343
var connection = ConnectionManager.getByUUID(player.getLoginData().getUuid());
4444
if (connection != null) {
4545
connection.disconnect();
46-
player.sendTr(TextFormat.YELLOW + "%daogelab:disconnect");
46+
player.sendTr(TextFormat.YELLOW + "%daogelab:disconnecting");
4747
return context.success();
4848
} else {
4949
player.sendTr(TextFormat.RED + "%daogelab:not_connected");
5050
return context.fail();
5151
}
52-
}, SenderType.PLAYER);
52+
}, SenderType.PLAYER)
53+
.root()
54+
.key("switchmode")
55+
.str("modename")
56+
.exec(context -> {
57+
String modeName = context.getResult(1);
58+
if (!DaogeLab.INSTANCE.hasMode(modeName)) {
59+
context.getSender().sendTr(TextFormat.RED + "%daogelab:unknown_mode", modeName);
60+
return context.fail();
61+
}
62+
63+
DaogeLab.INSTANCE.switchMode(modeName);
64+
context.getSender().sendTr(TextFormat.GREEN + "%daogelab:mode_switched", modeName);
65+
return context.success();
66+
});
5367
}
5468
}

src/main/java/me/daoge/daogelab/DaogeLabConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import eu.okaeri.configs.annotation.CustomKey;
66
import lombok.Getter;
77
import lombok.experimental.Accessors;
8+
import me.daoge.daogelab.mode.DefaultMode;
89

910
/**
1011
* @author daoge_cmd
@@ -23,4 +24,7 @@ public class DaogeLabConfig extends OkaeriConfig {
2324
@Comment("If true, connect to WebSocket server using HTTPS protocol. Default: false")
2425
@Comment("If you connect from the Internet, you may need to turn on this option")
2526
private boolean useHttps = false;
27+
28+
@Comment("Mode determines how the current will change. Default: default_mode")
29+
private String mode = DefaultMode.NAME;
2630
}

src/main/java/me/daoge/daogelab/api/Connection.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
66
import lombok.Getter;
77
import lombok.Setter;
8-
import lombok.extern.slf4j.Slf4j;
98
import me.daoge.daogelab.DaogeLab;
109
import me.daoge.daogelab.utils.DgLabUtils;
1110
import org.allaymc.api.entity.interfaces.EntityPlayer;
@@ -24,7 +23,6 @@
2423
/**
2524
* @author daoge_cmd
2625
*/
27-
@Slf4j
2826
@Getter
2927
public class Connection {
3028

@@ -49,7 +47,7 @@ public Connection(Channel channel) {
4947
}
5048

5149
public void handle(String text) {
52-
log.debug("Received: {}", text);
50+
DaogeLab.INSTANCE.getPluginLogger().debug("Received: {}", text);
5351
DgLabMessage message;
5452
try {
5553
message = DaogeLab.GSON.fromJson(text, DgLabMessage.class);
@@ -79,6 +77,7 @@ public void handle(String text) {
7977
this.updateScoreboard();
8078
}
8179
}
80+
// NOTICE: We handle disconnection in DgLabHandlerAdapter
8281
}
8382
}
8483

@@ -94,7 +93,7 @@ public void sendMessage(DgLabMessage message) {
9493
}
9594

9695
public void sendMessage(String message) {
97-
log.debug("Sending: {}", message);
96+
DaogeLab.INSTANCE.getPluginLogger().debug("Sending: {}", message);
9897
channel.writeAndFlush(new TextWebSocketFrame(message));
9998
}
10099

src/main/java/me/daoge/daogelab/api/Strength.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,18 @@ public void clear() {
2424
this.aMaxStrength = 0;
2525
this.bMaxStrength = 0;
2626
}
27+
28+
public int getCurrentStrength(ChannelType channelType) {
29+
return switch (channelType) {
30+
case A -> aCurrentStrength;
31+
case B -> bCurrentStrength;
32+
};
33+
}
34+
35+
public int getMaxStrength(ChannelType channelType) {
36+
return switch (channelType) {
37+
case A -> aMaxStrength;
38+
case B -> bMaxStrength;
39+
};
40+
}
2741
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package me.daoge.daogelab.mode;
2+
3+
import me.daoge.daogelab.api.ChannelType;
4+
import me.daoge.daogelab.api.ConnectionManager;
5+
import me.daoge.daogelab.utils.DgLabUtils;
6+
import org.allaymc.api.entity.interfaces.EntityPlayer;
7+
import org.allaymc.api.eventbus.EventHandler;
8+
import org.allaymc.api.eventbus.event.entity.EntityDamageEvent;
9+
import org.allaymc.api.eventbus.event.entity.EntityDieEvent;
10+
11+
import java.util.concurrent.ThreadLocalRandom;
12+
13+
/**
14+
* @author daoge_cmd
15+
*/
16+
public class DefaultMode extends Mode {
17+
18+
public static final String NAME = "default_mode";
19+
20+
@Override
21+
public String getModeName() {
22+
return NAME;
23+
}
24+
25+
@EventHandler
26+
protected void onPlayerDamage(EntityDamageEvent event) {
27+
if (!(event.getEntity() instanceof EntityPlayer player)) {
28+
return;
29+
}
30+
31+
var connection = ConnectionManager.getByPlayer(player);
32+
if (connection == null) {
33+
return;
34+
}
35+
36+
var damage = event.getDamageContainer().getFinalDamage();
37+
if (player.getHealth() - damage < 1) {
38+
return;
39+
}
40+
41+
var maxHealth = player.getMaxHealth();
42+
var percentage = Math.min(1, damage * 3f / maxHealth);
43+
var aStrength = (int) (percentage * connection.getStrength().getMaxStrength(ChannelType.A));
44+
var bStrength = (int) (percentage * connection.getStrength().getMaxStrength(ChannelType.B));
45+
46+
connection.setStrength(ChannelType.A, aStrength);
47+
connection.setStrength(ChannelType.B, bStrength);
48+
49+
var freq = ThreadLocalRandom.current().nextInt(0, 30);
50+
var pulse = DgLabUtils.sinPulse(freq, 0, 100, 40);
51+
connection.clearPulse(ChannelType.A);
52+
connection.clearPulse(ChannelType.B);
53+
connection.addPulse(ChannelType.A, pulse);
54+
connection.addPulse(ChannelType.B, pulse);
55+
}
56+
57+
@EventHandler
58+
protected void onPlayerDeath(EntityDieEvent event) {
59+
if (!(event.getEntity() instanceof EntityPlayer player)) {
60+
return;
61+
}
62+
63+
var connection = ConnectionManager.getByPlayer(player);
64+
if (connection == null) {
65+
return;
66+
}
67+
68+
var strength = connection.getStrength();
69+
connection.addStrength(ChannelType.A, strength.getMaxStrength(ChannelType.A));
70+
connection.addStrength(ChannelType.B, strength.getMaxStrength(ChannelType.B));
71+
72+
var freq = ThreadLocalRandom.current().nextInt(0, 30);
73+
var pulse = DgLabUtils.smoothPulse(freq, 100, 120);
74+
connection.clearPulse(ChannelType.A);
75+
connection.clearPulse(ChannelType.B);
76+
connection.addPulse(ChannelType.A, pulse);
77+
connection.addPulse(ChannelType.B, pulse);
78+
}
79+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package me.daoge.daogelab.mode;
2+
3+
import org.allaymc.api.server.Server;
4+
5+
/**
6+
* @author daoge_cmd
7+
*/
8+
public abstract class Mode {
9+
public abstract String getModeName();
10+
11+
public void onEnable() {
12+
Server.getInstance().getEventBus().registerListener(this);
13+
}
14+
15+
public void onDisable() {
16+
Server.getInstance().getEventBus().unregisterListener(this);
17+
}
18+
}

src/main/java/me/daoge/daogelab/network/DgLabHandler.java

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
77
import io.netty.util.Attribute;
88
import io.netty.util.AttributeKey;
9-
import lombok.extern.slf4j.Slf4j;
9+
import me.daoge.daogelab.DaogeLab;
1010
import me.daoge.daogelab.api.Connection;
1111
import me.daoge.daogelab.api.ConnectionManager;
1212
import me.daoge.daogelab.api.DgLabMessage;
@@ -18,7 +18,6 @@
1818
/**
1919
* @author daoge_cmd
2020
*/
21-
@Slf4j
2221
public class DgLabHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
2322
@Override
2423
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
@@ -30,26 +29,26 @@ protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
3029

3130
@Override
3231
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
33-
if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {
34-
// 握手完成,在这里发送消息
35-
Connection connection = ConnectionManager.getByChannel(ctx.channel());
36-
UUID uuid = UUID.randomUUID();
37-
if (connection != null) {
38-
Attribute<String> attr = connection.getChannel().attr(AttributeKey.valueOf("clientId"));
39-
connection.setClientId(attr.get());
40-
connection.setTargetId(uuid.toString());
41-
connection.sendMessage(DgLabMessage.bind(uuid.toString(), "", "targetId"));
32+
if (!(evt instanceof WebSocketServerProtocolHandler.HandshakeComplete)) {
33+
super.userEventTriggered(ctx, evt);
34+
return;
35+
}
4236

43-
var player = Server.getInstance().getPlayerService().getPlayers().get(UUID.fromString(connection.getClientId()));
44-
if (player == null) {
45-
log.error("Player with uuid {} not found", connection.getClientId());
46-
return;
47-
}
37+
Connection connection = ConnectionManager.getByChannel(ctx.channel());
38+
UUID targetId = UUID.randomUUID();
39+
if (connection != null) {
40+
Attribute<String> attr = connection.getChannel().attr(AttributeKey.valueOf("clientId"));
41+
connection.setClientId(attr.get());
42+
connection.setTargetId(targetId.toString());
43+
connection.sendMessage(DgLabMessage.bind(targetId.toString(), "", "targetId"));
4844

49-
QRCodeUtils.clearQRCode(player);
45+
var player = Server.getInstance().getPlayerService().getPlayers().get(UUID.fromString(connection.getClientId()));
46+
if (player == null) {
47+
DaogeLab.INSTANCE.getPluginLogger().error("Player with uuid {} not found", connection.getClientId());
48+
return;
5049
}
51-
} else {
52-
super.userEventTriggered(ctx, evt);
50+
51+
QRCodeUtils.clearQRCode(player);
5352
}
5453
}
5554
}

src/main/java/me/daoge/daogelab/network/DgLabHandlerAdapter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import io.netty.channel.ChannelInboundHandlerAdapter;
55
import io.netty.handler.codec.http.FullHttpRequest;
66
import io.netty.util.AttributeKey;
7-
import lombok.extern.slf4j.Slf4j;
7+
import me.daoge.daogelab.DaogeLab;
88
import me.daoge.daogelab.api.Connection;
99
import me.daoge.daogelab.api.ConnectionManager;
1010
import me.daoge.daogelab.utils.QRCodeUtils;
@@ -13,7 +13,6 @@
1313
/**
1414
* @author daoge_cmd
1515
*/
16-
@Slf4j
1716
public class DgLabHandlerAdapter extends ChannelInboundHandlerAdapter {
1817
@Override
1918
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
@@ -32,15 +31,16 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
3231
public void channelActive(ChannelHandlerContext ctx) {
3332
Connection connection = new Connection(ctx.channel());
3433
ConnectionManager.CONNECTIONS.add(connection);
35-
log.info("new DgLab connected");
34+
DaogeLab.INSTANCE.getPluginLogger().info("DgLab client connected: {}", ctx.channel().remoteAddress());
3635
}
3736

3837
@Override
3938
public void channelInactive(ChannelHandlerContext ctx) {
4039
Connection connection = ConnectionManager.getByChannel(ctx.channel());
4140
if (connection != null) {
4241
ConnectionManager.CONNECTIONS.remove(connection);
43-
log.info("DgLab disconnected, clientId: {}", connection.getClientId());
42+
DaogeLab.INSTANCE.getPluginLogger().info("DgLab client disconnected: {}", connection.getChannel().remoteAddress());
43+
connection.getPlayer().sendTr(TextFormat.YELLOW + "%daogelab:disconnected");
4444

4545
QRCodeUtils.clearQRCode(connection.getPlayer());
4646
connection.getStrength().clear();

0 commit comments

Comments
 (0)