mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-03-26 01:23:11 +01:00
Merge branch 'development' into api
# Conflicts: # src/main/java/emu/grasscutter/plugin/api/ServerHook.java
This commit is contained in:
@@ -55,9 +55,14 @@ public final class DispatchServer {
|
||||
this.initRegion();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public HttpServer getServer() {
|
||||
return server;
|
||||
}
|
||||
|
||||
public HttpServer getHttpServer() {
|
||||
return server;
|
||||
}
|
||||
|
||||
public InetSocketAddress getAddress() {
|
||||
return address;
|
||||
@@ -126,10 +131,10 @@ public final class DispatchServer {
|
||||
servers.add(server);
|
||||
|
||||
RegionInfo serverRegion = regionQuery.getRegionInfo().toBuilder()
|
||||
.setIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty()
|
||||
.setGateserverIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty()
|
||||
? Grasscutter.getConfig().getGameServerOptions().Ip
|
||||
: Grasscutter.getConfig().getGameServerOptions().PublicIp))
|
||||
.setPort(Grasscutter.getConfig().getGameServerOptions().PublicPort != 0
|
||||
.setGateserverPort(Grasscutter.getConfig().getGameServerOptions().PublicPort != 0
|
||||
? Grasscutter.getConfig().getGameServerOptions().PublicPort
|
||||
: Grasscutter.getConfig().getGameServerOptions().Port)
|
||||
.setSecretKey(ByteString
|
||||
@@ -169,8 +174,8 @@ public final class DispatchServer {
|
||||
servers.add(server);
|
||||
|
||||
RegionInfo serverRegion = regionQuery.getRegionInfo().toBuilder()
|
||||
.setIp(regionInfo.Ip)
|
||||
.setPort(regionInfo.Port)
|
||||
.setGateserverIp(regionInfo.Ip)
|
||||
.setGateserverPort(regionInfo.Port)
|
||||
.setSecretKey(ByteString
|
||||
.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin")))
|
||||
.build();
|
||||
@@ -181,7 +186,7 @@ public final class DispatchServer {
|
||||
}
|
||||
|
||||
QueryRegionListHttpRsp regionList = QueryRegionListHttpRsp.newBuilder()
|
||||
.addAllServers(servers)
|
||||
.addAllRegionList(servers)
|
||||
.setClientSecretKey(rl.getClientSecretKey())
|
||||
.setClientCustomConfigEncrypted(rl.getClientCustomConfigEncrypted())
|
||||
.setEnableLoginPc(true)
|
||||
@@ -203,56 +208,65 @@ public final class DispatchServer {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private KeyManagerFactory createKeyManagerFactory(File keystore, String password) throws Exception {
|
||||
char[] pass = password.toCharArray();
|
||||
KeyManagerFactory kmf = null;
|
||||
|
||||
try (FileInputStream fis = new FileInputStream(keystore)) {
|
||||
|
||||
KeyStore ks = KeyStore.getInstance("PKCS12");
|
||||
ks.load(fis, pass);
|
||||
|
||||
kmf = KeyManagerFactory.getInstance("SunX509");
|
||||
kmf.init(ks, pass);
|
||||
} catch (Exception e) {
|
||||
throw e;
|
||||
}
|
||||
|
||||
return kmf;
|
||||
}
|
||||
|
||||
public void start() throws Exception {
|
||||
if (Grasscutter.getConfig().getDispatchOptions().UseSSL) {
|
||||
HttpsServer httpsServer = HttpsServer.create(getAddress(), 0);
|
||||
// Keystore
|
||||
SSLContext sslContext = SSLContext.getInstance("TLS");
|
||||
try (FileInputStream fis = new FileInputStream(Grasscutter.getConfig().getDispatchOptions().KeystorePath)) {
|
||||
char[] keystorePassword = Grasscutter.getConfig().getDispatchOptions().KeystorePassword.toCharArray();
|
||||
KeyManagerFactory _kmf;
|
||||
KeyManagerFactory kmf = null;
|
||||
File keystoreFile = new File(Grasscutter.getConfig().getDispatchOptions().KeystorePath);
|
||||
|
||||
if (keystoreFile.exists()) {
|
||||
try {
|
||||
KeyStore ks = KeyStore.getInstance("PKCS12");
|
||||
ks.load(fis, keystorePassword);
|
||||
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
|
||||
_kmf = kmf;
|
||||
kmf.init(ks, keystorePassword);
|
||||
} catch (Exception originalEx) {
|
||||
kmf = createKeyManagerFactory(keystoreFile, Grasscutter.getConfig().getDispatchOptions().KeystorePassword);
|
||||
} catch (Exception e) {
|
||||
Grasscutter.getLogger().warn("[Dispatch] Unable to load keystore. Trying default keystore password...");
|
||||
|
||||
try {
|
||||
// try to initialize kmf with the default password
|
||||
char[] defaultPassword = "123456".toCharArray();
|
||||
|
||||
Grasscutter.getLogger()
|
||||
.warn("[Dispatch] Unable to load keystore. Trying default keystore password...");
|
||||
KeyStore ks = KeyStore.getInstance("PKCS12");
|
||||
ks.load(fis, defaultPassword);
|
||||
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
|
||||
kmf.init(ks, defaultPassword);
|
||||
_kmf = kmf;
|
||||
|
||||
kmf = createKeyManagerFactory(keystoreFile, "123456");
|
||||
Grasscutter.getLogger().warn(
|
||||
"[Dispatch] The default keystore password was loaded successfully. Please consider setting the password in config.json.");
|
||||
} catch (Exception ignored) {
|
||||
"[Dispatch] The default keystore password was loaded successfully. Please consider setting the password to 123456 in config.json.");
|
||||
} catch (Exception e2) {
|
||||
Grasscutter.getLogger().warn("[Dispatch] Error while loading keystore!");
|
||||
|
||||
// don't care about the exception for the "123456" default password attempt
|
||||
originalEx.printStackTrace();
|
||||
throw originalEx;
|
||||
e2.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
sslContext.init(_kmf.getKeyManagers(), null, null);
|
||||
|
||||
httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
|
||||
server = httpsServer;
|
||||
} catch (BindException ignored) {
|
||||
Grasscutter.getLogger().error("Unable to bind to port: " + getAddress().getPort() + " (HTTPS)");
|
||||
server = this.safelyCreateServer(this.getAddress());
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
if (kmf == null) {
|
||||
Grasscutter.getLogger().warn("[Dispatch] No SSL cert found! Falling back to HTTP server.");
|
||||
Grasscutter.getConfig().getDispatchOptions().UseSSL = false;
|
||||
server = this.safelyCreateServer(this.getAddress());
|
||||
}
|
||||
|
||||
HttpsServer httpsServer = null;
|
||||
|
||||
try {
|
||||
httpsServer = HttpsServer.create(getAddress(), 0);
|
||||
sslContext.init(kmf.getKeyManagers(), null, null);
|
||||
httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
|
||||
server = httpsServer;
|
||||
} catch (BindException e) {
|
||||
Grasscutter.getLogger().error("Unable to bind to port: " + getAddress().getPort() + " (HTTPS)");
|
||||
}
|
||||
} else {
|
||||
server = this.safelyCreateServer(this.getAddress());
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
package emu.grasscutter.server.event.game;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.server.event.Cancellable;
|
||||
import emu.grasscutter.server.event.ServerEvent;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
public final class SendPacketEvent extends ServerEvent implements Cancellable {
|
||||
private final GameSession gameSession;
|
||||
private GenshinPacket packet;
|
||||
private BasePacket packet;
|
||||
|
||||
public SendPacketEvent(GameSession gameSession, GenshinPacket packet) {
|
||||
public SendPacketEvent(GameSession gameSession, BasePacket packet) {
|
||||
super(Type.GAME);
|
||||
|
||||
this.gameSession = gameSession;
|
||||
@@ -20,11 +20,11 @@ public final class SendPacketEvent extends ServerEvent implements Cancellable {
|
||||
return this.gameSession;
|
||||
}
|
||||
|
||||
public void setPacket(GenshinPacket packet) {
|
||||
public void setPacket(BasePacket packet) {
|
||||
this.packet = packet;
|
||||
}
|
||||
|
||||
public GenshinPacket getPacket() {
|
||||
public BasePacket getPacket() {
|
||||
return this.packet;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,36 +1,38 @@
|
||||
package emu.grasscutter.server.game;
|
||||
|
||||
import emu.grasscutter.GameConstants;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.command.CommandMap;
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.Account;
|
||||
import emu.grasscutter.game.drop.DropManager;
|
||||
import emu.grasscutter.game.dungeons.DungeonManager;
|
||||
import emu.grasscutter.game.gacha.GachaManager;
|
||||
import emu.grasscutter.game.managers.ChatManager;
|
||||
import emu.grasscutter.game.managers.InventoryManager;
|
||||
import emu.grasscutter.game.managers.MultiplayerManager;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.shop.ShopManager;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
import emu.grasscutter.netty.KcpServer;
|
||||
import emu.grasscutter.server.event.ServerEvent;
|
||||
import emu.grasscutter.server.event.game.ServerTickEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStartEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStopEvent;
|
||||
import emu.grasscutter.task.TaskMap;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import emu.grasscutter.GenshinConstants;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.command.CommandMap;
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.Account;
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.game.World;
|
||||
import emu.grasscutter.game.dungeons.DungeonManager;
|
||||
import emu.grasscutter.game.gacha.GachaManager;
|
||||
import emu.grasscutter.game.managers.ChatManager;
|
||||
import emu.grasscutter.game.managers.InventoryManager;
|
||||
import emu.grasscutter.game.managers.MultiplayerManager;
|
||||
import emu.grasscutter.game.shop.ShopManager;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
import emu.grasscutter.netty.MihoyoKcpServer;
|
||||
import emu.grasscutter.server.event.ServerEvent;
|
||||
import emu.grasscutter.server.event.game.ServerTickEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStartEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStopEvent;
|
||||
|
||||
public final class GameServer extends MihoyoKcpServer {
|
||||
public final class GameServer extends KcpServer {
|
||||
private final InetSocketAddress address;
|
||||
private final GameServerPacketHandler packetHandler;
|
||||
|
||||
private final Map<Integer, GenshinPlayer> players;
|
||||
private final Map<Integer, Player> players;
|
||||
private final Set<World> worlds;
|
||||
|
||||
private final ChatManager chatManager;
|
||||
@@ -40,6 +42,8 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
private final MultiplayerManager multiplayerManager;
|
||||
private final DungeonManager dungeonManager;
|
||||
private final CommandMap commandMap;
|
||||
private final TaskMap taskMap;
|
||||
private final DropManager dropManager;
|
||||
|
||||
public GameServer(InetSocketAddress address) {
|
||||
super(address);
|
||||
@@ -57,6 +61,8 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
this.multiplayerManager = new MultiplayerManager(this);
|
||||
this.dungeonManager = new DungeonManager(this);
|
||||
this.commandMap = new CommandMap(true);
|
||||
this.taskMap = new TaskMap(true);
|
||||
this.dropManager = new DropManager(this);
|
||||
|
||||
// Schedule game loop.
|
||||
Timer gameLoop = new Timer();
|
||||
@@ -79,7 +85,7 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
return packetHandler;
|
||||
}
|
||||
|
||||
public Map<Integer, GenshinPlayer> getPlayers() {
|
||||
public Map<Integer, Player> getPlayers() {
|
||||
return players;
|
||||
}
|
||||
|
||||
@@ -106,6 +112,10 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
public MultiplayerManager getMultiplayerManager() {
|
||||
return multiplayerManager;
|
||||
}
|
||||
|
||||
public DropManager getDropManager() {
|
||||
return dropManager;
|
||||
}
|
||||
|
||||
public DungeonManager getDungeonManager() {
|
||||
return dungeonManager;
|
||||
@@ -114,23 +124,27 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
public CommandMap getCommandMap() {
|
||||
return this.commandMap;
|
||||
}
|
||||
|
||||
public TaskMap getTaskMap() {
|
||||
return this.taskMap;
|
||||
}
|
||||
|
||||
public void registerPlayer(GenshinPlayer player) {
|
||||
public void registerPlayer(Player player) {
|
||||
getPlayers().put(player.getUid(), player);
|
||||
}
|
||||
|
||||
public GenshinPlayer getPlayerByUid(int id) {
|
||||
public Player getPlayerByUid(int id) {
|
||||
return this.getPlayerByUid(id, false);
|
||||
}
|
||||
|
||||
public GenshinPlayer getPlayerByUid(int id, boolean allowOfflinePlayers) {
|
||||
public Player getPlayerByUid(int id, boolean allowOfflinePlayers) {
|
||||
// Console check
|
||||
if (id == GenshinConstants.SERVER_CONSOLE_UID) {
|
||||
if (id == GameConstants.SERVER_CONSOLE_UID) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get from online players
|
||||
GenshinPlayer player = this.getPlayers().get(id);
|
||||
Player player = this.getPlayers().get(id);
|
||||
|
||||
if (!allowOfflinePlayers) {
|
||||
return player;
|
||||
@@ -146,7 +160,7 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
|
||||
public SocialDetail.Builder getSocialDetailByUid(int id) {
|
||||
// Get from online players
|
||||
GenshinPlayer player = this.getPlayerByUid(id, true);
|
||||
Player player = this.getPlayerByUid(id, true);
|
||||
|
||||
if (player == null) {
|
||||
return null;
|
||||
@@ -156,7 +170,7 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
}
|
||||
|
||||
public Account getAccountByName(String username) {
|
||||
Optional<GenshinPlayer> playerOpt = getPlayers().values().stream().filter(player -> player.getAccount().getUsername().equals(username)).findFirst();
|
||||
Optional<Player> playerOpt = getPlayers().values().stream().filter(player -> player.getAccount().getUsername().equals(username)).findFirst();
|
||||
if (playerOpt.isPresent()) {
|
||||
return playerOpt.get().getAccount();
|
||||
}
|
||||
@@ -197,10 +211,10 @@ public final class GameServer extends MihoyoKcpServer {
|
||||
ServerStopEvent event = new ServerStopEvent(ServerEvent.Type.GAME, OffsetDateTime.now()); event.call();
|
||||
|
||||
// Kick and save all players
|
||||
List<GenshinPlayer> list = new ArrayList<>(this.getPlayers().size());
|
||||
List<Player> list = new ArrayList<>(this.getPlayers().size());
|
||||
list.addAll(this.getPlayers().values());
|
||||
|
||||
for (GenshinPlayer player : list) {
|
||||
for (Player player : list) {
|
||||
player.getSession().close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.game;
|
||||
|
||||
import emu.grasscutter.netty.MihoyoKcpServerInitializer;
|
||||
import emu.grasscutter.netty.KcpServerInitializer;
|
||||
import io.jpower.kcp.netty.UkcpChannel;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
|
||||
public class GameServerInitializer extends MihoyoKcpServerInitializer {
|
||||
public class GameServerInitializer extends KcpServerInitializer {
|
||||
private GameServer server;
|
||||
|
||||
public GameServerInitializer(GameServer server) {
|
||||
|
||||
@@ -89,7 +89,7 @@ public class GameServerPacketHandler {
|
||||
|
||||
// Log unhandled packets
|
||||
if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) {
|
||||
//Grasscutter.getLogger().info("Unhandled packet (" + opcode + "): " + PacketOpcodesUtil.getOpcodeName(opcode));
|
||||
Grasscutter.getLogger().info("Unhandled packet (" + opcode + "): " + emu.grasscutter.net.packet.PacketOpcodesUtil.getOpcodeName(opcode));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,13 +3,16 @@ package emu.grasscutter.server.game;
|
||||
import java.io.File;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.game.Account;
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodesUtil;
|
||||
import emu.grasscutter.netty.MihoyoKcpChannel;
|
||||
import emu.grasscutter.netty.KcpChannel;
|
||||
import emu.grasscutter.server.event.game.SendPacketEvent;
|
||||
import emu.grasscutter.utils.Crypto;
|
||||
import emu.grasscutter.utils.FileUtils;
|
||||
@@ -18,11 +21,11 @@ import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
|
||||
public class GameSession extends MihoyoKcpChannel {
|
||||
public class GameSession extends KcpChannel {
|
||||
private GameServer server;
|
||||
|
||||
private Account account;
|
||||
private GenshinPlayer player;
|
||||
private Player player;
|
||||
|
||||
private boolean useSecretKey;
|
||||
private SessionState state;
|
||||
@@ -64,11 +67,11 @@ public class GameSession extends MihoyoKcpChannel {
|
||||
return this.getAccount().getId();
|
||||
}
|
||||
|
||||
public GenshinPlayer getPlayer() {
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public synchronized void setPlayer(GenshinPlayer player) {
|
||||
public synchronized void setPlayer(Player player) {
|
||||
this.player = player;
|
||||
this.player.setSession(this);
|
||||
this.player.setAccount(this.getAccount());
|
||||
@@ -141,46 +144,48 @@ public class GameSession extends MihoyoKcpChannel {
|
||||
|
||||
byte[] packet = FileUtils.read(p);
|
||||
|
||||
GenshinPacket genshinPacket = new GenshinPacket(opcode);
|
||||
genshinPacket.setData(packet);
|
||||
BasePacket basePacket = new BasePacket(opcode);
|
||||
basePacket.setData(packet);
|
||||
|
||||
// Log
|
||||
logPacket(genshinPacket.getOpcode());
|
||||
|
||||
send(genshinPacket);
|
||||
send(basePacket);
|
||||
}
|
||||
|
||||
public void send(GenshinPacket genshinPacket) {
|
||||
public void send(BasePacket packet) {
|
||||
// Test
|
||||
if (genshinPacket.getOpcode() <= 0) {
|
||||
if (packet.getOpcode() <= 0) {
|
||||
Grasscutter.getLogger().warn("Tried to send packet with missing cmd id!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Header
|
||||
if (genshinPacket.shouldBuildHeader()) {
|
||||
genshinPacket.buildHeader(this.getNextClientSequence());
|
||||
if (packet.shouldBuildHeader()) {
|
||||
packet.buildHeader(this.getNextClientSequence());
|
||||
}
|
||||
|
||||
// Log
|
||||
if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) {
|
||||
logPacket(genshinPacket);
|
||||
logPacket(packet);
|
||||
}
|
||||
|
||||
// Invoke event.
|
||||
SendPacketEvent event = new SendPacketEvent(this, genshinPacket); event.call();
|
||||
SendPacketEvent event = new SendPacketEvent(this, packet); event.call();
|
||||
if(!event.isCanceled()) // If event is not cancelled, continue.
|
||||
this.send(event.getPacket().build());
|
||||
}
|
||||
|
||||
private void logPacket(int opcode) {
|
||||
//Grasscutter.getLogger().info("SEND: " + PacketOpcodesUtil.getOpcodeName(opcode));
|
||||
//System.out.println(Utils.bytesToHex(genshinPacket.getData()));
|
||||
}
|
||||
|
||||
private void logPacket(GenshinPacket genshinPacket) {
|
||||
Grasscutter.getLogger().info("SEND: " + PacketOpcodesUtil.getOpcodeName(genshinPacket.getOpcode()) + " (" + genshinPacket.getOpcode() + ")");
|
||||
System.out.println(Utils.bytesToHex(genshinPacket.getData()));
|
||||
private static final Set<Integer> loopPacket = Set.of(
|
||||
PacketOpcodes.PingReq,
|
||||
PacketOpcodes.PingRsp,
|
||||
PacketOpcodes.WorldPlayerRTTNotify,
|
||||
PacketOpcodes.UnionCmdNotify,
|
||||
PacketOpcodes.QueryPathReq
|
||||
);
|
||||
|
||||
private void logPacket(BasePacket packet) {
|
||||
if (!loopPacket.contains(packet.getOpcode())) {
|
||||
Grasscutter.getLogger().info("SEND: " + PacketOpcodesUtil.getOpcodeName(packet.getOpcode()) + " (" + packet.getOpcode() + ")");
|
||||
System.out.println(Utils.bytesToHex(packet.getData()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -226,8 +231,10 @@ public class GameSession extends MihoyoKcpChannel {
|
||||
|
||||
// Log packet
|
||||
if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) {
|
||||
Grasscutter.getLogger().info("RECV: " + PacketOpcodesUtil.getOpcodeName(opcode) + " (" + opcode + ")");
|
||||
System.out.println(Utils.bytesToHex(payload));
|
||||
if (!loopPacket.contains(opcode)) {
|
||||
Grasscutter.getLogger().info("RECV: " + PacketOpcodesUtil.getOpcodeName(opcode) + " (" + opcode + ")");
|
||||
System.out.println(Utils.bytesToHex(payload));
|
||||
}
|
||||
}
|
||||
|
||||
// Handle
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SitReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketSitRsp;
|
||||
import emu.grasscutter.utils.Position;
|
||||
|
||||
@Opcodes(PacketOpcodes.SitReq)
|
||||
public class HandleSitReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
SitReqOuterClass.SitReq req = SitReqOuterClass.SitReq.parseFrom(payload);
|
||||
|
||||
float x = req.getPosition().getX();
|
||||
float y = req.getPosition().getY();
|
||||
float z = req.getPosition().getZ();
|
||||
|
||||
session.send(new PacketSitRsp(req.getChairId(), new Position(x, y, z), session.getPlayer().getTeamManager().getCurrentAvatarEntity().getId()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.data.GenshinData;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.def.RewardData;
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.game.inventory.GenshinItem;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
@@ -27,14 +27,14 @@ public class HandlerAvatarFetterLevelRewardReq extends PacketHandler {
|
||||
} else {
|
||||
long avatarGuid = req.getAvatarGuid();
|
||||
|
||||
GenshinAvatar avatar = session
|
||||
Avatar avatar = session
|
||||
.getPlayer()
|
||||
.getAvatars()
|
||||
.getAvatarByGuid(avatarGuid);
|
||||
|
||||
int rewardId = avatar.getNameCardRewardId();
|
||||
|
||||
RewardData card = GenshinData.getRewardDataMap().get(rewardId);
|
||||
RewardData card = GameData.getRewardDataMap().get(rewardId);
|
||||
int cardId = card.getRewardItemList().get(0).getItemId();
|
||||
|
||||
if (session.getPlayer().getNameCardList().contains(cardId)) {
|
||||
@@ -43,9 +43,8 @@ public class HandlerAvatarFetterLevelRewardReq extends PacketHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
GenshinItem item = new GenshinItem(cardId);
|
||||
session.getPlayer().getInventory().addItem(item);
|
||||
session.getPlayer().sendPacket(new PacketItemAddHintNotify(item, ActionReason.FetterLevelReward));
|
||||
GameItem item = new GameItem(cardId);
|
||||
session.getPlayer().getInventory().addItem(item, ActionReason.FetterLevelReward);
|
||||
session.getPlayer().sendPacket(new PacketUnlockNameCardNotify(cardId));
|
||||
session.send(new PacketAvatarFetterDataNotify(avatar));
|
||||
session.send(new PacketAvatarDataNotify(avatar.getPlayer()));
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.game.props.PlayerProperty;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.BuyGoodsReqOuterClass;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass;
|
||||
import emu.grasscutter.net.proto.ShopGoodsOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketBuyGoodsRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketStoreItemChangeNotify;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Optional;
|
||||
|
||||
@Opcodes(PacketOpcodes.BuyGoodsReq)
|
||||
public class HandlerBuyGoodsReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
BuyGoodsReqOuterClass.BuyGoodsReq buyGoodsReq = BuyGoodsReqOuterClass.BuyGoodsReq.parseFrom(payload);
|
||||
|
||||
for (ShopGoodsOuterClass.ShopGoods sg : buyGoodsReq.getGoodsListList()) {
|
||||
if (sg.getScoin() > 0 && session.getPlayer().getMora() < buyGoodsReq.getBoughtNum() * sg.getScoin()) {
|
||||
return;
|
||||
}
|
||||
if (sg.getHcoin() > 0 && session.getPlayer().getPrimogems() < buyGoodsReq.getBoughtNum() * sg.getHcoin()) {
|
||||
return;
|
||||
}
|
||||
if (sg.getMcoin() > 0 && session.getPlayer().getProperty(PlayerProperty.PROP_PLAYER_MCOIN) < buyGoodsReq.getBoughtNum() * sg.getMcoin()) {
|
||||
return;
|
||||
}
|
||||
|
||||
HashMap<GameItem, Integer> itemsCache = new HashMap<>();
|
||||
for (ItemParamOuterClass.ItemParam p : sg.getCostItemListList()) {
|
||||
Optional<GameItem> invItem = session.getPlayer().getInventory().getItems().values().stream().filter(x -> x.getItemId() == p.getItemId()).findFirst();
|
||||
if (invItem.isEmpty() || invItem.get().getCount() < p.getCount())
|
||||
return;
|
||||
itemsCache.put(invItem.get(), p.getCount() * buyGoodsReq.getBoughtNum());
|
||||
}
|
||||
|
||||
session.getPlayer().setMora(session.getPlayer().getMora() - buyGoodsReq.getBoughtNum() * sg.getScoin());
|
||||
session.getPlayer().setPrimogems(session.getPlayer().getPrimogems() - buyGoodsReq.getBoughtNum() * sg.getHcoin());
|
||||
session.getPlayer().setProperty(PlayerProperty.PROP_PLAYER_MCOIN, session.getPlayer().getProperty(PlayerProperty.PROP_PLAYER_MCOIN) - buyGoodsReq.getBoughtNum() * sg.getMcoin());
|
||||
|
||||
if (!itemsCache.isEmpty()) {
|
||||
for (GameItem gi : itemsCache.keySet()) {
|
||||
session.getPlayer().getInventory().removeItem(gi, itemsCache.get(gi));
|
||||
}
|
||||
itemsCache.clear();
|
||||
}
|
||||
|
||||
session.getPlayer().addShopLimit(sg.getGoodsId(), buyGoodsReq.getBoughtNum());
|
||||
GameItem item = new GameItem(GameData.getItemDataMap().get(sg.getGoodsItem().getItemId()));
|
||||
item.setCount(buyGoodsReq.getBoughtNum() * sg.getGoodsItem().getCount());
|
||||
session.getPlayer().getInventory().addItem(item, ActionReason.Shop, true); // fix: not notify when got virtual item from shop
|
||||
session.send(new PacketBuyGoodsRsp(buyGoodsReq.getShopType(), session.getPlayer().getGoodsLimitNum(sg.getGoodsId()), sg));
|
||||
}
|
||||
|
||||
session.getPlayer().save();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.mail.Mail;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ChangeMailStarNotifyOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketMailChangeNotify;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Opcodes(PacketOpcodes.ChangeMailStarNotify)
|
||||
public class HandlerChangeMailStarNotify extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
ChangeMailStarNotifyOuterClass.ChangeMailStarNotify req = ChangeMailStarNotifyOuterClass.ChangeMailStarNotify.parseFrom(payload);
|
||||
|
||||
List<Mail> updatedMail = new ArrayList<>();
|
||||
|
||||
for (int mailId : req.getMailIdListList()) {
|
||||
Mail message = session.getPlayer().getMail(mailId);
|
||||
|
||||
message.importance = req.getIsStar() == true ? 1 : 0;
|
||||
|
||||
session.getPlayer().replaceMailByIndex(mailId, message);
|
||||
updatedMail.add(message);
|
||||
}
|
||||
|
||||
session.send(new PacketMailChangeNotify(session.getPlayer(), updatedMail));
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.GenshinEntity;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.CombatInvocationsNotifyOuterClass.CombatInvocationsNotify;
|
||||
@@ -19,15 +19,15 @@ public class HandlerCombatInvocationsNotify extends PacketHandler {
|
||||
|
||||
for (CombatInvokeEntry entry : notif.getInvokeListList()) {
|
||||
switch (entry.getArgumentType()) {
|
||||
case CombatEvtBeingHit:
|
||||
case COMBAT_EVT_BEING_HIT:
|
||||
// Handle damage
|
||||
EvtBeingHitInfo hitInfo = EvtBeingHitInfo.parseFrom(entry.getCombatData());
|
||||
session.getPlayer().getScene().handleAttack(hitInfo.getAttackResult());
|
||||
break;
|
||||
case EntityMove:
|
||||
case ENTITY_MOVE:
|
||||
// Handle movement
|
||||
EntityMoveInfo moveInfo = EntityMoveInfo.parseFrom(entry.getCombatData());
|
||||
GenshinEntity entity = session.getPlayer().getScene().getEntityById(moveInfo.getEntityId());
|
||||
GameEntity entity = session.getPlayer().getScene().getEntityById(moveInfo.getEntityId());
|
||||
if (entity != null) {
|
||||
entity.getPosition().set(moveInfo.getMotionInfo().getPos());
|
||||
entity.getRotation().set(moveInfo.getMotionInfo().getRot());
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.CombineReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
@Opcodes(PacketOpcodes.CombineReq)
|
||||
public class HandlerCombineReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
|
||||
CombineReqOuterClass.CombineReq req = CombineReqOuterClass.CombineReq.parseFrom(payload);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DelMailReqOuterClass;
|
||||
import emu.grasscutter.net.proto.DeleteFriendReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketDelMailRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.DelMailReq)
|
||||
public class HandlerDelMailReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
DelMailReqOuterClass.DelMailReq req = DelMailReqOuterClass.DelMailReq.parseFrom(payload);
|
||||
|
||||
session.send(new PacketDelMailRsp(session.getPlayer(), req.getMailIdListList()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer.SceneLoadState;
|
||||
import emu.grasscutter.game.player.Player.SceneLoadState;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
|
||||
@@ -8,7 +8,7 @@ import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketEvtAvatarSitDownNotify;
|
||||
|
||||
@Opcodes(PacketOpcodes.EvtAvatarSitDownNotify)
|
||||
public class HandleEvtAvatarSitDownNotify extends PacketHandler {
|
||||
public class HandlerEvtAvatarSitDownNotify extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
@@ -0,0 +1,21 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.proto.GetAllMailReqOuterClass;
|
||||
import emu.grasscutter.net.proto.GetPlayerTokenReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketGetAllMailRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketGetGachaInfoRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.GetAllMailReq)
|
||||
public class HandlerGetAllMailReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
GetAllMailReqOuterClass.GetAllMailReq req = GetAllMailReqOuterClass.GetAllMailReq.parseFrom(payload);
|
||||
session.send(new PacketGetAllMailRsp(session.getPlayer(), req.getIsGiftMail()));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetMailItemReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketGetMailItemRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.GetMailItemReq)
|
||||
public class HandlerGetMailItemReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
GetMailItemReqOuterClass.GetMailItemReq req = GetMailItemReqOuterClass.GetMailItemReq.parseFrom(payload);
|
||||
session.send(new PacketGetMailItemRsp(session.getPlayer(), req.getMailIdListList()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
@@ -11,7 +11,7 @@ public class HandlerGetPlayerBlacklistReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
session.send(new GenshinPacket(PacketOpcodes.GetPlayerBlacklistRsp).buildHeader(3));
|
||||
session.send(new BasePacket(PacketOpcodes.GetPlayerBlacklistRsp).buildHeader(3));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetShopReqOuterClass.GetShopReq;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketGetShopRsp;
|
||||
|
||||
@@ -12,8 +12,7 @@ public class HandlerGetShopReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
GetShopReq req = GetShopReq.parseFrom(payload);
|
||||
|
||||
// TODO
|
||||
session.send(new PacketGetShopRsp(req.getShopType()));
|
||||
|
||||
session.send(new PacketGetShopRsp(session.getPlayer(), req.getShopType()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.game.World;
|
||||
import emu.grasscutter.game.props.EnterReason;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
|
||||
@@ -32,7 +32,7 @@ public class HandlerMarkMapReq extends PacketHandler {
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
MarkMapReq req = MarkMapReq.parseFrom(payload);
|
||||
|
||||
if (req.getOp() != Operation.Add) {
|
||||
if (req.getOp() != MarkMapReq.Operation.ADD) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.inventory.GenshinItem;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq;
|
||||
|
||||
@@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.recv;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerGetForceQuitBanInfoRsp;
|
||||
|
||||
@@ -14,10 +15,10 @@ public class HandlerPlayerGetForceQuitBanInfoReq extends PacketHandler {
|
||||
|
||||
if (session.getServer().getMultiplayerManager().leaveCoop(session.getPlayer())) {
|
||||
// Success
|
||||
session.send(new PacketPlayerGetForceQuitBanInfoRsp(0));
|
||||
session.send(new PacketPlayerGetForceQuitBanInfoRsp(RetcodeOuterClass.Retcode.RET_SUCC_VALUE));
|
||||
} else {
|
||||
// Fail
|
||||
session.send(new PacketPlayerGetForceQuitBanInfoRsp(1));
|
||||
session.send(new PacketPlayerGetForceQuitBanInfoRsp(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlayerLoginReqOuterClass.PlayerLoginReq;
|
||||
@@ -30,12 +30,12 @@ public class HandlerPlayerLoginReq extends PacketHandler {
|
||||
}
|
||||
|
||||
// Load character from db
|
||||
GenshinPlayer player = DatabaseHelper.getPlayerById(session.getAccount().getPlayerUid());
|
||||
Player player = DatabaseHelper.getPlayerById(session.getAccount().getPlayerUid());
|
||||
|
||||
if (player == null) {
|
||||
// Send packets
|
||||
session.setState(SessionState.PICKING_CHARACTER);
|
||||
session.send(new GenshinPacket(PacketOpcodes.DoSetPlayerBornDataNotify));
|
||||
session.send(new BasePacket(PacketOpcodes.DoSetPlayerBornDataNotify));
|
||||
} else {
|
||||
// Set character
|
||||
session.setPlayer(player);
|
||||
|
||||
@@ -19,8 +19,6 @@ public class HandlerPrivateChatReq extends PacketHandler {
|
||||
} else if (content == PrivateChatReq.ContentCase.ICON) {
|
||||
session.getServer().getChatManager().sendPrivateMessage(session.getPlayer(), req.getTargetUid(), req.getIcon());
|
||||
}
|
||||
|
||||
//session.send(new GenshinPacket(PacketOpcodes.PrivateChatRsp)); // Unused by server
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.mail.Mail;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetAllMailReqOuterClass;
|
||||
import emu.grasscutter.net.proto.ReadMailNotifyOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketMailChangeNotify;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Opcodes(PacketOpcodes.ReadMailNotify)
|
||||
public class HandlerReadMailNotify extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
ReadMailNotifyOuterClass.ReadMailNotify req = ReadMailNotifyOuterClass.ReadMailNotify.parseFrom(payload);
|
||||
|
||||
List<Mail> updatedMail = new ArrayList<>();
|
||||
|
||||
for (int mailId : req.getMailIdListList()) {
|
||||
Mail message = session.getPlayer().getMail(mailId);
|
||||
|
||||
message.isRead = true;
|
||||
|
||||
session.getPlayer().replaceMailByIndex(mailId, message);
|
||||
updatedMail.add(message);
|
||||
}
|
||||
|
||||
session.send(new PacketMailChangeNotify(session.getPlayer(), updatedMail));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityAvatar;
|
||||
import emu.grasscutter.game.entity.EntityMonster;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.game.props.LifeState;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SceneEntityDrownReqOuterClass.SceneEntityDrownReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketSceneEntityDrownRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.SceneEntityDrownReq)
|
||||
public class HandlerSceneEntityDrownReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
SceneEntityDrownReq req = SceneEntityDrownReq.parseFrom(payload);
|
||||
|
||||
GameEntity entity = session.getPlayer().getScene().getEntityById(req.getEntityId());
|
||||
|
||||
if (entity == null || !(entity instanceof EntityMonster || entity instanceof EntityAvatar)) {
|
||||
return;
|
||||
}
|
||||
|
||||
entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, 0);
|
||||
|
||||
//TODO: make a list somewhere of all entities to remove per tick rather than one by one
|
||||
session.getPlayer().getScene().killEntity(entity, 0);
|
||||
session.getPlayer().getScene().broadcastPacket(new PacketSceneEntityDrownRsp(req.getEntityId()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer.SceneLoadState;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player.SceneLoadState;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
@@ -31,7 +31,7 @@ public class HandlerSceneInitFinishReq extends PacketHandler {
|
||||
session.send(new PacketWorldPlayerInfoNotify(session.getPlayer().getWorld()));
|
||||
session.send(new PacketWorldDataNotify(session.getPlayer().getWorld()));
|
||||
session.send(new PacketSceneUnlockInfoNotify());
|
||||
session.send(new GenshinPacket(PacketOpcodes.SceneForceUnlockNotify));
|
||||
session.send(new BasePacket(PacketOpcodes.SceneForceUnlockNotify));
|
||||
session.send(new PacketHostPlayerNotify(session.getPlayer().getWorld()));
|
||||
|
||||
session.send(new PacketSceneTimeNotify(session.getPlayer()));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.data.GenshinData;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.custom.ScenePointEntry;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
@@ -19,7 +19,7 @@ public class HandlerSceneTransToPointReq extends PacketHandler {
|
||||
SceneTransToPointReq req = SceneTransToPointReq.parseFrom(payload);
|
||||
|
||||
String code = req.getSceneId() + "_" + req.getPointId();
|
||||
ScenePointEntry scenePointEntry = GenshinData.getScenePointEntries().get(code);
|
||||
ScenePointEntry scenePointEntry = GameData.getScenePointEntries().get(code);
|
||||
|
||||
if (scenePointEntry != null) {
|
||||
float x = scenePointEntry.getPointData().getTranPos().getX();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify;
|
||||
@@ -20,7 +20,7 @@ public class HandlerSetEntityClientDataNotify extends PacketHandler {
|
||||
// Make sure packet is a valid proto before replaying it to the other players
|
||||
SetEntityClientDataNotify notif = SetEntityClientDataNotify.parseFrom(payload);
|
||||
|
||||
GenshinPacket packet = new GenshinPacket(PacketOpcodes.SetEntityClientDataNotify, true);
|
||||
BasePacket packet = new BasePacket(PacketOpcodes.SetEntityClientDataNotify, true);
|
||||
packet.setData(notif);
|
||||
|
||||
session.getPlayer().getScene().broadcastPacketToOthers(session.getPlayer(), packet);
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.GenshinConstants;
|
||||
import emu.grasscutter.GameConstants;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.GenshinData;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SetPlayerBornDataReqOuterClass.SetPlayerBornDataReq;
|
||||
@@ -24,9 +24,9 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler {
|
||||
// Sanity checks
|
||||
int avatarId = req.getAvatarId();
|
||||
int startingSkillDepot = 0;
|
||||
if (avatarId == GenshinConstants.MAIN_CHARACTER_MALE) {
|
||||
if (avatarId == GameConstants.MAIN_CHARACTER_MALE) {
|
||||
startingSkillDepot = 504;
|
||||
} else if (avatarId == GenshinConstants.MAIN_CHARACTER_FEMALE) {
|
||||
} else if (avatarId == GameConstants.MAIN_CHARACTER_FEMALE) {
|
||||
startingSkillDepot = 704;
|
||||
} else {
|
||||
return;
|
||||
@@ -38,7 +38,7 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler {
|
||||
}
|
||||
|
||||
// Create character
|
||||
GenshinPlayer player = new GenshinPlayer(session);
|
||||
Player player = new Player(session);
|
||||
player.setNickname(nickname);
|
||||
|
||||
try {
|
||||
@@ -47,8 +47,8 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler {
|
||||
|
||||
// Create avatar
|
||||
if (player.getAvatars().getAvatarCount() == 0) {
|
||||
GenshinAvatar mainCharacter = new GenshinAvatar(avatarId);
|
||||
mainCharacter.setSkillDepot(GenshinData.getAvatarSkillDepotDataMap().get(startingSkillDepot));
|
||||
Avatar mainCharacter = new Avatar(avatarId);
|
||||
mainCharacter.setSkillDepot(GameData.getAvatarSkillDepotDataMap().get(startingSkillDepot));
|
||||
player.addAvatar(mainCharacter);
|
||||
player.setMainCharacterId(avatarId);
|
||||
player.setHeadImage(avatarId);
|
||||
@@ -68,7 +68,7 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler {
|
||||
session.setState(SessionState.ACTIVE);
|
||||
|
||||
// Born resp packet
|
||||
session.send(new GenshinPacket(PacketOpcodes.SetPlayerBornDataRsp));
|
||||
session.send(new BasePacket(PacketOpcodes.SetPlayerBornDataRsp));
|
||||
} catch (Exception e) {
|
||||
Grasscutter.getLogger().error("Error creating player object: ", e);
|
||||
session.close();
|
||||
|
||||
@@ -5,9 +5,9 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.GenshinData;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.common.RewardItemData;
|
||||
import emu.grasscutter.game.inventory.GenshinItem;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
@@ -24,15 +24,15 @@ public class HandlerTakePlayerLevelRewardReq extends PacketHandler {
|
||||
TakePlayerLevelRewardReq req = TakePlayerLevelRewardReq.parseFrom(payload);
|
||||
|
||||
int level = req.getLevel();
|
||||
int rewardId = GenshinData.getPlayerLevelDataMap().get(level).getRewardId();
|
||||
int rewardId = GameData.getPlayerLevelDataMap().get(level).getRewardId();
|
||||
|
||||
if (rewardId != 0) {
|
||||
List<RewardItemData> rewardItems = GenshinData.getRewardDataMap().get(rewardId).getRewardItemList();
|
||||
List<GenshinItem> items = new LinkedList<>();
|
||||
List<RewardItemData> rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList();
|
||||
List<GameItem> items = new LinkedList<>();
|
||||
for (RewardItemData rewardItem : rewardItems) {
|
||||
if (rewardItem != null) {
|
||||
if (rewardItem.getItemId() != 0) {
|
||||
items.add(new GenshinItem(rewardItem.getItemId(), rewardItem.getItemCount()));
|
||||
items.add(new GameItem(rewardItem.getItemId(), rewardItem.getItemCount()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.inventory.GenshinItem;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.UseItemReqOuterClass.UseItemReq;
|
||||
@@ -15,7 +15,7 @@ public class HandlerUseItemReq extends PacketHandler {
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
UseItemReq req = UseItemReq.parseFrom(payload);
|
||||
|
||||
GenshinItem useItem = session.getServer().getInventoryManager().useItem(session.getPlayer(), req.getTargetGuid(), req.getGuid(), req.getCount());
|
||||
GameItem useItem = session.getServer().getInventoryManager().useItem(session.getPlayer(), req.getTargetGuid(), req.getGuid(), req.getCount());
|
||||
if (useItem != null) {
|
||||
session.send(new PacketUseItemRsp(req.getTargetGuid(), useItem));
|
||||
} else {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
|
||||
public class Packet extends GenshinPacket {
|
||||
public class Packet extends BasePacket {
|
||||
|
||||
public Packet() {
|
||||
super(PacketOpcodes.NONE);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AbilityChangeNotifyOuterClass.AbilityChangeNotify;
|
||||
|
||||
public class PacketAbilityChangeNotify extends GenshinPacket {
|
||||
public class PacketAbilityChangeNotify extends BasePacket {
|
||||
|
||||
public PacketAbilityChangeNotify(EntityAvatar entity) {
|
||||
super(PacketOpcodes.AbilityChangeNotify, true);
|
||||
|
||||
@@ -2,12 +2,12 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AbilityInvocationsNotifyOuterClass.AbilityInvocationsNotify;
|
||||
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
|
||||
|
||||
public class PacketAbilityInvocationsNotify extends GenshinPacket {
|
||||
public class PacketAbilityInvocationsNotify extends BasePacket {
|
||||
|
||||
public PacketAbilityInvocationsNotify(AbilityInvokeEntry entry) {
|
||||
super(PacketOpcodes.AbilityInvocationsNotify, true);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.friends.Friendship;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AskAddFriendNotifyOuterClass.AskAddFriendNotify;
|
||||
|
||||
public class PacketAskAddFriendNotify extends GenshinPacket {
|
||||
public class PacketAskAddFriendNotify extends BasePacket {
|
||||
|
||||
public PacketAskAddFriendNotify(Friendship friendship) {
|
||||
super(PacketOpcodes.AskAddFriendNotify);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AskAddFriendRspOuterClass.AskAddFriendRsp;
|
||||
|
||||
public class PacketAskAddFriendRsp extends GenshinPacket {
|
||||
public class PacketAskAddFriendRsp extends BasePacket {
|
||||
|
||||
public PacketAskAddFriendRsp(int targetUid) {
|
||||
super(PacketOpcodes.AskAddFriendRsp);
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarAddNotifyOuterClass.AvatarAddNotify;
|
||||
|
||||
public class PacketAvatarAddNotify extends GenshinPacket {
|
||||
public class PacketAvatarAddNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarAddNotify(GenshinAvatar avatar, boolean addedToTeam) {
|
||||
public PacketAvatarAddNotify(Avatar avatar, boolean addedToTeam) {
|
||||
super(PacketOpcodes.AvatarAddNotify);
|
||||
|
||||
AvatarAddNotify proto = AvatarAddNotify.newBuilder()
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarChangeCostumeNotifyOuterClass.AvatarChangeCostumeNotify;
|
||||
|
||||
public class PacketAvatarChangeCostumeNotify extends GenshinPacket {
|
||||
public class PacketAvatarChangeCostumeNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarChangeCostumeNotify(EntityAvatar entity) {
|
||||
super(PacketOpcodes.AvatarChangeCostumeNotify);
|
||||
|
||||
AvatarChangeCostumeNotify proto = AvatarChangeCostumeNotify.newBuilder()
|
||||
.setEntity(entity.toProto())
|
||||
.setEntityInfo(entity.toProto())
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarChangeCostumeRspOuterClass.AvatarChangeCostumeRsp;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketAvatarChangeCostumeRsp extends GenshinPacket {
|
||||
public class PacketAvatarChangeCostumeRsp extends BasePacket {
|
||||
|
||||
public PacketAvatarChangeCostumeRsp(long avatarGuid, int costumeId) {
|
||||
super(PacketOpcodes.AvatarChangeCostumeRsp);
|
||||
@@ -21,7 +22,7 @@ public class PacketAvatarChangeCostumeRsp extends GenshinPacket {
|
||||
super(PacketOpcodes.AvatarChangeCostumeRsp);
|
||||
|
||||
AvatarChangeCostumeRsp proto = AvatarChangeCostumeRsp.newBuilder()
|
||||
.setRetcode(1)
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
|
||||
@@ -2,17 +2,17 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.game.TeamInfo;
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.player.TeamInfo;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarDataNotifyOuterClass.AvatarDataNotify;
|
||||
import emu.grasscutter.net.proto.AvatarTeamOuterClass.AvatarTeam;
|
||||
|
||||
public class PacketAvatarDataNotify extends GenshinPacket {
|
||||
public class PacketAvatarDataNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarDataNotify(GenshinPlayer player) {
|
||||
public PacketAvatarDataNotify(Player player) {
|
||||
super(PacketOpcodes.AvatarDataNotify, 2);
|
||||
|
||||
AvatarDataNotify.Builder proto = AvatarDataNotify.newBuilder()
|
||||
@@ -21,7 +21,7 @@ public class PacketAvatarDataNotify extends GenshinPacket {
|
||||
.addAllOwnedFlycloakList(player.getFlyCloakList())
|
||||
.addAllOwnedCostumeList(player.getCostumeList());
|
||||
|
||||
for (GenshinAvatar avatar : player.getAvatars()) {
|
||||
for (Avatar avatar : player.getAvatars()) {
|
||||
proto.addAvatarList(avatar.toProto());
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class PacketAvatarDataNotify extends GenshinPacket {
|
||||
.setTeamName(teamInfo.getName());
|
||||
|
||||
for (int i = 0; i < teamInfo.getAvatars().size(); i++) {
|
||||
GenshinAvatar avatar = player.getAvatars().getAvatarById(teamInfo.getAvatars().get(i));
|
||||
Avatar avatar = player.getAvatars().getAvatarById(teamInfo.getAvatars().get(i));
|
||||
avatarTeam.addAvatarGuidList(avatar.getGuid());
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarDieAnimationEndRspOuterClass.AvatarDieAnimationEndRsp;
|
||||
|
||||
public class PacketAvatarDieAnimationEndRsp extends GenshinPacket {
|
||||
public class PacketAvatarDieAnimationEndRsp extends BasePacket {
|
||||
|
||||
public PacketAvatarDieAnimationEndRsp(long dieGuid, int skillId) {
|
||||
super(PacketOpcodes.AvatarDieAnimationEndRsp);
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.inventory.EquipType;
|
||||
import emu.grasscutter.game.inventory.GenshinItem;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarEquipChangeNotifyOuterClass.AvatarEquipChangeNotify;
|
||||
|
||||
public class PacketAvatarEquipChangeNotify extends GenshinPacket {
|
||||
public class PacketAvatarEquipChangeNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarEquipChangeNotify(GenshinAvatar avatar, GenshinItem item) {
|
||||
public PacketAvatarEquipChangeNotify(Avatar avatar, GameItem item) {
|
||||
super(PacketOpcodes.AvatarEquipChangeNotify);
|
||||
|
||||
AvatarEquipChangeNotify.Builder proto = AvatarEquipChangeNotify.newBuilder()
|
||||
@@ -27,7 +27,7 @@ public class PacketAvatarEquipChangeNotify extends GenshinPacket {
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketAvatarEquipChangeNotify(GenshinAvatar avatar, EquipType slot) {
|
||||
public PacketAvatarEquipChangeNotify(Avatar avatar, EquipType slot) {
|
||||
super(PacketOpcodes.AvatarEquipChangeNotify);
|
||||
|
||||
AvatarEquipChangeNotify.Builder proto = AvatarEquipChangeNotify.newBuilder()
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.props.FetterState;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify;
|
||||
import emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo;
|
||||
import emu.grasscutter.net.proto.FetterDataOuterClass.FetterData;
|
||||
|
||||
public class PacketAvatarFetterDataNotify extends GenshinPacket {
|
||||
public class PacketAvatarFetterDataNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarFetterDataNotify(GenshinAvatar avatar) {
|
||||
public PacketAvatarFetterDataNotify(Avatar avatar) {
|
||||
super(PacketOpcodes.AvatarFetterDataNotify);
|
||||
|
||||
int fetterLevel = avatar.getFetterLevel();
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp;
|
||||
|
||||
public class PacketAvatarFetterLevelRewardRsp extends GenshinPacket {
|
||||
public class PacketAvatarFetterLevelRewardRsp extends BasePacket {
|
||||
|
||||
public PacketAvatarFetterLevelRewardRsp(long guid, int fetterLevel, int rewardId) {
|
||||
super(PacketOpcodes.AvatarFetterLevelRewardRsp);
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarFightPropNotifyOuterClass.AvatarFightPropNotify;
|
||||
|
||||
public class PacketAvatarFightPropNotify extends GenshinPacket {
|
||||
public class PacketAvatarFightPropNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarFightPropNotify(GenshinAvatar avatar) {
|
||||
public PacketAvatarFightPropNotify(Avatar avatar) {
|
||||
super(PacketOpcodes.AvatarFightPropNotify);
|
||||
|
||||
AvatarFightPropNotify proto = AvatarFightPropNotify.newBuilder()
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarFightPropUpdateNotifyOuterClass.AvatarFightPropUpdateNotify;
|
||||
|
||||
public class PacketAvatarFightPropUpdateNotify extends GenshinPacket {
|
||||
public class PacketAvatarFightPropUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarFightPropUpdateNotify(GenshinAvatar avatar, FightProperty prop) {
|
||||
public PacketAvatarFightPropUpdateNotify(Avatar avatar, FightProperty prop) {
|
||||
super(PacketOpcodes.AvatarFightPropUpdateNotify);
|
||||
|
||||
AvatarFightPropUpdateNotify proto = AvatarFightPropUpdateNotify.newBuilder()
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarFlycloakChangeNotifyOuterClass.AvatarFlycloakChangeNotify;
|
||||
|
||||
public class PacketAvatarFlycloakChangeNotify extends GenshinPacket {
|
||||
public class PacketAvatarFlycloakChangeNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarFlycloakChangeNotify(GenshinAvatar avatar) {
|
||||
public PacketAvatarFlycloakChangeNotify(Avatar avatar) {
|
||||
super(PacketOpcodes.AvatarFlycloakChangeNotify);
|
||||
|
||||
AvatarFlycloakChangeNotify proto = AvatarFlycloakChangeNotify.newBuilder()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarGainCostumeNotifyOuterClass.AvatarGainCostumeNotify;
|
||||
|
||||
public class PacketAvatarGainCostumeNotify extends GenshinPacket {
|
||||
public class PacketAvatarGainCostumeNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarGainCostumeNotify(int costumeId) {
|
||||
super(PacketOpcodes.AvatarGainCostumeNotify);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarGainFlycloakNotifyOuterClass.AvatarGainFlycloakNotify;
|
||||
|
||||
public class PacketAvatarGainFlycloakNotify extends GenshinPacket {
|
||||
public class PacketAvatarGainFlycloakNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarGainFlycloakNotify(int flycloak) {
|
||||
super(PacketOpcodes.AvatarGainFlycloakNotify);
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.game.props.LifeState;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarLifeStateChangeNotifyOuterClass.AvatarLifeStateChangeNotify;
|
||||
|
||||
public class PacketAvatarLifeStateChangeNotify extends GenshinPacket {
|
||||
public class PacketAvatarLifeStateChangeNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarLifeStateChangeNotify(GenshinAvatar avatar) {
|
||||
public PacketAvatarLifeStateChangeNotify(Avatar avatar) {
|
||||
super(PacketOpcodes.AvatarLifeStateChangeNotify);
|
||||
|
||||
AvatarLifeStateChangeNotify proto = AvatarLifeStateChangeNotify.newBuilder()
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarPromoteRspOuterClass.AvatarPromoteRsp;
|
||||
|
||||
public class PacketAvatarPromoteRsp extends GenshinPacket {
|
||||
public class PacketAvatarPromoteRsp extends BasePacket {
|
||||
|
||||
public PacketAvatarPromoteRsp(GenshinAvatar avatar) {
|
||||
public PacketAvatarPromoteRsp(Avatar avatar) {
|
||||
super(PacketOpcodes.AvatarPromoteRsp);
|
||||
|
||||
AvatarPromoteRsp proto = AvatarPromoteRsp.newBuilder()
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.props.PlayerProperty;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarPropNotifyOuterClass.AvatarPropNotify;
|
||||
|
||||
public class PacketAvatarPropNotify extends GenshinPacket {
|
||||
public PacketAvatarPropNotify(GenshinAvatar avatar) {
|
||||
public class PacketAvatarPropNotify extends BasePacket {
|
||||
public PacketAvatarPropNotify(Avatar avatar) {
|
||||
super(PacketOpcodes.AvatarPropNotify);
|
||||
|
||||
AvatarPropNotify proto = AvatarPropNotify.newBuilder()
|
||||
@@ -22,7 +22,7 @@ public class PacketAvatarPropNotify extends GenshinPacket {
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketAvatarPropNotify(GenshinAvatar avatar, PlayerProperty prop, int value) {
|
||||
public PacketAvatarPropNotify(Avatar avatar, PlayerProperty prop, int value) {
|
||||
super(PacketOpcodes.AvatarPropNotify);
|
||||
|
||||
AvatarPropNotify proto = AvatarPropNotify.newBuilder()
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarSkillChangeNotifyOuterClass.AvatarSkillChangeNotify;
|
||||
|
||||
public class PacketAvatarSkillChangeNotify extends GenshinPacket {
|
||||
public class PacketAvatarSkillChangeNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarSkillChangeNotify(GenshinAvatar avatar, int skillId, int oldLevel, int curLevel) {
|
||||
public PacketAvatarSkillChangeNotify(Avatar avatar, int skillId, int oldLevel, int curLevel) {
|
||||
super(PacketOpcodes.AvatarSkillChangeNotify);
|
||||
|
||||
AvatarSkillChangeNotify proto = AvatarSkillChangeNotify.newBuilder()
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarSkillUpgradeRspOuterClass.AvatarSkillUpgradeRsp;
|
||||
|
||||
public class PacketAvatarSkillUpgradeRsp extends GenshinPacket {
|
||||
public class PacketAvatarSkillUpgradeRsp extends BasePacket {
|
||||
|
||||
public PacketAvatarSkillUpgradeRsp(GenshinAvatar avatar, int skillId, int oldLevel, int newLevel) {
|
||||
public PacketAvatarSkillUpgradeRsp(Avatar avatar, int skillId, int oldLevel, int newLevel) {
|
||||
super(PacketOpcodes.AvatarSkillUpgradeRsp);
|
||||
|
||||
AvatarSkillUpgradeRsp proto = AvatarSkillUpgradeRsp.newBuilder()
|
||||
|
||||
@@ -2,17 +2,17 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.game.TeamInfo;
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.player.TeamInfo;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarTeamOuterClass.AvatarTeam;
|
||||
import emu.grasscutter.net.proto.AvatarTeamUpdateNotifyOuterClass.AvatarTeamUpdateNotify;
|
||||
|
||||
public class PacketAvatarTeamUpdateNotify extends GenshinPacket {
|
||||
public class PacketAvatarTeamUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarTeamUpdateNotify(GenshinPlayer player) {
|
||||
public PacketAvatarTeamUpdateNotify(Player player) {
|
||||
super(PacketOpcodes.AvatarTeamUpdateNotify);
|
||||
|
||||
AvatarTeamUpdateNotify.Builder proto = AvatarTeamUpdateNotify.newBuilder();
|
||||
@@ -23,7 +23,7 @@ public class PacketAvatarTeamUpdateNotify extends GenshinPacket {
|
||||
.setTeamName(teamInfo.getName());
|
||||
|
||||
for (int i = 0; i < teamInfo.getAvatars().size(); i++) {
|
||||
GenshinAvatar avatar = player.getAvatars().getAvatarById(teamInfo.getAvatars().get(i));
|
||||
Avatar avatar = player.getAvatars().getAvatarById(teamInfo.getAvatars().get(i));
|
||||
avatarTeam.addAvatarGuidList(avatar.getGuid());
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarUnlockTalentNotifyOuterClass.AvatarUnlockTalentNotify;
|
||||
|
||||
public class PacketAvatarUnlockTalentNotify extends GenshinPacket {
|
||||
public class PacketAvatarUnlockTalentNotify extends BasePacket {
|
||||
|
||||
public PacketAvatarUnlockTalentNotify(GenshinAvatar avatar, int talentId) {
|
||||
public PacketAvatarUnlockTalentNotify(Avatar avatar, int talentId) {
|
||||
super(PacketOpcodes.AvatarUnlockTalentNotify);
|
||||
|
||||
AvatarUnlockTalentNotify proto = AvatarUnlockTalentNotify.newBuilder()
|
||||
|
||||
@@ -2,14 +2,14 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import emu.grasscutter.game.avatar.GenshinAvatar;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.avatar.Avatar;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarUpgradeRspOuterClass.AvatarUpgradeRsp;
|
||||
|
||||
public class PacketAvatarUpgradeRsp extends GenshinPacket {
|
||||
public class PacketAvatarUpgradeRsp extends BasePacket {
|
||||
|
||||
public PacketAvatarUpgradeRsp(GenshinAvatar avatar, int oldLevel, Map<Integer, Float> oldFightPropMap) {
|
||||
public PacketAvatarUpgradeRsp(Avatar avatar, int oldLevel, Map<Integer, Float> oldFightPropMap) {
|
||||
super(PacketOpcodes.AvatarUpgradeRsp);
|
||||
|
||||
this.buildHeader(0);
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarWearFlycloakRspOuterClass.AvatarWearFlycloakRsp;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketAvatarWearFlycloakRsp extends GenshinPacket {
|
||||
public class PacketAvatarWearFlycloakRsp extends BasePacket {
|
||||
public PacketAvatarWearFlycloakRsp(long avatarGuid, int costumeId) {
|
||||
super(PacketOpcodes.AvatarWearFlycloakRsp);
|
||||
|
||||
@@ -20,7 +21,7 @@ public class PacketAvatarWearFlycloakRsp extends GenshinPacket {
|
||||
super(PacketOpcodes.AvatarWearFlycloakRsp);
|
||||
|
||||
AvatarWearFlycloakRsp proto = AvatarWearFlycloakRsp.newBuilder()
|
||||
.setRetcode(1)
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.BuyGoodsRspOuterClass;
|
||||
import emu.grasscutter.net.proto.ShopGoodsOuterClass;
|
||||
|
||||
public class PacketBuyGoodsRsp extends BasePacket {
|
||||
public PacketBuyGoodsRsp(int shopType, int boughtNum, ShopGoodsOuterClass.ShopGoods sg) {
|
||||
super(PacketOpcodes.BuyGoodsRsp);
|
||||
|
||||
BuyGoodsRspOuterClass.BuyGoodsRsp buyGoodsRsp = BuyGoodsRspOuterClass.BuyGoodsRsp.newBuilder()
|
||||
.setShopType(shopType)
|
||||
.setBoughtNum(boughtNum)
|
||||
.addGoodsList(ShopGoodsOuterClass.ShopGoods.newBuilder()
|
||||
.mergeFrom(sg)
|
||||
.setBoughtNum(boughtNum)
|
||||
).build();
|
||||
|
||||
this.setData(buyGoodsRsp);
|
||||
}
|
||||
}
|
||||
@@ -2,13 +2,13 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.packet.Retcode;
|
||||
import emu.grasscutter.net.proto.CalcWeaponUpgradeReturnItemsRspOuterClass.CalcWeaponUpgradeReturnItemsRsp;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketCalcWeaponUpgradeReturnItemsRsp extends GenshinPacket {
|
||||
public class PacketCalcWeaponUpgradeReturnItemsRsp extends BasePacket {
|
||||
|
||||
public PacketCalcWeaponUpgradeReturnItemsRsp(long itemGuid, List<ItemParam> returnItems) {
|
||||
super(PacketOpcodes.CalcWeaponUpgradeReturnItemsRsp);
|
||||
@@ -25,7 +25,7 @@ public class PacketCalcWeaponUpgradeReturnItemsRsp extends GenshinPacket {
|
||||
super(PacketOpcodes.CalcWeaponUpgradeReturnItemsRsp);
|
||||
|
||||
CalcWeaponUpgradeReturnItemsRsp proto = CalcWeaponUpgradeReturnItemsRsp.newBuilder()
|
||||
.setRetcode(Retcode.FAIL)
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.CardProductRewardNotifyOuterClass.CardProductRewardNotify;
|
||||
|
||||
public class PacketCardProductRewardNotify extends BasePacket {
|
||||
|
||||
public PacketCardProductRewardNotify(int remainsDay) {
|
||||
super(PacketOpcodes.CardProductRewardNotify);
|
||||
|
||||
CardProductRewardNotify proto = CardProductRewardNotify.newBuilder()
|
||||
.setProductId("ys_chn_blessofmoon_tier5")
|
||||
.setHcoin(90)
|
||||
.setRemainDays(remainsDay)
|
||||
.build();
|
||||
|
||||
// Hard code Product id keep cool 😎
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,17 +1,18 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ChangeAvatarRspOuterClass.ChangeAvatarRsp;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketChangeAvatarRsp extends GenshinPacket {
|
||||
public class PacketChangeAvatarRsp extends BasePacket {
|
||||
|
||||
public PacketChangeAvatarRsp(long guid) {
|
||||
super(PacketOpcodes.ChangeAvatarRsp);
|
||||
|
||||
ChangeAvatarRsp p = ChangeAvatarRsp.newBuilder()
|
||||
.setRetcode(0)
|
||||
.setCurrGuid(guid)
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
|
||||
.setCurGuid(guid)
|
||||
.build();
|
||||
|
||||
this.setData(p);
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.game.World;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ChangeGameTimeRspOuterClass.ChangeGameTimeRsp;
|
||||
|
||||
public class PacketChangeGameTimeRsp extends GenshinPacket {
|
||||
public class PacketChangeGameTimeRsp extends BasePacket {
|
||||
|
||||
public PacketChangeGameTimeRsp(GenshinPlayer player) {
|
||||
public PacketChangeGameTimeRsp(Player player) {
|
||||
super(PacketOpcodes.ChangeGameTimeRsp);
|
||||
|
||||
ChangeGameTimeRsp proto = ChangeGameTimeRsp.newBuilder()
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.game.TeamInfo;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.player.TeamInfo;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ChangeMpTeamAvatarRspOuterClass.ChangeMpTeamAvatarRsp;
|
||||
|
||||
public class PacketChangeMpTeamAvatarRsp extends GenshinPacket {
|
||||
public class PacketChangeMpTeamAvatarRsp extends BasePacket {
|
||||
|
||||
public PacketChangeMpTeamAvatarRsp(GenshinPlayer player, TeamInfo teamInfo) {
|
||||
public PacketChangeMpTeamAvatarRsp(Player player, TeamInfo teamInfo) {
|
||||
super(PacketOpcodes.ChangeMpTeamAvatarRsp);
|
||||
|
||||
ChangeMpTeamAvatarRsp.Builder proto = ChangeMpTeamAvatarRsp.newBuilder()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ChangeTeamNameRspOuterClass.ChangeTeamNameRsp;
|
||||
|
||||
public class PacketChangeTeamNameRsp extends GenshinPacket {
|
||||
public class PacketChangeTeamNameRsp extends BasePacket {
|
||||
|
||||
public PacketChangeTeamNameRsp(int teamId, String teamName) {
|
||||
super(PacketOpcodes.ChangeTeamNameRsp);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ChooseCurAvatarTeamRspOuterClass.ChooseCurAvatarTeamRsp;
|
||||
|
||||
public class PacketChooseCurAvatarTeamRsp extends GenshinPacket {
|
||||
public class PacketChooseCurAvatarTeamRsp extends BasePacket {
|
||||
|
||||
public PacketChooseCurAvatarTeamRsp(int teamId) {
|
||||
super(PacketOpcodes.ChooseCurAvatarTeamRsp);
|
||||
|
||||
@@ -2,12 +2,12 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
|
||||
import emu.grasscutter.net.proto.ClientAbilityInitFinishNotifyOuterClass.ClientAbilityInitFinishNotify;
|
||||
|
||||
public class PacketClientAbilityInitFinishNotify extends GenshinPacket {
|
||||
public class PacketClientAbilityInitFinishNotify extends BasePacket {
|
||||
|
||||
public PacketClientAbilityInitFinishNotify(List<AbilityInvokeEntry> entries) {
|
||||
super(PacketOpcodes.ClientAbilityInitFinishNotify, true);
|
||||
|
||||
@@ -2,12 +2,12 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.CombatInvocationsNotifyOuterClass.CombatInvocationsNotify;
|
||||
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
||||
|
||||
public class PacketCombatInvocationsNotify extends GenshinPacket {
|
||||
public class PacketCombatInvocationsNotify extends BasePacket {
|
||||
|
||||
public PacketCombatInvocationsNotify(CombatInvokeEntry entry) {
|
||||
super(PacketOpcodes.CombatInvocationsNotify, true);
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.CombineReqOuterClass;
|
||||
import emu.grasscutter.net.proto.CombineRspOuterClass;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketCombineRsp extends BasePacket {
|
||||
|
||||
public PacketCombineRsp() {
|
||||
super(PacketOpcodes.CombineRsp);
|
||||
|
||||
CombineRspOuterClass.CombineRsp proto = CombineRspOuterClass.CombineRsp.newBuilder()
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE).build();
|
||||
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketCombineRsp(int retcode) {
|
||||
super(PacketOpcodes.CombineRsp);
|
||||
|
||||
CombineRspOuterClass.CombineRsp proto = CombineRspOuterClass.CombineRsp.newBuilder()
|
||||
.setRetcode(retcode).build();
|
||||
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketCombineRsp(CombineReqOuterClass.CombineReq combineReq,
|
||||
Iterable<ItemParamOuterClass.ItemParam> costItemList,
|
||||
Iterable<ItemParamOuterClass.ItemParam> resultItemList,
|
||||
Iterable<ItemParamOuterClass.ItemParam> totalRandomItemList,
|
||||
Iterable<ItemParamOuterClass.ItemParam> totalReturnItemList,
|
||||
Iterable<ItemParamOuterClass.ItemParam> totalExtraItemList) {
|
||||
|
||||
super(PacketOpcodes.CombineRsp);
|
||||
|
||||
CombineRspOuterClass.CombineRsp proto = CombineRspOuterClass.CombineRsp.newBuilder()
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SUCC_VALUE)
|
||||
.setCombineId(combineReq.getCombineId())
|
||||
.setCombineCount(combineReq.getCombineCount())
|
||||
.setAvatarGuid(combineReq.getAvatarGuid())
|
||||
.addAllCostItemList(costItemList)
|
||||
.addAllResultItemList(resultItemList)
|
||||
.addAllTotalRandomItemList(totalRandomItemList)
|
||||
.addAllTotalReturnItemList(totalReturnItemList)
|
||||
.addAllTotalExtraItemList(totalExtraItemList)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DealAddFriendResultTypeOuterClass.DealAddFriendResultType;
|
||||
import emu.grasscutter.net.proto.DealAddFriendRspOuterClass.DealAddFriendRsp;
|
||||
|
||||
public class PacketDealAddFriendRsp extends GenshinPacket {
|
||||
public class PacketDealAddFriendRsp extends BasePacket {
|
||||
|
||||
public PacketDealAddFriendRsp(int targetUid, DealAddFriendResultType result) {
|
||||
super(PacketOpcodes.DealAddFriendRsp);
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DelMailRspOuterClass.DelMailRsp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PacketDelMailRsp extends BasePacket {
|
||||
|
||||
public PacketDelMailRsp(Player player, List<Integer> toDeleteIds) {
|
||||
super(PacketOpcodes.DelMailRsp);
|
||||
|
||||
DelMailRsp.Builder proto = DelMailRsp.newBuilder();
|
||||
|
||||
List<Integer> deletedIds = new ArrayList<>();
|
||||
|
||||
for(int mailId : toDeleteIds) {
|
||||
if(player.deleteMail(mailId)) {
|
||||
deletedIds.add(mailId);
|
||||
}
|
||||
}
|
||||
|
||||
this.setData(proto.build());
|
||||
player.getSession().send(new PacketMailChangeNotify(player, null, deletedIds));
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,11 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DelTeamEntityNotifyOuterClass.DelTeamEntityNotify;
|
||||
|
||||
public class PacketDelTeamEntityNotify extends GenshinPacket {
|
||||
public class PacketDelTeamEntityNotify extends BasePacket {
|
||||
|
||||
public PacketDelTeamEntityNotify(int sceneId, int teamEntityId) {
|
||||
super(PacketOpcodes.DelTeamEntityNotify);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DeleteFriendNotifyOuterClass.DeleteFriendNotify;
|
||||
|
||||
public class PacketDeleteFriendNotify extends GenshinPacket {
|
||||
public class PacketDeleteFriendNotify extends BasePacket {
|
||||
|
||||
public PacketDeleteFriendNotify(int targetUid) {
|
||||
super(PacketOpcodes.DeleteFriendNotify);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DeleteFriendRspOuterClass.DeleteFriendRsp;
|
||||
|
||||
public class PacketDeleteFriendRsp extends GenshinPacket {
|
||||
public class PacketDeleteFriendRsp extends BasePacket {
|
||||
|
||||
public PacketDeleteFriendRsp(int targetUid) {
|
||||
super(PacketOpcodes.DeleteFriendRsp);
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DestroyMaterialRspOuterClass.DestroyMaterialRsp;
|
||||
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
||||
|
||||
public class PacketDestroyMaterialRsp extends GenshinPacket {
|
||||
public class PacketDestroyMaterialRsp extends BasePacket {
|
||||
|
||||
public PacketDestroyMaterialRsp(Int2IntOpenHashMap returnMaterialMap) {
|
||||
super(PacketOpcodes.DestroyMaterialRsp);
|
||||
|
||||
@@ -3,12 +3,13 @@ package emu.grasscutter.server.packet.send;
|
||||
import java.util.List;
|
||||
|
||||
import emu.grasscutter.game.gacha.GachaBanner;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.DoGachaRspOuterClass.DoGachaRsp;
|
||||
import emu.grasscutter.net.proto.GachaItemOuterClass.GachaItem;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketDoGachaRsp extends GenshinPacket {
|
||||
public class PacketDoGachaRsp extends BasePacket {
|
||||
|
||||
public PacketDoGachaRsp(GachaBanner banner, List<GachaItem> list) {
|
||||
super(PacketOpcodes.DoGachaRsp);
|
||||
@@ -33,7 +34,7 @@ public class PacketDoGachaRsp extends GenshinPacket {
|
||||
super(PacketOpcodes.DoGachaRsp);
|
||||
|
||||
DoGachaRsp p = DoGachaRsp.newBuilder()
|
||||
.setRetcode(1)
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
|
||||
.build();
|
||||
|
||||
this.setData(p);
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EnterSceneDoneRspOuterClass.EnterSceneDoneRsp;
|
||||
|
||||
public class PacketEnterSceneDoneRsp extends GenshinPacket {
|
||||
public class PacketEnterSceneDoneRsp extends BasePacket {
|
||||
|
||||
public PacketEnterSceneDoneRsp(GenshinPlayer player) {
|
||||
public PacketEnterSceneDoneRsp(Player player) {
|
||||
super(PacketOpcodes.EnterSceneDoneRsp);
|
||||
|
||||
EnterSceneDoneRsp p = EnterSceneDoneRsp.newBuilder()
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EnterScenePeerNotifyOuterClass.EnterScenePeerNotify;
|
||||
|
||||
public class PacketEnterScenePeerNotify extends GenshinPacket {
|
||||
public class PacketEnterScenePeerNotify extends BasePacket {
|
||||
|
||||
public PacketEnterScenePeerNotify(GenshinPlayer player) {
|
||||
public PacketEnterScenePeerNotify(Player player) {
|
||||
super(PacketOpcodes.EnterScenePeerNotify);
|
||||
|
||||
EnterScenePeerNotify proto = EnterScenePeerNotify.newBuilder()
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EnterSceneReadyRspOuterClass.EnterSceneReadyRsp;
|
||||
|
||||
public class PacketEnterSceneReadyRsp extends GenshinPacket {
|
||||
public class PacketEnterSceneReadyRsp extends BasePacket {
|
||||
|
||||
public PacketEnterSceneReadyRsp(GenshinPlayer player) {
|
||||
public PacketEnterSceneReadyRsp(Player player) {
|
||||
super(PacketOpcodes.EnterSceneReadyRsp, 11);
|
||||
|
||||
EnterSceneReadyRsp p = EnterSceneReadyRsp.newBuilder()
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EnterWorldAreaReqOuterClass.EnterWorldAreaReq;
|
||||
import emu.grasscutter.net.proto.EnterWorldAreaRspOuterClass.EnterWorldAreaRsp;
|
||||
|
||||
public class PacketEnterWorldAreaRsp extends GenshinPacket {
|
||||
public class PacketEnterWorldAreaRsp extends BasePacket {
|
||||
|
||||
public PacketEnterWorldAreaRsp(int clientSequence, EnterWorldAreaReq enterWorld) {
|
||||
super(PacketOpcodes.EnterWorldAreaRsp, clientSequence);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AiSyncInfoOuterClass.AiSyncInfo;
|
||||
import emu.grasscutter.net.proto.EntityAiSyncNotifyOuterClass.EntityAiSyncNotify;
|
||||
|
||||
public class PacketEntityAiSyncNotify extends GenshinPacket {
|
||||
public class PacketEntityAiSyncNotify extends BasePacket {
|
||||
|
||||
public PacketEntityAiSyncNotify(EntityAiSyncNotify notify) {
|
||||
super(PacketOpcodes.EntityAiSyncNotify, true);
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.GenshinEntity;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EntityFightPropUpdateNotifyOuterClass.EntityFightPropUpdateNotify;
|
||||
|
||||
public class PacketEntityFightPropUpdateNotify extends GenshinPacket {
|
||||
public class PacketEntityFightPropUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketEntityFightPropUpdateNotify(GenshinEntity entity, FightProperty prop) {
|
||||
public PacketEntityFightPropUpdateNotify(GameEntity entity, FightProperty prop) {
|
||||
super(PacketOpcodes.EntityFightPropUpdateNotify);
|
||||
|
||||
EntityFightPropUpdateNotify proto = EntityFightPropUpdateNotify.newBuilder()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EvtAvatarSitDownNotifyOuterClass.EvtAvatarSitDownNotify;
|
||||
|
||||
public class PacketEvtAvatarSitDownNotify extends GenshinPacket {
|
||||
public class PacketEvtAvatarSitDownNotify extends BasePacket {
|
||||
|
||||
public PacketEvtAvatarSitDownNotify(EvtAvatarSitDownNotify notify) {
|
||||
super(PacketOpcodes.EvtAvatarSitDownNotify);
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GadgetInteractRspOuterClass.GadgetInteractRsp;
|
||||
import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketGadgetInteractRsp extends GenshinPacket {
|
||||
public class PacketGadgetInteractRsp extends BasePacket {
|
||||
public PacketGadgetInteractRsp(EntityGadget gadget, InteractType interact) {
|
||||
super(PacketOpcodes.GadgetInteractRsp);
|
||||
|
||||
@@ -23,7 +24,7 @@ public class PacketGadgetInteractRsp extends GenshinPacket {
|
||||
super(PacketOpcodes.GadgetInteractRsp);
|
||||
|
||||
GadgetInteractRsp proto = GadgetInteractRsp.newBuilder()
|
||||
.setRetcode(1)
|
||||
.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetActivityInfoRspOuterClass.GetActivityInfoRsp;
|
||||
|
||||
public class PacketGetActivityInfoRsp extends GenshinPacket {
|
||||
public class PacketGetActivityInfoRsp extends BasePacket {
|
||||
public PacketGetActivityInfoRsp() {
|
||||
super(PacketOpcodes.GetActivityInfoRsp);
|
||||
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.game.mail.Mail;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetAllMailRspOuterClass.GetAllMailRsp;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass;
|
||||
import emu.grasscutter.net.proto.MailDataOuterClass;
|
||||
import emu.grasscutter.net.proto.MailDataOuterClass.MailData;
|
||||
import emu.grasscutter.net.proto.MailItemOuterClass;
|
||||
import emu.grasscutter.net.proto.MailTextContentOuterClass.MailTextContent;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PacketGetAllMailRsp extends BasePacket {
|
||||
|
||||
public PacketGetAllMailRsp(Player player, boolean isGiftMail) {
|
||||
super(PacketOpcodes.GetAllMailRsp);
|
||||
GetAllMailRsp.Builder proto = GetAllMailRsp.newBuilder();
|
||||
|
||||
if (isGiftMail) {
|
||||
proto.setIsGiftMail(true);
|
||||
} else {
|
||||
proto.setIsGiftMail(false);
|
||||
|
||||
if (player.getAllMail().size() != 0) { // Make sure the player has mail
|
||||
List<MailData> mailDataList = new ArrayList<MailData>();
|
||||
|
||||
for (Mail message : player.getAllMail()) {
|
||||
if(message.stateValue == 1) { // Make sure it isn't a gift
|
||||
if (message.expireTime > (int) Instant.now().getEpochSecond()) { // Make sure the message isn't expired (The game won't show expired mail, but I don't want to send unnecessary information).
|
||||
if(mailDataList.size() <= 1000) { // Make sure that there isn't over 1000 messages in the mailbox. (idk what will happen if there is but the game probably won't like it.)
|
||||
MailTextContent.Builder mailTextContent = MailTextContent.newBuilder();
|
||||
mailTextContent.setTitle(message.mailContent.title);
|
||||
mailTextContent.setContent(message.mailContent.content);
|
||||
mailTextContent.setSender(message.mailContent.sender);
|
||||
|
||||
List<MailItemOuterClass.MailItem> mailItems = new ArrayList<>();
|
||||
|
||||
for (Mail.MailItem item : message.itemList) {
|
||||
MailItemOuterClass.MailItem.Builder mailItem = MailItemOuterClass.MailItem.newBuilder();
|
||||
ItemParamOuterClass.ItemParam.Builder itemParam = ItemParamOuterClass.ItemParam.newBuilder();
|
||||
itemParam.setItemId(item.itemId);
|
||||
itemParam.setCount(item.itemCount);
|
||||
mailItem.setItemParam(itemParam.build());
|
||||
|
||||
mailItems.add(mailItem.build());
|
||||
}
|
||||
|
||||
MailDataOuterClass.MailData.Builder mailData = MailDataOuterClass.MailData.newBuilder();
|
||||
mailData.setMailId(player.getMailId(message));
|
||||
mailData.setMailTextContent(mailTextContent.build());
|
||||
mailData.addAllItemList(mailItems);
|
||||
mailData.setSendTime((int) message.sendTime);
|
||||
mailData.setExpireTime((int) message.expireTime);
|
||||
mailData.setImportance(message.importance);
|
||||
mailData.setIsRead(message.isRead);
|
||||
mailData.setIsAttachmentGot(message.isAttachmentGot);
|
||||
mailData.setStateValue(1);
|
||||
|
||||
mailDataList.add(mailData.build());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
proto.addAllMailList(mailDataList);
|
||||
proto.setIsTruncated(mailDataList.size() <= 1000 ? false : true); // When enabled this will send a notification to the user telling them their inbox is full and they should delete old messages when opening the mailbox.
|
||||
}
|
||||
}
|
||||
this.setData(proto.build());
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetAllUnlockNameCardRspOuterClass.GetAllUnlockNameCardRsp;
|
||||
|
||||
public class PacketGetAllUnlockNameCardRsp extends GenshinPacket {
|
||||
public class PacketGetAllUnlockNameCardRsp extends BasePacket {
|
||||
|
||||
public PacketGetAllUnlockNameCardRsp(GenshinPlayer player) {
|
||||
public PacketGetAllUnlockNameCardRsp(Player player) {
|
||||
super(PacketOpcodes.GetAllUnlockNameCardRsp);
|
||||
|
||||
GetAllUnlockNameCardRsp proto = GetAllUnlockNameCardRsp.newBuilder()
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetAuthkeyRspOuterClass.GetAuthkeyRsp;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketGetAuthkeyRsp extends GenshinPacket {
|
||||
public class PacketGetAuthkeyRsp extends BasePacket {
|
||||
|
||||
public PacketGetAuthkeyRsp() {
|
||||
super(PacketOpcodes.GetAuthkeyRsp);
|
||||
|
||||
GetAuthkeyRsp proto = GetAuthkeyRsp.newBuilder().setRetcode(1).build();
|
||||
GetAuthkeyRsp proto = GetAuthkeyRsp.newBuilder().setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE).build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.gacha.GachaManager;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
|
||||
public class PacketGetGachaInfoRsp extends GenshinPacket {
|
||||
public class PacketGetGachaInfoRsp extends BasePacket {
|
||||
|
||||
public PacketGetGachaInfoRsp(GachaManager manager) {
|
||||
super(PacketOpcodes.GetGachaInfoRsp);
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.game.inventory.GameItem;
|
||||
import emu.grasscutter.game.mail.Mail;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.props.ActionReason;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EquipParamOuterClass;
|
||||
import emu.grasscutter.net.proto.GetMailItemRspOuterClass.GetMailItemRsp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class PacketGetMailItemRsp extends BasePacket {
|
||||
|
||||
public PacketGetMailItemRsp(Player player, List<Integer> mailList) {
|
||||
super(PacketOpcodes.GetMailItemRsp);
|
||||
|
||||
List<Mail> claimedMessages = new ArrayList<>();
|
||||
List<EquipParamOuterClass.EquipParam> claimedItems = new ArrayList<>();
|
||||
|
||||
GetMailItemRsp.Builder proto = GetMailItemRsp.newBuilder();
|
||||
|
||||
for (int mailId : mailList) {
|
||||
Mail message = player.getMail(mailId);
|
||||
|
||||
for(Mail.MailItem mailItem : message.itemList) {
|
||||
EquipParamOuterClass.EquipParam.Builder item = EquipParamOuterClass.EquipParam.newBuilder();
|
||||
int promoteLevel = 0;
|
||||
if (mailItem.itemLevel > 20) { // 20/40
|
||||
promoteLevel = 1;
|
||||
} else if (mailItem.itemLevel > 40) { // 40/50
|
||||
promoteLevel = 2;
|
||||
} else if (mailItem.itemLevel > 50) { // 50/60
|
||||
promoteLevel = 3;
|
||||
} else if (mailItem.itemLevel > 60) { // 60/70
|
||||
promoteLevel = 4;
|
||||
} else if (mailItem.itemLevel > 70) { // 70/80
|
||||
promoteLevel = 5;
|
||||
} else if (mailItem.itemLevel > 80) { // 80/90
|
||||
promoteLevel = 6;
|
||||
}
|
||||
|
||||
item.setItemId(mailItem.itemId);
|
||||
item.setItemNum(mailItem.itemCount);
|
||||
item.setItemLevel(mailItem.itemLevel);
|
||||
item.setPromoteLevel(promoteLevel);
|
||||
claimedItems.add(item.build());
|
||||
|
||||
GameItem gameItem = new GameItem(GameData.getItemDataMap().get(mailItem.itemId));
|
||||
gameItem.setCount(mailItem.itemCount);
|
||||
gameItem.setLevel(mailItem.itemLevel);
|
||||
gameItem.setPromoteLevel(promoteLevel);
|
||||
player.getInventory().addItem(gameItem, ActionReason.MailAttachment);
|
||||
}
|
||||
|
||||
message.isAttachmentGot = true;
|
||||
claimedMessages.add(message);
|
||||
|
||||
player.replaceMailByIndex(mailId, message);
|
||||
}
|
||||
|
||||
proto.addAllMailIdList(claimedMessages.stream().map(message -> player.getMailId(message)).collect(Collectors.toList()));
|
||||
proto.addAllItemList(claimedItems);
|
||||
|
||||
this.setData(proto.build());
|
||||
player.getSession().send(new PacketMailChangeNotify(player, claimedMessages)); // For some reason you have to also send the MailChangeNotify packet
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.game.friends.Friendship;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetPlayerAskFriendListRspOuterClass.GetPlayerAskFriendListRsp;
|
||||
|
||||
public class PacketGetPlayerAskFriendListRsp extends GenshinPacket {
|
||||
public class PacketGetPlayerAskFriendListRsp extends BasePacket {
|
||||
|
||||
public PacketGetPlayerAskFriendListRsp(GenshinPlayer player) {
|
||||
public PacketGetPlayerAskFriendListRsp(Player player) {
|
||||
super(PacketOpcodes.GetPlayerAskFriendListRsp);
|
||||
|
||||
GetPlayerAskFriendListRsp.Builder proto = GetPlayerAskFriendListRsp.newBuilder();
|
||||
|
||||
@@ -1,33 +1,34 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.GenshinConstants;
|
||||
import emu.grasscutter.game.GenshinPlayer;
|
||||
import emu.grasscutter.GameConstants;
|
||||
import emu.grasscutter.game.friends.Friendship;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.FriendBriefOuterClass.FriendBrief;
|
||||
import emu.grasscutter.net.proto.FriendOnlineStateOuterClass.FriendOnlineState;
|
||||
import emu.grasscutter.net.proto.GetPlayerFriendListRspOuterClass.GetPlayerFriendListRsp;
|
||||
import emu.grasscutter.net.proto.HeadImageOuterClass.HeadImage;
|
||||
import emu.grasscutter.net.proto.PlatformTypeOuterClass;
|
||||
|
||||
public class PacketGetPlayerFriendListRsp extends GenshinPacket {
|
||||
public class PacketGetPlayerFriendListRsp extends BasePacket {
|
||||
|
||||
public PacketGetPlayerFriendListRsp(GenshinPlayer player) {
|
||||
public PacketGetPlayerFriendListRsp(Player player) {
|
||||
super(PacketOpcodes.GetPlayerFriendListRsp);
|
||||
|
||||
FriendBrief serverFriend = FriendBrief.newBuilder()
|
||||
.setUid(GenshinConstants.SERVER_CONSOLE_UID)
|
||||
.setUid(GameConstants.SERVER_CONSOLE_UID)
|
||||
.setNickname("Server")
|
||||
.setLevel(1)
|
||||
.setAvatar(HeadImage.newBuilder().setAvatarId(GenshinConstants.MAIN_CHARACTER_FEMALE))
|
||||
.setAvatarId(HeadImage.newBuilder().setAvatarId(GameConstants.MAIN_CHARACTER_FEMALE).getAvatarId())
|
||||
.setWorldLevel(0)
|
||||
.setSignature("")
|
||||
.setLastActiveTime((int) (System.currentTimeMillis() / 1000f))
|
||||
.setNameCardId(210001)
|
||||
.setOnlineState(FriendOnlineState.FRIEND_ONLINE)
|
||||
.setParam(1)
|
||||
.setUnk1(1)
|
||||
.setUnk2(3)
|
||||
.setIsGameSource(true)
|
||||
.setPlatformType(PlatformTypeOuterClass.PlatformType.PC)
|
||||
.build();
|
||||
|
||||
GetPlayerFriendListRsp.Builder proto = GetPlayerFriendListRsp.newBuilder().addFriendList(serverFriend);
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetPlayerSocialDetailRspOuterClass.GetPlayerSocialDetailRsp;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
|
||||
public class PacketGetPlayerSocialDetailRsp extends GenshinPacket {
|
||||
public class PacketGetPlayerSocialDetailRsp extends BasePacket {
|
||||
|
||||
public PacketGetPlayerSocialDetailRsp(SocialDetail.Builder detail) {
|
||||
super(PacketOpcodes.GetPlayerSocialDetailRsp);
|
||||
@@ -15,7 +16,7 @@ public class PacketGetPlayerSocialDetailRsp extends GenshinPacket {
|
||||
if (detail != null) {
|
||||
proto.setDetailData(detail);
|
||||
} else {
|
||||
proto.setRetcode(1);
|
||||
proto.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE);
|
||||
}
|
||||
|
||||
this.setData(proto);
|
||||
|
||||
@@ -2,13 +2,13 @@ package emu.grasscutter.server.packet.send;
|
||||
|
||||
import com.google.protobuf.ByteString;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetPlayerTokenRspOuterClass.GetPlayerTokenRsp;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.utils.Crypto;
|
||||
|
||||
public class PacketGetPlayerTokenRsp extends GenshinPacket {
|
||||
public class PacketGetPlayerTokenRsp extends BasePacket {
|
||||
|
||||
public PacketGetPlayerTokenRsp(GameSession session, boolean doesPlayerExist) {
|
||||
super(PacketOpcodes.GetPlayerTokenRsp, true);
|
||||
@@ -16,18 +16,18 @@ public class PacketGetPlayerTokenRsp extends GenshinPacket {
|
||||
this.setUseDispatchKey(true);
|
||||
|
||||
GetPlayerTokenRsp p = GetPlayerTokenRsp.newBuilder()
|
||||
.setPlayerUid(session.getAccount().getPlayerUid())
|
||||
.setAccountToken(session.getAccount().getToken())
|
||||
.setUid(session.getAccount().getPlayerUid())
|
||||
.setToken(session.getAccount().getToken())
|
||||
.setAccountType(1)
|
||||
.setIsProficientPlayer(doesPlayerExist) // Not sure where this goes
|
||||
.setSecretKey(Crypto.ENCRYPT_SEED)
|
||||
.setSecretKeyBuffer(ByteString.copyFrom(Crypto.ENCRYPT_SEED_BUFFER))
|
||||
.setSecretKeySeed(Crypto.ENCRYPT_SEED)
|
||||
.setSecurityCmdBuffer(ByteString.copyFrom(Crypto.ENCRYPT_SEED_BUFFER))
|
||||
.setPlatformType(3)
|
||||
.setChannelId(1)
|
||||
.setCountryCode("US")
|
||||
.setUnk1("c25-314dd05b0b5f")
|
||||
.setUnk3(3)
|
||||
.setClientIp(session.getAddress().getAddress().getHostAddress())
|
||||
.setClientVersionRandomKey("c25-314dd05b0b5f")
|
||||
.setRegPlatform(3)
|
||||
.setClientIpStr(session.getAddress().getAddress().getHostAddress())
|
||||
.build();
|
||||
|
||||
this.setData(p.toByteArray());
|
||||
|
||||
@@ -3,12 +3,12 @@ package emu.grasscutter.server.packet.send;
|
||||
import java.util.Arrays;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.CityInfoOuterClass.CityInfo;
|
||||
import emu.grasscutter.net.proto.GetSceneAreaRspOuterClass.GetSceneAreaRsp;
|
||||
|
||||
public class PacketGetSceneAreaRsp extends GenshinPacket {
|
||||
public class PacketGetSceneAreaRsp extends BasePacket {
|
||||
|
||||
public PacketGetSceneAreaRsp(int sceneId) {
|
||||
super(PacketOpcodes.GetSceneAreaRsp);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetScenePointRspOuterClass.GetScenePointRsp;
|
||||
|
||||
public class PacketGetScenePointRsp extends GenshinPacket {
|
||||
public class PacketGetScenePointRsp extends BasePacket {
|
||||
|
||||
public PacketGetScenePointRsp(int sceneId) {
|
||||
super(PacketOpcodes.GetScenePointRsp);
|
||||
|
||||
@@ -1,19 +1,60 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.shop.ShopInfo;
|
||||
import emu.grasscutter.game.shop.ShopManager;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetShopRspOuterClass.GetShopRsp;
|
||||
import emu.grasscutter.net.proto.GetShopRspOuterClass;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass;
|
||||
import emu.grasscutter.net.proto.ShopGoodsOuterClass.ShopGoods;
|
||||
import emu.grasscutter.net.proto.ShopOuterClass.Shop;
|
||||
|
||||
public class PacketGetShopRsp extends GenshinPacket {
|
||||
|
||||
public PacketGetShopRsp(int shopType) {
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class PacketGetShopRsp extends BasePacket {
|
||||
|
||||
public PacketGetShopRsp(Player inv, int shopType) {
|
||||
super(PacketOpcodes.GetShopRsp);
|
||||
|
||||
GetShopRsp proto = GetShopRsp.newBuilder()
|
||||
.setShop(Shop.newBuilder().setShopType(shopType))
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
// TODO: CityReputationLevel
|
||||
Shop.Builder shop = Shop.newBuilder()
|
||||
.setShopType(shopType)
|
||||
.setCityId(1) //mock
|
||||
.setCityReputationLevel(10); //mock
|
||||
|
||||
ShopManager manager = Grasscutter.getGameServer().getShopManager();
|
||||
if (manager.getShopData().get(shopType) != null) {
|
||||
List<ShopInfo> list = manager.getShopData().get(shopType);
|
||||
List<ShopGoods> goodsList = new ArrayList<>();
|
||||
for (ShopInfo info : list) {
|
||||
ShopGoods.Builder goods = ShopGoods.newBuilder()
|
||||
.setGoodsId(info.getGoodsId())
|
||||
.setGoodsItem(ItemParamOuterClass.ItemParam.newBuilder().setItemId(info.getGoodsItem().getId()).setCount(info.getGoodsItem().getCount()).build())
|
||||
.setScoin(info.getScoin())
|
||||
.setHcoin(info.getHcoin())
|
||||
.setBoughtNum(inv.getGoodsLimitNum(info.getGoodsId()))
|
||||
.setBuyLimit(info.getBuyLimit())
|
||||
.setBeginTime(info.getBeginTime())
|
||||
.setEndTime(info.getEndTime())
|
||||
.setNextRefreshTime(info.getNextRefreshTime())
|
||||
.setMinLevel(info.getMinLevel())
|
||||
.setMaxLevel(info.getMaxLevel())
|
||||
.addAllPreGoodsIdList(info.getPreGoodsIdList())
|
||||
.setMcoin(info.getMcoin())
|
||||
.setDisableType(info.getDisableType())
|
||||
.setSecondarySheetId(info.getSecondarySheetId());
|
||||
if (info.getCostItemList() != null) {
|
||||
goods.addAllCostItemList(info.getCostItemList().stream().map(x -> ItemParamOuterClass.ItemParam.newBuilder().setItemId(x.getId()).setCount(x.getCount()).build()).collect(Collectors.toList()));
|
||||
}
|
||||
goodsList.add(goods.build());
|
||||
}
|
||||
shop.addAllGoodsList(goodsList);
|
||||
}
|
||||
|
||||
this.setData(GetShopRspOuterClass.GetShopRsp.newBuilder().setShop(shop).build());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetShopmallDataRspOuterClass.GetShopmallDataRsp;
|
||||
|
||||
public class PacketGetShopmallDataRsp extends GenshinPacket {
|
||||
public class PacketGetShopmallDataRsp extends BasePacket {
|
||||
|
||||
public PacketGetShopmallDataRsp() {
|
||||
super(PacketOpcodes.GetShopmallDataRsp);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.World;
|
||||
import emu.grasscutter.net.packet.GenshinPacket;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GetWorldMpInfoRspOuterClass.GetWorldMpInfoRsp;
|
||||
|
||||
public class PacketGetWorldMpInfoRsp extends GenshinPacket {
|
||||
public class PacketGetWorldMpInfoRsp extends BasePacket {
|
||||
|
||||
public PacketGetWorldMpInfoRsp(World world) {
|
||||
super(PacketOpcodes.GetWorldMpInfoRsp);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user