Skip to content

Commit

Permalink
添加:退出游戏检测 、与NPC对话 和 玩家发送指定信息检测3.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
liujiaqi7998 committed Sep 3, 2022
1 parent 871d60d commit ec253ec
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 39 deletions.
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,20 @@ appreciate it if you could help translate

### v1.0.0

* 实现基本的节点,可以实现命令调试。(适配 Grasscutters 1.2.3)
* 实现基本的节点,可以实现命令调试。
* 适配 Grasscutters 1.2.3

### v2.0.0

* 兼容最新版,优化细节,添加聊天触发和NPC对话触发监听器(未来再完善该功能)(适配 Grasscutters 1.2.3 dev-#735b48e 2022.9.2)
* 兼容最新版,
* 优化细节,添加聊天触发和NPC对话触发监听器(未来再完善该功能)
* 适配 Grasscutters 1.2.3 dev-#735b48e 2022.9.2

### v3.0.0

* 添加:退出游戏检测 、与NPC对话 和 玩家发送指定信息检测
* 适配 Grasscutters 1.3.0
* 请将Node-Red端插件更新到v0.0.4版本

### 使用方法

Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ sourceCompatibility = 17
targetCompatibility = 17

group 'top.cyqi.EasyGrasscutters'
version '2.0.0'
version '3.0.0'

repositories {
mavenCentral()
Expand Down
73 changes: 47 additions & 26 deletions src/main/java/top/cyqi/EasyGrasscutters/Event/ChatEvent.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package top.cyqi.EasyGrasscutters.Event;

import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.PlayerChatReqOuterClass;
import emu.grasscutter.net.proto.ChatInfoOuterClass;
import emu.grasscutter.net.proto.PrivateChatNotifyOuterClass;
import emu.grasscutter.server.event.game.SendPacketEvent;
import emu.grasscutter.utils.EventConsumer;
import org.json.JSONObject;
import top.cyqi.EasyGrasscutters.Event.content.ChatEvent_t;
import top.cyqi.EasyGrasscutters.websocket.WebSocketServer;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import static emu.grasscutter.Grasscutter.getLogger;

public class ChatEvent implements EventConsumer<SendPacketEvent> {

public static Map<String, ChatEvent_t> All_Chat = new HashMap<>();

@Override
public void consume(SendPacketEvent sendPacketEvent) {
Expand All @@ -20,29 +27,34 @@ public void consume(SendPacketEvent sendPacketEvent) {
// 确定是私聊数据包
//getLogger().info("玩家发送私聊数据包");
try {
PlayerChatReqOuterClass.PlayerChatReq chatInfo = PlayerChatReqOuterClass.PlayerChatReq.parseFrom(sendPacketEvent.getPacket().getData());

// 我不理解? 为什么hasChatInfo()返回的是false?
// 没办法只能 toString 了
/* > 7: {
7: 99
13: 1662120300
15: 666777
1946: "3"
}
*/
PrivateChatNotifyOuterClass.PrivateChatNotify privateChatNotify = PrivateChatNotifyOuterClass.PrivateChatNotify.parseFrom(sendPacketEvent.getPacket().getData());//解析数据包
if (!privateChatNotify.hasChatInfo()) {
//无效数据包
return;
}

//分割文本
// Integer ToUid = Integer.valueOf(resolveString(chatInfo.toString()," 7: "));
// Integer FromUid = Integer.valueOf(resolveString(chatInfo.toString()," 15: "));
// int star = chatInfo.toString().indexOf(" 1946: \"") + 9;
// int end = chatInfo.toString().indexOf("\"\n",star);
// String msg = chatInfo.toString().substring(star, end);

// 生成JSON
ChatInfoOuterClass.ChatInfo chatInfo = privateChatNotify.getChatInfo();//提取聊天数据
ChatInfoOuterClass.ChatInfo.ContentCase content = chatInfo.getContentCase();//获取聊天内容类型用于判断是文字还是表情
JSONObject json = new JSONObject();
json.put("type", "OnChat");
json.put("data", chatInfo.toString());
json.put("from", chatInfo.getUid());
json.put("to", chatInfo.getToUid());
if (content == ChatInfoOuterClass.ChatInfo.ContentCase.TEXT) {
json.put("msg_type", "TEXT");
json.put("data", chatInfo.getText());

for (String key : All_Chat.keySet()) {
ChatEvent_t ChatEvent_a = All_Chat.get(key);
if (ChatEvent_a.check(String.valueOf(chatInfo.getUid()), String.valueOf(chatInfo.getToUid()), chatInfo.getText())) {
All_Chat.remove(key);
}
}

} else if (content == ChatInfoOuterClass.ChatInfo.ContentCase.ICON) {
json.put("msg_type", "ICON");
json.put("data", chatInfo.getIcon());
}

WebSocketServer.ClientContextMap.keySet().stream().filter(ctx -> ctx.session.isOpen()).forEach(session -> session.send(json.toString()));


Expand All @@ -53,10 +65,19 @@ public void consume(SendPacketEvent sendPacketEvent) {
}
}

// 手撕数据包
public String resolveString(String str, String key) {
int star = str.indexOf(key) + key.length();
int end = str.indexOf("\n", star);
return str.substring(star, end);
public static void delete(String msg_id) {
for (String key : All_Chat.keySet()) {
ChatEvent_t ChatEvent_a = All_Chat.get(key);
if (ChatEvent_a.msg_id.equals(msg_id)) {
All_Chat.remove(key);
}

}
}

public static void add_ChatEvent(ChatEvent_t ChatEvent_a) {
String uuid = UUID.randomUUID().toString();
All_Chat.put(uuid, ChatEvent_a);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ public void consume(SendPacketEvent sendPacketEvent) {
NpcTalkReqOuterClass.NpcTalkReq talkInfo = NpcTalkReqOuterClass.NpcTalkReq.parseFrom(sendPacketEvent.getPacket().getData());
JSONObject json = new JSONObject();
json.put("type", "OnNpcTalk");
json.put("data", talkInfo.toString());
json.put("npc_id", talkInfo.getNpcEntityId());
json.put("TalkId", talkInfo.getTalkId());
json.put("data", true);
WebSocketServer.ClientContextMap.keySet().stream().filter(ctx -> ctx.session.isOpen()).forEach(session -> session.send(json.toString()));
} catch (Exception e) {
getLogger().error("NPC对话监听器解包错误:" + e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package top.cyqi.EasyGrasscutters.Event.content;

import io.javalin.websocket.WsMessageContext;
import org.json.JSONObject;

public class ChatEvent_t {
public String msg_id;
public WsMessageContext wsMessageContext;

public String player_uid;
public String player_to_uid;
public String msg_data;

public ChatEvent_t(String Msg_id, String player_uid, String player_to_uid, String msg_data, WsMessageContext wsMessageContext) {
if (Msg_id == null || wsMessageContext == null)
throw new RuntimeException("ChatEvent参数不能为空");
this.msg_id = Msg_id;
this.player_uid = player_uid;
this.player_to_uid = player_to_uid;
this.msg_data = msg_data;
this.wsMessageContext = wsMessageContext;
}

public boolean check(String player_uid, String player_to_uid, String msg_data) {
if (this.msg_data.equals(msg_data)) {
if (this.player_uid.equals(player_uid) || this.player_uid.equals("0")) {
//如果要是 player_to_uid 为0,则为与任何人聊天都有效触发
if (this.player_to_uid.equals(player_to_uid) || this.player_to_uid.equals("0")) {
JSONObject temp = new JSONObject();
temp.put("type", "OnChatMsg");
temp.put("msg_id", this.msg_id);
temp.put("data", true);
temp.put("player_uid", player_uid);
temp.put("to", player_to_uid);
wsMessageContext.send(temp.toString());
return true;
}
}
}
return false;
}
}
41 changes: 33 additions & 8 deletions src/main/java/top/cyqi/EasyGrasscutters/ServerUtils/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,8 @@
import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONObject;
import top.cyqi.EasyGrasscutters.Event.KillEntityEvent;
import top.cyqi.EasyGrasscutters.Event.PlayerExpEvent;
import top.cyqi.EasyGrasscutters.Event.PositionEvent;
import top.cyqi.EasyGrasscutters.Event.QuestEvent;
import top.cyqi.EasyGrasscutters.Event.content.KillEntity;
import top.cyqi.EasyGrasscutters.Event.content.PlayerExp_t;
import top.cyqi.EasyGrasscutters.Event.content.Quest_t;
import top.cyqi.EasyGrasscutters.Event.content.position_t;
import top.cyqi.EasyGrasscutters.Event.*;
import top.cyqi.EasyGrasscutters.Event.content.*;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -503,7 +497,38 @@ public static void DealMessage(@NotNull JSONObject object, WsMessageContext wsMe
send_error("设置玩家经验监听器出错:" + e.getMessage(), object, wsMessageContext);
}
}
case "OnChatMsg" -> {

try {
String msg_id = object.getString("msg_id");
try {
if (object.has("del")) {
ChatEvent.delete(msg_id);
return;
}
} catch (Exception e) {
send_error("删除玩家信息监听器出错:" + e.getMessage(), object, wsMessageContext);
}


String player_to_uid = "0";
if (object.has("to")) {
player_to_uid = object.getString("to");
}

if (player == null)
player_uid = "0";

String msg_data = object.getString("msg_data");
//创建监控实体对象
ChatEvent_t Chat_a = new ChatEvent_t(msg_id, player_uid, player_to_uid, msg_data, wsMessageContext);
//将该对象添加到监测表
ChatEvent.add_ChatEvent(Chat_a);
getLogger().info("[EasyGrasscutters] 添加玩家信息监听器:" + msg_data);
} catch (Exception e) {
send_error("设置玩家信息监听器出错:" + e.getMessage(), object, wsMessageContext);
}
}

}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "EasyGrasscutters",
"description": "割草机 Node-RED 连接插件",
"version": "2.0.0",
"version": "3.0.0",
"author": [
"666Qi"
],
Expand Down

0 comments on commit ec253ec

Please sign in to comment.