mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-21 19:34:42 +01:00
Format code
This commit is contained in:
@@ -1,24 +1,27 @@
|
||||
package emu.grasscutter.server.event.entity;
|
||||
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.props.ElementType;
|
||||
import emu.grasscutter.server.event.Cancellable;
|
||||
import emu.grasscutter.server.event.types.EntityEvent;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class EntityDamageEvent extends EntityEvent implements Cancellable {
|
||||
@Getter @Setter private float damage;
|
||||
@Getter @Setter private ElementType attackElementType;
|
||||
@Getter @Nullable private final GameEntity damager;
|
||||
|
||||
public EntityDamageEvent(GameEntity entity, float damage, ElementType attackElementType, @Nullable GameEntity damager) {
|
||||
super(entity);
|
||||
|
||||
this.damage = damage;
|
||||
this.attackElementType = attackElementType;
|
||||
this.damager = damager;
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.event.entity;
|
||||
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.props.ElementType;
|
||||
import emu.grasscutter.server.event.Cancellable;
|
||||
import emu.grasscutter.server.event.types.EntityEvent;
|
||||
import javax.annotation.Nullable;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public final class EntityDamageEvent extends EntityEvent implements Cancellable {
|
||||
@Getter @Setter private float damage;
|
||||
@Getter @Setter private ElementType attackElementType;
|
||||
@Getter @Nullable private final GameEntity damager;
|
||||
|
||||
public EntityDamageEvent(
|
||||
GameEntity entity,
|
||||
float damage,
|
||||
ElementType attackElementType,
|
||||
@Nullable GameEntity damager) {
|
||||
super(entity);
|
||||
|
||||
this.damage = damage;
|
||||
this.attackElementType = attackElementType;
|
||||
this.damager = damager;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,279 +1,279 @@
|
||||
package emu.grasscutter.server.game;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_INFO;
|
||||
import static emu.grasscutter.utils.Language.translate;
|
||||
|
||||
import emu.grasscutter.GameConstants;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.Account;
|
||||
import emu.grasscutter.game.battlepass.BattlePassSystem;
|
||||
import emu.grasscutter.game.chat.ChatSystem;
|
||||
import emu.grasscutter.game.chat.ChatSystemHandler;
|
||||
import emu.grasscutter.game.combine.CombineManger;
|
||||
import emu.grasscutter.game.drop.DropSystem;
|
||||
import emu.grasscutter.game.dungeons.DungeonSystem;
|
||||
import emu.grasscutter.game.expedition.ExpeditionSystem;
|
||||
import emu.grasscutter.game.gacha.GachaSystem;
|
||||
import emu.grasscutter.game.managers.cooking.CookingCompoundManager;
|
||||
import emu.grasscutter.game.managers.cooking.CookingManager;
|
||||
import emu.grasscutter.game.managers.energy.EnergyManager;
|
||||
import emu.grasscutter.game.managers.stamina.StaminaManager;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestSystem;
|
||||
import emu.grasscutter.game.shop.ShopSystem;
|
||||
import emu.grasscutter.game.systems.AnnouncementSystem;
|
||||
import emu.grasscutter.game.systems.InventorySystem;
|
||||
import emu.grasscutter.game.systems.MultiplayerSystem;
|
||||
import emu.grasscutter.game.tower.TowerSystem;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.game.world.WorldDataSystem;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
import emu.grasscutter.server.event.game.ServerTickEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStartEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStopEvent;
|
||||
import emu.grasscutter.server.event.types.ServerEvent;
|
||||
import emu.grasscutter.server.scheduler.ServerTaskScheduler;
|
||||
import emu.grasscutter.task.TaskMap;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.Instant;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import kcp.highway.ChannelConfig;
|
||||
import kcp.highway.KcpServer;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public final class GameServer extends KcpServer {
|
||||
// Game server base
|
||||
private final InetSocketAddress address;
|
||||
private final GameServerPacketHandler packetHandler;
|
||||
private final Map<Integer, Player> players;
|
||||
private final Set<World> worlds;
|
||||
|
||||
// Server systems
|
||||
private final InventorySystem inventorySystem;
|
||||
private final GachaSystem gachaSystem;
|
||||
private final ShopSystem shopSystem;
|
||||
private final MultiplayerSystem multiplayerSystem;
|
||||
private final DungeonSystem dungeonSystem;
|
||||
private final ExpeditionSystem expeditionSystem;
|
||||
private final DropSystem dropSystem;
|
||||
private final WorldDataSystem worldDataSystem;
|
||||
private final BattlePassSystem battlePassSystem;
|
||||
private final CombineManger combineSystem;
|
||||
private final TowerSystem towerSystem;
|
||||
private final AnnouncementSystem announcementSystem;
|
||||
private final QuestSystem questSystem;
|
||||
|
||||
// Extra
|
||||
private final ServerTaskScheduler scheduler;
|
||||
private final TaskMap taskMap;
|
||||
|
||||
private ChatSystemHandler chatManager;
|
||||
|
||||
public GameServer() {
|
||||
this(getAdapterInetSocketAddress());
|
||||
}
|
||||
|
||||
public GameServer(InetSocketAddress address) {
|
||||
ChannelConfig channelConfig = new ChannelConfig();
|
||||
channelConfig.nodelay(true, GAME_INFO.kcpInterval, 2, true);
|
||||
channelConfig.setMtu(1400);
|
||||
channelConfig.setSndwnd(256);
|
||||
channelConfig.setRcvwnd(256);
|
||||
channelConfig.setTimeoutMillis(30 * 1000); // 30s
|
||||
channelConfig.setUseConvChannel(true);
|
||||
channelConfig.setAckNoDelay(false);
|
||||
|
||||
this.init(GameSessionManager.getListener(), channelConfig, address);
|
||||
|
||||
EnergyManager.initialize();
|
||||
StaminaManager.initialize();
|
||||
CookingManager.initialize();
|
||||
CookingCompoundManager.initialize();
|
||||
CombineManger.initialize();
|
||||
|
||||
// Game Server base
|
||||
this.address = address;
|
||||
this.packetHandler = new GameServerPacketHandler(PacketHandler.class);
|
||||
this.players = new ConcurrentHashMap<>();
|
||||
this.worlds = Collections.synchronizedSet(new HashSet<>());
|
||||
|
||||
// Extra
|
||||
this.scheduler = new ServerTaskScheduler();
|
||||
this.taskMap = new TaskMap(true);
|
||||
|
||||
// Create game systems
|
||||
this.inventorySystem = new InventorySystem(this);
|
||||
this.gachaSystem = new GachaSystem(this);
|
||||
this.shopSystem = new ShopSystem(this);
|
||||
this.multiplayerSystem = new MultiplayerSystem(this);
|
||||
this.dungeonSystem = new DungeonSystem(this);
|
||||
this.dropSystem = new DropSystem(this);
|
||||
this.expeditionSystem = new ExpeditionSystem(this);
|
||||
this.combineSystem = new CombineManger(this);
|
||||
this.towerSystem = new TowerSystem(this);
|
||||
this.worldDataSystem = new WorldDataSystem(this);
|
||||
this.battlePassSystem = new BattlePassSystem(this);
|
||||
this.announcementSystem = new AnnouncementSystem(this);
|
||||
this.questSystem = new QuestSystem(this);
|
||||
|
||||
// Chata manager
|
||||
this.chatManager = new ChatSystem(this);
|
||||
|
||||
// Hook into shutdown event.
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(this::onServerShutdown));
|
||||
}
|
||||
|
||||
private static InetSocketAddress getAdapterInetSocketAddress() {
|
||||
InetSocketAddress inetSocketAddress;
|
||||
if (GAME_INFO.bindAddress.equals("")) {
|
||||
inetSocketAddress = new InetSocketAddress(GAME_INFO.bindPort);
|
||||
} else {
|
||||
inetSocketAddress = new InetSocketAddress(GAME_INFO.bindAddress, GAME_INFO.bindPort);
|
||||
}
|
||||
return inetSocketAddress;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public ChatSystemHandler getChatManager() {
|
||||
return chatManager;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setChatManager(ChatSystemHandler chatManager) {
|
||||
this.chatManager = chatManager;
|
||||
}
|
||||
|
||||
public ChatSystemHandler getChatSystem() {
|
||||
return chatManager;
|
||||
}
|
||||
|
||||
public void setChatSystem(ChatSystemHandler chatManager) {
|
||||
this.chatManager = chatManager;
|
||||
}
|
||||
|
||||
public void registerPlayer(Player player) {
|
||||
getPlayers().put(player.getUid(), player);
|
||||
}
|
||||
|
||||
public Player getPlayerByUid(int id) {
|
||||
return this.getPlayerByUid(id, false);
|
||||
}
|
||||
|
||||
public Player getPlayerByUid(int id, boolean allowOfflinePlayers) {
|
||||
// Console check
|
||||
if (id == GameConstants.SERVER_CONSOLE_UID) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get from online players
|
||||
Player player = this.getPlayers().get(id);
|
||||
|
||||
if (!allowOfflinePlayers) {
|
||||
return player;
|
||||
}
|
||||
|
||||
// Check database if character isnt here
|
||||
if (player == null) {
|
||||
player = DatabaseHelper.getPlayerByUid(id);
|
||||
}
|
||||
|
||||
return player;
|
||||
}
|
||||
|
||||
public Player getPlayerByAccountId(String accountId) {
|
||||
Optional<Player> playerOpt =
|
||||
getPlayers().values().stream()
|
||||
.filter(player -> player.getAccount().getId().equals(accountId))
|
||||
.findFirst();
|
||||
return playerOpt.orElse(null);
|
||||
}
|
||||
|
||||
public SocialDetail.Builder getSocialDetailByUid(int id) {
|
||||
// Get from online players
|
||||
Player player = this.getPlayerByUid(id, true);
|
||||
|
||||
if (player == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return player.getSocialDetail();
|
||||
}
|
||||
|
||||
public Account getAccountByName(String username) {
|
||||
Optional<Player> playerOpt =
|
||||
getPlayers().values().stream()
|
||||
.filter(player -> player.getAccount().getUsername().equals(username))
|
||||
.findFirst();
|
||||
if (playerOpt.isPresent()) {
|
||||
return playerOpt.get().getAccount();
|
||||
}
|
||||
return DatabaseHelper.getAccountByName(username);
|
||||
}
|
||||
|
||||
public synchronized void onTick() {
|
||||
var tickStart = Instant.now();
|
||||
|
||||
// Tick worlds.
|
||||
this.worlds.removeIf(World::onTick);
|
||||
|
||||
// Tick players.
|
||||
this.players.values().forEach(Player::onTick);
|
||||
|
||||
// Tick scheduler.
|
||||
this.getScheduler().runTasks();
|
||||
|
||||
// Call server tick event.
|
||||
ServerTickEvent event = new ServerTickEvent(tickStart, Instant.now());
|
||||
event.call();
|
||||
}
|
||||
|
||||
public void registerWorld(World world) {
|
||||
this.getWorlds().add(world);
|
||||
}
|
||||
|
||||
public void deregisterWorld(World world) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public void start() {
|
||||
// Schedule game loop.
|
||||
Timer gameLoop = new Timer();
|
||||
gameLoop.scheduleAtFixedRate(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
onTick();
|
||||
} catch (Exception e) {
|
||||
Grasscutter.getLogger().error(translate("messages.game.game_update_error"), e);
|
||||
}
|
||||
}
|
||||
},
|
||||
new Date(),
|
||||
1000L);
|
||||
Grasscutter.getLogger().info(translate("messages.status.free_software"));
|
||||
Grasscutter.getLogger()
|
||||
.info(translate("messages.game.address_bind", GAME_INFO.accessAddress, address.getPort()));
|
||||
ServerStartEvent event = new ServerStartEvent(ServerEvent.Type.GAME, OffsetDateTime.now());
|
||||
event.call();
|
||||
}
|
||||
|
||||
public void onServerShutdown() {
|
||||
ServerStopEvent event = new ServerStopEvent(ServerEvent.Type.GAME, OffsetDateTime.now());
|
||||
event.call();
|
||||
|
||||
// Kick and save all players
|
||||
List<Player> list = new ArrayList<>(this.getPlayers().size());
|
||||
list.addAll(this.getPlayers().values());
|
||||
|
||||
for (Player player : list) {
|
||||
player.getSession().close();
|
||||
}
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.game;
|
||||
|
||||
import static emu.grasscutter.config.Configuration.GAME_INFO;
|
||||
import static emu.grasscutter.utils.Language.translate;
|
||||
|
||||
import emu.grasscutter.GameConstants;
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.database.DatabaseHelper;
|
||||
import emu.grasscutter.game.Account;
|
||||
import emu.grasscutter.game.battlepass.BattlePassSystem;
|
||||
import emu.grasscutter.game.chat.ChatSystem;
|
||||
import emu.grasscutter.game.chat.ChatSystemHandler;
|
||||
import emu.grasscutter.game.combine.CombineManger;
|
||||
import emu.grasscutter.game.drop.DropSystem;
|
||||
import emu.grasscutter.game.dungeons.DungeonSystem;
|
||||
import emu.grasscutter.game.expedition.ExpeditionSystem;
|
||||
import emu.grasscutter.game.gacha.GachaSystem;
|
||||
import emu.grasscutter.game.managers.cooking.CookingCompoundManager;
|
||||
import emu.grasscutter.game.managers.cooking.CookingManager;
|
||||
import emu.grasscutter.game.managers.energy.EnergyManager;
|
||||
import emu.grasscutter.game.managers.stamina.StaminaManager;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.QuestSystem;
|
||||
import emu.grasscutter.game.shop.ShopSystem;
|
||||
import emu.grasscutter.game.systems.AnnouncementSystem;
|
||||
import emu.grasscutter.game.systems.InventorySystem;
|
||||
import emu.grasscutter.game.systems.MultiplayerSystem;
|
||||
import emu.grasscutter.game.tower.TowerSystem;
|
||||
import emu.grasscutter.game.world.World;
|
||||
import emu.grasscutter.game.world.WorldDataSystem;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
|
||||
import emu.grasscutter.server.event.game.ServerTickEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStartEvent;
|
||||
import emu.grasscutter.server.event.internal.ServerStopEvent;
|
||||
import emu.grasscutter.server.event.types.ServerEvent;
|
||||
import emu.grasscutter.server.scheduler.ServerTaskScheduler;
|
||||
import emu.grasscutter.task.TaskMap;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.Instant;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import kcp.highway.ChannelConfig;
|
||||
import kcp.highway.KcpServer;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public final class GameServer extends KcpServer {
|
||||
// Game server base
|
||||
private final InetSocketAddress address;
|
||||
private final GameServerPacketHandler packetHandler;
|
||||
private final Map<Integer, Player> players;
|
||||
private final Set<World> worlds;
|
||||
|
||||
// Server systems
|
||||
private final InventorySystem inventorySystem;
|
||||
private final GachaSystem gachaSystem;
|
||||
private final ShopSystem shopSystem;
|
||||
private final MultiplayerSystem multiplayerSystem;
|
||||
private final DungeonSystem dungeonSystem;
|
||||
private final ExpeditionSystem expeditionSystem;
|
||||
private final DropSystem dropSystem;
|
||||
private final WorldDataSystem worldDataSystem;
|
||||
private final BattlePassSystem battlePassSystem;
|
||||
private final CombineManger combineSystem;
|
||||
private final TowerSystem towerSystem;
|
||||
private final AnnouncementSystem announcementSystem;
|
||||
private final QuestSystem questSystem;
|
||||
|
||||
// Extra
|
||||
private final ServerTaskScheduler scheduler;
|
||||
private final TaskMap taskMap;
|
||||
|
||||
private ChatSystemHandler chatManager;
|
||||
|
||||
public GameServer() {
|
||||
this(getAdapterInetSocketAddress());
|
||||
}
|
||||
|
||||
public GameServer(InetSocketAddress address) {
|
||||
ChannelConfig channelConfig = new ChannelConfig();
|
||||
channelConfig.nodelay(true, GAME_INFO.kcpInterval, 2, true);
|
||||
channelConfig.setMtu(1400);
|
||||
channelConfig.setSndwnd(256);
|
||||
channelConfig.setRcvwnd(256);
|
||||
channelConfig.setTimeoutMillis(30 * 1000); // 30s
|
||||
channelConfig.setUseConvChannel(true);
|
||||
channelConfig.setAckNoDelay(false);
|
||||
|
||||
this.init(GameSessionManager.getListener(), channelConfig, address);
|
||||
|
||||
EnergyManager.initialize();
|
||||
StaminaManager.initialize();
|
||||
CookingManager.initialize();
|
||||
CookingCompoundManager.initialize();
|
||||
CombineManger.initialize();
|
||||
|
||||
// Game Server base
|
||||
this.address = address;
|
||||
this.packetHandler = new GameServerPacketHandler(PacketHandler.class);
|
||||
this.players = new ConcurrentHashMap<>();
|
||||
this.worlds = Collections.synchronizedSet(new HashSet<>());
|
||||
|
||||
// Extra
|
||||
this.scheduler = new ServerTaskScheduler();
|
||||
this.taskMap = new TaskMap(true);
|
||||
|
||||
// Create game systems
|
||||
this.inventorySystem = new InventorySystem(this);
|
||||
this.gachaSystem = new GachaSystem(this);
|
||||
this.shopSystem = new ShopSystem(this);
|
||||
this.multiplayerSystem = new MultiplayerSystem(this);
|
||||
this.dungeonSystem = new DungeonSystem(this);
|
||||
this.dropSystem = new DropSystem(this);
|
||||
this.expeditionSystem = new ExpeditionSystem(this);
|
||||
this.combineSystem = new CombineManger(this);
|
||||
this.towerSystem = new TowerSystem(this);
|
||||
this.worldDataSystem = new WorldDataSystem(this);
|
||||
this.battlePassSystem = new BattlePassSystem(this);
|
||||
this.announcementSystem = new AnnouncementSystem(this);
|
||||
this.questSystem = new QuestSystem(this);
|
||||
|
||||
// Chata manager
|
||||
this.chatManager = new ChatSystem(this);
|
||||
|
||||
// Hook into shutdown event.
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(this::onServerShutdown));
|
||||
}
|
||||
|
||||
private static InetSocketAddress getAdapterInetSocketAddress() {
|
||||
InetSocketAddress inetSocketAddress;
|
||||
if (GAME_INFO.bindAddress.equals("")) {
|
||||
inetSocketAddress = new InetSocketAddress(GAME_INFO.bindPort);
|
||||
} else {
|
||||
inetSocketAddress = new InetSocketAddress(GAME_INFO.bindAddress, GAME_INFO.bindPort);
|
||||
}
|
||||
return inetSocketAddress;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public ChatSystemHandler getChatManager() {
|
||||
return chatManager;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setChatManager(ChatSystemHandler chatManager) {
|
||||
this.chatManager = chatManager;
|
||||
}
|
||||
|
||||
public ChatSystemHandler getChatSystem() {
|
||||
return chatManager;
|
||||
}
|
||||
|
||||
public void setChatSystem(ChatSystemHandler chatManager) {
|
||||
this.chatManager = chatManager;
|
||||
}
|
||||
|
||||
public void registerPlayer(Player player) {
|
||||
getPlayers().put(player.getUid(), player);
|
||||
}
|
||||
|
||||
public Player getPlayerByUid(int id) {
|
||||
return this.getPlayerByUid(id, false);
|
||||
}
|
||||
|
||||
public Player getPlayerByUid(int id, boolean allowOfflinePlayers) {
|
||||
// Console check
|
||||
if (id == GameConstants.SERVER_CONSOLE_UID) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get from online players
|
||||
Player player = this.getPlayers().get(id);
|
||||
|
||||
if (!allowOfflinePlayers) {
|
||||
return player;
|
||||
}
|
||||
|
||||
// Check database if character isnt here
|
||||
if (player == null) {
|
||||
player = DatabaseHelper.getPlayerByUid(id);
|
||||
}
|
||||
|
||||
return player;
|
||||
}
|
||||
|
||||
public Player getPlayerByAccountId(String accountId) {
|
||||
Optional<Player> playerOpt =
|
||||
getPlayers().values().stream()
|
||||
.filter(player -> player.getAccount().getId().equals(accountId))
|
||||
.findFirst();
|
||||
return playerOpt.orElse(null);
|
||||
}
|
||||
|
||||
public SocialDetail.Builder getSocialDetailByUid(int id) {
|
||||
// Get from online players
|
||||
Player player = this.getPlayerByUid(id, true);
|
||||
|
||||
if (player == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return player.getSocialDetail();
|
||||
}
|
||||
|
||||
public Account getAccountByName(String username) {
|
||||
Optional<Player> playerOpt =
|
||||
getPlayers().values().stream()
|
||||
.filter(player -> player.getAccount().getUsername().equals(username))
|
||||
.findFirst();
|
||||
if (playerOpt.isPresent()) {
|
||||
return playerOpt.get().getAccount();
|
||||
}
|
||||
return DatabaseHelper.getAccountByName(username);
|
||||
}
|
||||
|
||||
public synchronized void onTick() {
|
||||
var tickStart = Instant.now();
|
||||
|
||||
// Tick worlds.
|
||||
this.worlds.removeIf(World::onTick);
|
||||
|
||||
// Tick players.
|
||||
this.players.values().forEach(Player::onTick);
|
||||
|
||||
// Tick scheduler.
|
||||
this.getScheduler().runTasks();
|
||||
|
||||
// Call server tick event.
|
||||
ServerTickEvent event = new ServerTickEvent(tickStart, Instant.now());
|
||||
event.call();
|
||||
}
|
||||
|
||||
public void registerWorld(World world) {
|
||||
this.getWorlds().add(world);
|
||||
}
|
||||
|
||||
public void deregisterWorld(World world) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public void start() {
|
||||
// Schedule game loop.
|
||||
Timer gameLoop = new Timer();
|
||||
gameLoop.scheduleAtFixedRate(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
onTick();
|
||||
} catch (Exception e) {
|
||||
Grasscutter.getLogger().error(translate("messages.game.game_update_error"), e);
|
||||
}
|
||||
}
|
||||
},
|
||||
new Date(),
|
||||
1000L);
|
||||
Grasscutter.getLogger().info(translate("messages.status.free_software"));
|
||||
Grasscutter.getLogger()
|
||||
.info(translate("messages.game.address_bind", GAME_INFO.accessAddress, address.getPort()));
|
||||
ServerStartEvent event = new ServerStartEvent(ServerEvent.Type.GAME, OffsetDateTime.now());
|
||||
event.call();
|
||||
}
|
||||
|
||||
public void onServerShutdown() {
|
||||
ServerStopEvent event = new ServerStopEvent(ServerEvent.Type.GAME, OffsetDateTime.now());
|
||||
event.call();
|
||||
|
||||
// Kick and save all players
|
||||
List<Player> list = new ArrayList<>(this.getPlayers().size());
|
||||
list.addAll(this.getPlayers().values());
|
||||
|
||||
for (Player player : list) {
|
||||
player.getSession().close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
//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.server.game.GameSession;
|
||||
//
|
||||
//@Opcodes(PacketOpcodes.AddCustomTeamReq)
|
||||
//public class HandlerAddCustomTeamReq extends PacketHandler {
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// session.getPlayer().getTeamManager().addNewCustomTeam();
|
||||
// }
|
||||
//}
|
||||
// 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.server.game.GameSession;
|
||||
//
|
||||
// @Opcodes(PacketOpcodes.AddCustomTeamReq)
|
||||
// public class HandlerAddCustomTeamReq extends PacketHandler {
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// session.getPlayer().getTeamManager().addNewCustomTeam();
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,26 +1,25 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AddQuestContentProgressReqOuterClass.AddQuestContentProgressReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketAddQuestContentProgressRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.AddQuestContentProgressReq)
|
||||
public class HandlerAddQuestContentProgressReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = AddQuestContentProgressReq.parseFrom(payload);
|
||||
|
||||
// Find all conditions in quest that are the same as the given one
|
||||
var type = QuestContent.getContentTriggerByValue(req.getContentType());
|
||||
if(type != null) {
|
||||
session.getPlayer().getQuestManager().queueEvent(type, req.getParam());
|
||||
}
|
||||
|
||||
session.send(new PacketAddQuestContentProgressRsp(req.getContentType()));
|
||||
}
|
||||
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AddQuestContentProgressReqOuterClass.AddQuestContentProgressReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketAddQuestContentProgressRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.AddQuestContentProgressReq)
|
||||
public class HandlerAddQuestContentProgressReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = AddQuestContentProgressReq.parseFrom(payload);
|
||||
|
||||
// Find all conditions in quest that are the same as the given one
|
||||
var type = QuestContent.getContentTriggerByValue(req.getContentType());
|
||||
if (type != null) {
|
||||
session.getPlayer().getQuestManager().queueEvent(type, req.getParam());
|
||||
}
|
||||
|
||||
session.send(new PacketAddQuestContentProgressRsp(req.getContentType()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,39 +1,38 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarChangeElementTypeReqOuterClass.AvatarChangeElementTypeReq;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarChangeElementTypeRsp;
|
||||
import lombok.val;
|
||||
|
||||
/**
|
||||
* Changes the currently active avatars Element if possible
|
||||
*/
|
||||
@Opcodes(PacketOpcodes.AvatarChangeElementTypeReq)
|
||||
public class HandlerAvatarChangeElementTypeReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = AvatarChangeElementTypeReq.parseFrom(payload);
|
||||
var area = GameData.getWorldAreaDataMap().get(req.getAreaId());
|
||||
|
||||
if (area == null || area.getElementType() == null || area.getElementType().getDepotIndex() <= 0) {
|
||||
session.send(new PacketAvatarChangeElementTypeRsp(Retcode.RET_SVR_ERROR_VALUE));
|
||||
return;
|
||||
}
|
||||
|
||||
val avatar = session.getPlayer().getTeamManager().getCurrentAvatarEntity().getAvatar();
|
||||
if (!avatar.changeElement(area.getElementType())) {
|
||||
session.send(new PacketAvatarChangeElementTypeRsp(Retcode.RET_SVR_ERROR_VALUE));
|
||||
return;
|
||||
}
|
||||
|
||||
// Success
|
||||
session.send(new PacketAvatarChangeElementTypeRsp());
|
||||
}
|
||||
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AvatarChangeElementTypeReqOuterClass.AvatarChangeElementTypeReq;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketAvatarChangeElementTypeRsp;
|
||||
import lombok.val;
|
||||
|
||||
/** Changes the currently active avatars Element if possible */
|
||||
@Opcodes(PacketOpcodes.AvatarChangeElementTypeReq)
|
||||
public class HandlerAvatarChangeElementTypeReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = AvatarChangeElementTypeReq.parseFrom(payload);
|
||||
var area = GameData.getWorldAreaDataMap().get(req.getAreaId());
|
||||
|
||||
if (area == null
|
||||
|| area.getElementType() == null
|
||||
|| area.getElementType().getDepotIndex() <= 0) {
|
||||
session.send(new PacketAvatarChangeElementTypeRsp(Retcode.RET_SVR_ERROR_VALUE));
|
||||
return;
|
||||
}
|
||||
|
||||
val avatar = session.getPlayer().getTeamManager().getCurrentAvatarEntity().getAvatar();
|
||||
if (!avatar.changeElement(area.getElementType())) {
|
||||
session.send(new PacketAvatarChangeElementTypeRsp(Retcode.RET_SVR_ERROR_VALUE));
|
||||
return;
|
||||
}
|
||||
|
||||
// Success
|
||||
session.send(new PacketAvatarChangeElementTypeRsp());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
//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.Unk2700BEDLIGJANCJClientReq;
|
||||
//import emu.grasscutter.server.game.GameSession;
|
||||
//import emu.grasscutter.server.packet.send.PacketChangeHomeBgmNotify;
|
||||
//import emu.grasscutter.server.packet.send.PacketChangeHomeBgmRsp;
|
||||
//
|
||||
//@Opcodes(PacketOpcodes.Unk2700_BEDLIGJANCJ_ClientReq)
|
||||
//public class HandlerChangeHomeBgmReq extends PacketHandler {
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// var req = Unk2700BEDLIGJANCJClientReq.Unk2700_BEDLIGJANCJ_ClientReq.parseFrom(payload);
|
||||
//
|
||||
// int homeBgmId = req.getUnk2700BJHAMKKECEI();
|
||||
// var home = session.getPlayer().getHome();
|
||||
//
|
||||
// home.getHomeSceneItem(session.getPlayer().getSceneId()).setHomeBgmId(homeBgmId);
|
||||
// home.save();
|
||||
//
|
||||
// session.send(new PacketChangeHomeBgmNotify(homeBgmId));
|
||||
// session.send(new PacketChangeHomeBgmRsp());
|
||||
// }
|
||||
//}
|
||||
// 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.Unk2700BEDLIGJANCJClientReq;
|
||||
// import emu.grasscutter.server.game.GameSession;
|
||||
// import emu.grasscutter.server.packet.send.PacketChangeHomeBgmNotify;
|
||||
// import emu.grasscutter.server.packet.send.PacketChangeHomeBgmRsp;
|
||||
//
|
||||
// @Opcodes(PacketOpcodes.Unk2700_BEDLIGJANCJ_ClientReq)
|
||||
// public class HandlerChangeHomeBgmReq extends PacketHandler {
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// var req = Unk2700BEDLIGJANCJClientReq.Unk2700_BEDLIGJANCJ_ClientReq.parseFrom(payload);
|
||||
//
|
||||
// int homeBgmId = req.getUnk2700BJHAMKKECEI();
|
||||
// var home = session.getPlayer().getHome();
|
||||
//
|
||||
// home.getHomeSceneItem(session.getPlayer().getSceneId()).setHomeBgmId(homeBgmId);
|
||||
// home.save();
|
||||
//
|
||||
// session.send(new PacketChangeHomeBgmNotify(homeBgmId));
|
||||
// session.send(new PacketChangeHomeBgmRsp());
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,191 +1,191 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
|
||||
import emu.grasscutter.net.proto.CombatInvocationsNotifyOuterClass.CombatInvocationsNotify;
|
||||
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
||||
import emu.grasscutter.net.proto.EntityMoveInfoOuterClass.EntityMoveInfo;
|
||||
import emu.grasscutter.net.proto.EvtAnimatorParameterInfoOuterClass.EvtAnimatorParameterInfo;
|
||||
import emu.grasscutter.net.proto.EvtBeingHitInfoOuterClass.EvtBeingHitInfo;
|
||||
import emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo;
|
||||
import emu.grasscutter.net.proto.MotionStateOuterClass.MotionState;
|
||||
import emu.grasscutter.net.proto.PlayerDieTypeOuterClass;
|
||||
import emu.grasscutter.server.event.entity.EntityMoveEvent;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
|
||||
import emu.grasscutter.utils.Position;
|
||||
|
||||
@Opcodes(PacketOpcodes.CombatInvocationsNotify)
|
||||
public class HandlerCombatInvocationsNotify extends PacketHandler {
|
||||
|
||||
private float cachedLandingSpeed = 0;
|
||||
private long cachedLandingTimeMillisecond = 0;
|
||||
private boolean monitorLandingEvent = false;
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
CombatInvocationsNotify notif = CombatInvocationsNotify.parseFrom(payload);
|
||||
for (CombatInvokeEntry entry : notif.getInvokeListList()) {
|
||||
// Handle combat invoke
|
||||
switch (entry.getArgumentType()) {
|
||||
case COMBAT_TYPE_ARGUMENT_EVT_BEING_HIT -> {
|
||||
EvtBeingHitInfo hitInfo = EvtBeingHitInfo.parseFrom(entry.getCombatData());
|
||||
AttackResult attackResult = hitInfo.getAttackResult();
|
||||
Player player = session.getPlayer();
|
||||
|
||||
// Check if the player is invulnerable.
|
||||
if (attackResult.getAttackerId()
|
||||
!= player.getTeamManager().getCurrentAvatarEntity().getId()
|
||||
&& player.getAbilityManager().isAbilityInvulnerable()) break;
|
||||
|
||||
// Handle damage
|
||||
player.getAttackResults().add(attackResult);
|
||||
player.getEnergyManager().handleAttackHit(hitInfo);
|
||||
}
|
||||
case COMBAT_TYPE_ARGUMENT_ENTITY_MOVE -> {
|
||||
// Handle movement
|
||||
EntityMoveInfo moveInfo = EntityMoveInfo.parseFrom(entry.getCombatData());
|
||||
GameEntity entity = session.getPlayer().getScene().getEntityById(moveInfo.getEntityId());
|
||||
if (entity != null) {
|
||||
// Move player
|
||||
MotionInfo motionInfo = moveInfo.getMotionInfo();
|
||||
MotionState motionState = motionInfo.getState();
|
||||
|
||||
// Call entity move event.
|
||||
EntityMoveEvent event =
|
||||
new EntityMoveEvent(
|
||||
entity,
|
||||
new Position(motionInfo.getPos()),
|
||||
new Position(motionInfo.getRot()),
|
||||
motionState);
|
||||
event.call();
|
||||
|
||||
entity.move(event.getPosition(), event.getRotation());
|
||||
entity.setLastMoveSceneTimeMs(moveInfo.getSceneTime());
|
||||
entity.setLastMoveReliableSeq(moveInfo.getReliableSeq());
|
||||
entity.setMotionState(motionState);
|
||||
|
||||
session
|
||||
.getPlayer()
|
||||
.getStaminaManager()
|
||||
.handleCombatInvocationsNotify(session, moveInfo, entity);
|
||||
|
||||
// TODO: handle MOTION_FIGHT landing which has a different damage factor
|
||||
// Also, for plunge attacks, LAND_SPEED is always -30 and is not useful.
|
||||
// May need the height when starting plunge attack.
|
||||
|
||||
// MOTION_LAND_SPEED and MOTION_FALL_ON_GROUND arrive in different packets.
|
||||
// Cache land speed for later use.
|
||||
if (motionState == MotionState.MOTION_STATE_LAND_SPEED) {
|
||||
cachedLandingSpeed = motionInfo.getSpeed().getY();
|
||||
cachedLandingTimeMillisecond = System.currentTimeMillis();
|
||||
monitorLandingEvent = true;
|
||||
}
|
||||
if (monitorLandingEvent) {
|
||||
if (motionState == MotionState.MOTION_STATE_FALL_ON_GROUND) {
|
||||
monitorLandingEvent = false;
|
||||
handleFallOnGround(session, entity, motionState);
|
||||
}
|
||||
}
|
||||
|
||||
// MOTION_STATE_NOTIFY = Dont send to other players
|
||||
if (motionState == MotionState.MOTION_STATE_NOTIFY) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
case COMBAT_TYPE_ARGUMENT_ANIMATOR_PARAMETER_CHANGED -> {
|
||||
EvtAnimatorParameterInfo paramInfo =
|
||||
EvtAnimatorParameterInfo.parseFrom(entry.getCombatData());
|
||||
if (paramInfo.getIsServerCache()) {
|
||||
paramInfo = paramInfo.toBuilder().setIsServerCache(false).build();
|
||||
entry = entry.toBuilder().setCombatData(paramInfo.toByteString()).build();
|
||||
}
|
||||
}
|
||||
default -> {}
|
||||
}
|
||||
|
||||
session.getPlayer().getCombatInvokeHandler().addEntry(entry.getForwardType(), entry);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleFallOnGround(GameSession session, GameEntity entity, MotionState motionState) {
|
||||
if (session.getPlayer().isInGodMode()) {
|
||||
return;
|
||||
}
|
||||
// People have reported that after plunge attack (client sends a FIGHT instead of
|
||||
// FALL_ON_GROUND) they will die
|
||||
// if they talk to an NPC (this is when the client sends a FALL_ON_GROUND) without jumping
|
||||
// again.
|
||||
// A dirty patch: if not received immediately after MOTION_LAND_SPEED, discard this packet.
|
||||
// 200ms seems to be a reasonable delay.
|
||||
int maxDelay = 200;
|
||||
long actualDelay = System.currentTimeMillis() - cachedLandingTimeMillisecond;
|
||||
Grasscutter.getLogger()
|
||||
.trace(
|
||||
"MOTION_FALL_ON_GROUND received after "
|
||||
+ actualDelay
|
||||
+ "/"
|
||||
+ maxDelay
|
||||
+ "ms."
|
||||
+ (actualDelay > maxDelay ? " Discard" : ""));
|
||||
if (actualDelay > maxDelay) {
|
||||
return;
|
||||
}
|
||||
float currentHP = entity.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP);
|
||||
float maxHP = entity.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP);
|
||||
float damageFactor = 0;
|
||||
if (cachedLandingSpeed < -23.5) {
|
||||
damageFactor = 0.33f;
|
||||
}
|
||||
if (cachedLandingSpeed < -25) {
|
||||
damageFactor = 0.5f;
|
||||
}
|
||||
if (cachedLandingSpeed < -26.5) {
|
||||
damageFactor = 0.66f;
|
||||
}
|
||||
if (cachedLandingSpeed < -28) {
|
||||
damageFactor = 1f;
|
||||
}
|
||||
float damage = maxHP * damageFactor;
|
||||
float newHP = currentHP - damage;
|
||||
if (newHP < 0) {
|
||||
newHP = 0;
|
||||
}
|
||||
if (damageFactor > 0) {
|
||||
Grasscutter.getLogger()
|
||||
.debug(
|
||||
currentHP
|
||||
+ "/"
|
||||
+ maxHP
|
||||
+ "\tLandingSpeed: "
|
||||
+ cachedLandingSpeed
|
||||
+ "\tDamageFactor: "
|
||||
+ damageFactor
|
||||
+ "\tDamage: "
|
||||
+ damage
|
||||
+ "\tNewHP: "
|
||||
+ newHP);
|
||||
} else {
|
||||
Grasscutter.getLogger().trace(currentHP + "/" + maxHP + "\tLandingSpeed: 0\tNo damage");
|
||||
}
|
||||
entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, newHP);
|
||||
entity
|
||||
.getWorld()
|
||||
.broadcastPacket(
|
||||
new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP));
|
||||
if (newHP == 0) {
|
||||
session
|
||||
.getPlayer()
|
||||
.getStaminaManager()
|
||||
.killAvatar(session, entity, PlayerDieTypeOuterClass.PlayerDieType.PLAYER_DIE_TYPE_FALL);
|
||||
}
|
||||
cachedLandingSpeed = 0;
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
|
||||
import emu.grasscutter.net.proto.CombatInvocationsNotifyOuterClass.CombatInvocationsNotify;
|
||||
import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
|
||||
import emu.grasscutter.net.proto.EntityMoveInfoOuterClass.EntityMoveInfo;
|
||||
import emu.grasscutter.net.proto.EvtAnimatorParameterInfoOuterClass.EvtAnimatorParameterInfo;
|
||||
import emu.grasscutter.net.proto.EvtBeingHitInfoOuterClass.EvtBeingHitInfo;
|
||||
import emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo;
|
||||
import emu.grasscutter.net.proto.MotionStateOuterClass.MotionState;
|
||||
import emu.grasscutter.net.proto.PlayerDieTypeOuterClass;
|
||||
import emu.grasscutter.server.event.entity.EntityMoveEvent;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
|
||||
import emu.grasscutter.utils.Position;
|
||||
|
||||
@Opcodes(PacketOpcodes.CombatInvocationsNotify)
|
||||
public class HandlerCombatInvocationsNotify extends PacketHandler {
|
||||
|
||||
private float cachedLandingSpeed = 0;
|
||||
private long cachedLandingTimeMillisecond = 0;
|
||||
private boolean monitorLandingEvent = false;
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
CombatInvocationsNotify notif = CombatInvocationsNotify.parseFrom(payload);
|
||||
for (CombatInvokeEntry entry : notif.getInvokeListList()) {
|
||||
// Handle combat invoke
|
||||
switch (entry.getArgumentType()) {
|
||||
case COMBAT_TYPE_ARGUMENT_EVT_BEING_HIT -> {
|
||||
EvtBeingHitInfo hitInfo = EvtBeingHitInfo.parseFrom(entry.getCombatData());
|
||||
AttackResult attackResult = hitInfo.getAttackResult();
|
||||
Player player = session.getPlayer();
|
||||
|
||||
// Check if the player is invulnerable.
|
||||
if (attackResult.getAttackerId()
|
||||
!= player.getTeamManager().getCurrentAvatarEntity().getId()
|
||||
&& player.getAbilityManager().isAbilityInvulnerable()) break;
|
||||
|
||||
// Handle damage
|
||||
player.getAttackResults().add(attackResult);
|
||||
player.getEnergyManager().handleAttackHit(hitInfo);
|
||||
}
|
||||
case COMBAT_TYPE_ARGUMENT_ENTITY_MOVE -> {
|
||||
// Handle movement
|
||||
EntityMoveInfo moveInfo = EntityMoveInfo.parseFrom(entry.getCombatData());
|
||||
GameEntity entity = session.getPlayer().getScene().getEntityById(moveInfo.getEntityId());
|
||||
if (entity != null) {
|
||||
// Move player
|
||||
MotionInfo motionInfo = moveInfo.getMotionInfo();
|
||||
MotionState motionState = motionInfo.getState();
|
||||
|
||||
// Call entity move event.
|
||||
EntityMoveEvent event =
|
||||
new EntityMoveEvent(
|
||||
entity,
|
||||
new Position(motionInfo.getPos()),
|
||||
new Position(motionInfo.getRot()),
|
||||
motionState);
|
||||
event.call();
|
||||
|
||||
entity.move(event.getPosition(), event.getRotation());
|
||||
entity.setLastMoveSceneTimeMs(moveInfo.getSceneTime());
|
||||
entity.setLastMoveReliableSeq(moveInfo.getReliableSeq());
|
||||
entity.setMotionState(motionState);
|
||||
|
||||
session
|
||||
.getPlayer()
|
||||
.getStaminaManager()
|
||||
.handleCombatInvocationsNotify(session, moveInfo, entity);
|
||||
|
||||
// TODO: handle MOTION_FIGHT landing which has a different damage factor
|
||||
// Also, for plunge attacks, LAND_SPEED is always -30 and is not useful.
|
||||
// May need the height when starting plunge attack.
|
||||
|
||||
// MOTION_LAND_SPEED and MOTION_FALL_ON_GROUND arrive in different packets.
|
||||
// Cache land speed for later use.
|
||||
if (motionState == MotionState.MOTION_STATE_LAND_SPEED) {
|
||||
cachedLandingSpeed = motionInfo.getSpeed().getY();
|
||||
cachedLandingTimeMillisecond = System.currentTimeMillis();
|
||||
monitorLandingEvent = true;
|
||||
}
|
||||
if (monitorLandingEvent) {
|
||||
if (motionState == MotionState.MOTION_STATE_FALL_ON_GROUND) {
|
||||
monitorLandingEvent = false;
|
||||
handleFallOnGround(session, entity, motionState);
|
||||
}
|
||||
}
|
||||
|
||||
// MOTION_STATE_NOTIFY = Dont send to other players
|
||||
if (motionState == MotionState.MOTION_STATE_NOTIFY) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
case COMBAT_TYPE_ARGUMENT_ANIMATOR_PARAMETER_CHANGED -> {
|
||||
EvtAnimatorParameterInfo paramInfo =
|
||||
EvtAnimatorParameterInfo.parseFrom(entry.getCombatData());
|
||||
if (paramInfo.getIsServerCache()) {
|
||||
paramInfo = paramInfo.toBuilder().setIsServerCache(false).build();
|
||||
entry = entry.toBuilder().setCombatData(paramInfo.toByteString()).build();
|
||||
}
|
||||
}
|
||||
default -> {}
|
||||
}
|
||||
|
||||
session.getPlayer().getCombatInvokeHandler().addEntry(entry.getForwardType(), entry);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleFallOnGround(GameSession session, GameEntity entity, MotionState motionState) {
|
||||
if (session.getPlayer().isInGodMode()) {
|
||||
return;
|
||||
}
|
||||
// People have reported that after plunge attack (client sends a FIGHT instead of
|
||||
// FALL_ON_GROUND) they will die
|
||||
// if they talk to an NPC (this is when the client sends a FALL_ON_GROUND) without jumping
|
||||
// again.
|
||||
// A dirty patch: if not received immediately after MOTION_LAND_SPEED, discard this packet.
|
||||
// 200ms seems to be a reasonable delay.
|
||||
int maxDelay = 200;
|
||||
long actualDelay = System.currentTimeMillis() - cachedLandingTimeMillisecond;
|
||||
Grasscutter.getLogger()
|
||||
.trace(
|
||||
"MOTION_FALL_ON_GROUND received after "
|
||||
+ actualDelay
|
||||
+ "/"
|
||||
+ maxDelay
|
||||
+ "ms."
|
||||
+ (actualDelay > maxDelay ? " Discard" : ""));
|
||||
if (actualDelay > maxDelay) {
|
||||
return;
|
||||
}
|
||||
float currentHP = entity.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP);
|
||||
float maxHP = entity.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP);
|
||||
float damageFactor = 0;
|
||||
if (cachedLandingSpeed < -23.5) {
|
||||
damageFactor = 0.33f;
|
||||
}
|
||||
if (cachedLandingSpeed < -25) {
|
||||
damageFactor = 0.5f;
|
||||
}
|
||||
if (cachedLandingSpeed < -26.5) {
|
||||
damageFactor = 0.66f;
|
||||
}
|
||||
if (cachedLandingSpeed < -28) {
|
||||
damageFactor = 1f;
|
||||
}
|
||||
float damage = maxHP * damageFactor;
|
||||
float newHP = currentHP - damage;
|
||||
if (newHP < 0) {
|
||||
newHP = 0;
|
||||
}
|
||||
if (damageFactor > 0) {
|
||||
Grasscutter.getLogger()
|
||||
.debug(
|
||||
currentHP
|
||||
+ "/"
|
||||
+ maxHP
|
||||
+ "\tLandingSpeed: "
|
||||
+ cachedLandingSpeed
|
||||
+ "\tDamageFactor: "
|
||||
+ damageFactor
|
||||
+ "\tDamage: "
|
||||
+ damage
|
||||
+ "\tNewHP: "
|
||||
+ newHP);
|
||||
} else {
|
||||
Grasscutter.getLogger().trace(currentHP + "/" + maxHP + "\tLandingSpeed: 0\tNo damage");
|
||||
}
|
||||
entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, newHP);
|
||||
entity
|
||||
.getWorld()
|
||||
.broadcastPacket(
|
||||
new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP));
|
||||
if (newHP == 0) {
|
||||
session
|
||||
.getPlayer()
|
||||
.getStaminaManager()
|
||||
.killAvatar(session, entity, PlayerDieTypeOuterClass.PlayerDieType.PLAYER_DIE_TYPE_FALL);
|
||||
}
|
||||
cachedLandingSpeed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
@Opcodes(PacketOpcodes.EvtDoSkillSuccNotify)
|
||||
public class HandlerEvtDoSkillSuccNotify extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
EvtDoSkillSuccNotify notify = EvtDoSkillSuccNotify.parseFrom(payload);
|
||||
|
||||
var player = session.getPlayer();
|
||||
int skillId = notify.getSkillId();
|
||||
int casterId = notify.getCasterId();
|
||||
|
||||
// Call skill perform in the player's ability manager.
|
||||
player.getAbilityManager().onSkillStart(session.getPlayer(), skillId, casterId);
|
||||
|
||||
// Handle skill notify in other managers.
|
||||
player.getStaminaManager().handleEvtDoSkillSuccNotify(session, skillId, casterId);
|
||||
player.getEnergyManager().handleEvtDoSkillSuccNotify(session, skillId, casterId);
|
||||
player.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_SKILL, skillId, 0);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
@Opcodes(PacketOpcodes.EvtDoSkillSuccNotify)
|
||||
public class HandlerEvtDoSkillSuccNotify extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
EvtDoSkillSuccNotify notify = EvtDoSkillSuccNotify.parseFrom(payload);
|
||||
|
||||
var player = session.getPlayer();
|
||||
int skillId = notify.getSkillId();
|
||||
int casterId = notify.getCasterId();
|
||||
|
||||
// Call skill perform in the player's ability manager.
|
||||
player.getAbilityManager().onSkillStart(session.getPlayer(), skillId, casterId);
|
||||
|
||||
// Handle skill notify in other managers.
|
||||
player.getStaminaManager().handleEvtDoSkillSuccNotify(session, skillId, casterId);
|
||||
player.getEnergyManager().handleEvtDoSkillSuccNotify(session, skillId, casterId);
|
||||
player.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_SKILL, skillId, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ExecuteGadgetLuaReqOuterClass.ExecuteGadgetLuaReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketExecuteGadgetLuaRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.ExecuteGadgetLuaReq)
|
||||
public class HandlerExecuteGadgetLuaReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
ExecuteGadgetLuaReq req = ExecuteGadgetLuaReq.parseFrom(payload);
|
||||
|
||||
Player player = session.getPlayer();
|
||||
GameEntity entity = player.getScene().getEntities().get(req.getSourceEntityId());
|
||||
|
||||
int result = 1;
|
||||
if (entity instanceof EntityGadget gadget)
|
||||
result = gadget.onClientExecuteRequest(req.getParam1(), req.getParam2(), req.getParam3());
|
||||
|
||||
player.sendPacket(new PacketExecuteGadgetLuaRsp(result));
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.ExecuteGadgetLuaReqOuterClass.ExecuteGadgetLuaReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketExecuteGadgetLuaRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.ExecuteGadgetLuaReq)
|
||||
public class HandlerExecuteGadgetLuaReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
ExecuteGadgetLuaReq req = ExecuteGadgetLuaReq.parseFrom(payload);
|
||||
|
||||
Player player = session.getPlayer();
|
||||
GameEntity entity = player.getScene().getEntities().get(req.getSourceEntityId());
|
||||
|
||||
int result = 1;
|
||||
if (entity instanceof EntityGadget gadget)
|
||||
result = gadget.onClientExecuteRequest(req.getParam1(), req.getParam2(), req.getParam3());
|
||||
|
||||
player.sendPacket(new PacketExecuteGadgetLuaRsp(result));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
@Opcodes(PacketOpcodes.GadgetInteractReq)
|
||||
public class HandlerGadgetInteractReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
GadgetInteractReq req = GadgetInteractReq.parseFrom(payload);
|
||||
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_INTERACT_GADGET, req.getGadgetId());
|
||||
session.getPlayer().interactWith(req.getGadgetEntityId(), req);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
@Opcodes(PacketOpcodes.GadgetInteractReq)
|
||||
public class HandlerGadgetInteractReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
GadgetInteractReq req = GadgetInteractReq.parseFrom(payload);
|
||||
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_INTERACT_GADGET, req.getGadgetId());
|
||||
session.getPlayer().interactWith(req.getGadgetEntityId(), req);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
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.GetAllMailNotifyOuterClass.GetAllMailNotify;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketGetAllMailResultNotify;
|
||||
|
||||
@Opcodes(PacketOpcodes.GetAllMailNotify)
|
||||
public final class HandlerGetAllMailNotify extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = GetAllMailNotify.parseFrom(payload);
|
||||
session.send(new PacketGetAllMailResultNotify(session.getPlayer(), req.getIsCollected()));
|
||||
}
|
||||
}
|
||||
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.GetAllMailNotifyOuterClass.GetAllMailNotify;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketGetAllMailResultNotify;
|
||||
|
||||
@Opcodes(PacketOpcodes.GetAllMailNotify)
|
||||
public final class HandlerGetAllMailNotify extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = GetAllMailNotify.parseFrom(payload);
|
||||
session.send(new PacketGetAllMailResultNotify(session.getPlayer(), req.getIsCollected()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
//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.server.game.GameSession;
|
||||
//import emu.grasscutter.server.packet.send.PacketHomeUnknown2Rsp;
|
||||
//
|
||||
//@Opcodes(PacketOpcodes.Unk2700_ACILPONNGGK_ClientReq)
|
||||
//public class HandlerHomeUnknown2Req extends PacketHandler {
|
||||
//
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// /*
|
||||
// * This packet is about the edit mode
|
||||
// */
|
||||
// session.send(new PacketHomeUnknown2Rsp());
|
||||
// }
|
||||
//}
|
||||
// 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.server.game.GameSession;
|
||||
// import emu.grasscutter.server.packet.send.PacketHomeUnknown2Rsp;
|
||||
//
|
||||
// @Opcodes(PacketOpcodes.Unk2700_ACILPONNGGK_ClientReq)
|
||||
// public class HandlerHomeUnknown2Req extends PacketHandler {
|
||||
//
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// /*
|
||||
// * This packet is about the edit mode
|
||||
// */
|
||||
// session.send(new PacketHomeUnknown2Rsp());
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,66 +1,75 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.activity.musicgame.MusicGameActivityHandler;
|
||||
import emu.grasscutter.game.activity.musicgame.MusicGamePlayerData;
|
||||
import emu.grasscutter.game.props.ActivityType;
|
||||
import emu.grasscutter.game.props.WatcherTriggerType;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.MusicGameSettleReqOuterClass.MusicGameSettleReq;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketActivityInfoNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketMusicGameSettleRsp;
|
||||
import lombok.val;
|
||||
|
||||
@Opcodes(PacketOpcodes.MusicGameSettleReq)
|
||||
public class HandlerMusicGameSettleReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
val req = MusicGameSettleReq.parseFrom(payload);
|
||||
|
||||
val activityManager = session.getPlayer().getActivityManager();
|
||||
|
||||
val playerDataOpt = activityManager.getPlayerActivityDataByActivityType(ActivityType.NEW_ACTIVITY_MUSIC_GAME);
|
||||
if (playerDataOpt.isEmpty()) {
|
||||
session.send(new PacketMusicGameSettleRsp(RetcodeOuterClass.Retcode.RET_MUSIC_GAME_LEVEL_CONFIG_NOT_FOUND, req));
|
||||
return;
|
||||
}
|
||||
|
||||
val playerData = playerDataOpt.get();
|
||||
val handler = (MusicGameActivityHandler) playerData.getActivityHandler();
|
||||
boolean isNewRecord = false;
|
||||
|
||||
// check if custom beatmap
|
||||
if (req.getUgcGuid() == 0) {
|
||||
session.getPlayer().getActivityManager().triggerWatcher(
|
||||
WatcherTriggerType.TRIGGER_FLEUR_FAIR_MUSIC_GAME_REACH_SCORE,
|
||||
String.valueOf(req.getMusicBasicId()),
|
||||
String.valueOf(req.getScore())
|
||||
);
|
||||
|
||||
isNewRecord = handler.setMusicGameRecord(playerData,
|
||||
MusicGamePlayerData.MusicGameRecord.of()
|
||||
.musicId(req.getMusicBasicId())
|
||||
.maxCombo(req.getMaxCombo())
|
||||
.maxScore(req.getScore())
|
||||
.build());
|
||||
|
||||
// update activity info
|
||||
session.send(new PacketActivityInfoNotify(handler.toProto(playerData, activityManager.getConditionExecutor())));
|
||||
} else {
|
||||
handler.setMusicGameCustomBeatmapRecord(playerData,
|
||||
MusicGamePlayerData.CustomBeatmapRecord.of()
|
||||
.musicShareId(req.getUgcGuid())
|
||||
.score(req.getMaxCombo())
|
||||
.settle(req.getIsSaveScore())
|
||||
.build());
|
||||
}
|
||||
|
||||
|
||||
session.send(new PacketMusicGameSettleRsp(req.getMusicBasicId(), req.getUgcGuid(), isNewRecord));
|
||||
}
|
||||
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.activity.musicgame.MusicGameActivityHandler;
|
||||
import emu.grasscutter.game.activity.musicgame.MusicGamePlayerData;
|
||||
import emu.grasscutter.game.props.ActivityType;
|
||||
import emu.grasscutter.game.props.WatcherTriggerType;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.MusicGameSettleReqOuterClass.MusicGameSettleReq;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketActivityInfoNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketMusicGameSettleRsp;
|
||||
import lombok.val;
|
||||
|
||||
@Opcodes(PacketOpcodes.MusicGameSettleReq)
|
||||
public class HandlerMusicGameSettleReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
val req = MusicGameSettleReq.parseFrom(payload);
|
||||
|
||||
val activityManager = session.getPlayer().getActivityManager();
|
||||
|
||||
val playerDataOpt =
|
||||
activityManager.getPlayerActivityDataByActivityType(ActivityType.NEW_ACTIVITY_MUSIC_GAME);
|
||||
if (playerDataOpt.isEmpty()) {
|
||||
session.send(
|
||||
new PacketMusicGameSettleRsp(
|
||||
RetcodeOuterClass.Retcode.RET_MUSIC_GAME_LEVEL_CONFIG_NOT_FOUND, req));
|
||||
return;
|
||||
}
|
||||
|
||||
val playerData = playerDataOpt.get();
|
||||
val handler = (MusicGameActivityHandler) playerData.getActivityHandler();
|
||||
boolean isNewRecord = false;
|
||||
|
||||
// check if custom beatmap
|
||||
if (req.getUgcGuid() == 0) {
|
||||
session
|
||||
.getPlayer()
|
||||
.getActivityManager()
|
||||
.triggerWatcher(
|
||||
WatcherTriggerType.TRIGGER_FLEUR_FAIR_MUSIC_GAME_REACH_SCORE,
|
||||
String.valueOf(req.getMusicBasicId()),
|
||||
String.valueOf(req.getScore()));
|
||||
|
||||
isNewRecord =
|
||||
handler.setMusicGameRecord(
|
||||
playerData,
|
||||
MusicGamePlayerData.MusicGameRecord.of()
|
||||
.musicId(req.getMusicBasicId())
|
||||
.maxCombo(req.getMaxCombo())
|
||||
.maxScore(req.getScore())
|
||||
.build());
|
||||
|
||||
// update activity info
|
||||
session.send(
|
||||
new PacketActivityInfoNotify(
|
||||
handler.toProto(playerData, activityManager.getConditionExecutor())));
|
||||
} else {
|
||||
handler.setMusicGameCustomBeatmapRecord(
|
||||
playerData,
|
||||
MusicGamePlayerData.CustomBeatmapRecord.of()
|
||||
.musicShareId(req.getUgcGuid())
|
||||
.score(req.getMaxCombo())
|
||||
.settle(req.getIsSaveScore())
|
||||
.build());
|
||||
}
|
||||
|
||||
session.send(
|
||||
new PacketMusicGameSettleRsp(req.getMusicBasicId(), req.getUgcGuid(), isNewRecord));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,67 +1,67 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.binout.MainQuestData;
|
||||
import emu.grasscutter.data.binout.MainQuestData.TalkData;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketNpcTalkRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.NpcTalkReq)
|
||||
public class HandlerNpcTalkReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
NpcTalkReq req = NpcTalkReq.parseFrom(payload);
|
||||
|
||||
// Check if mainQuest exists
|
||||
// remove last 2 digits to get a mainQuestId
|
||||
int talkId = req.getTalkId();
|
||||
int mainQuestId = talkId / 100;
|
||||
MainQuestData mainQuestData = GameData.getMainQuestDataMap().get(mainQuestId);
|
||||
|
||||
if (mainQuestData != null) {
|
||||
// This talk is associated with a quest. Handle it.
|
||||
// If the quest has no talk data defined on it, create one.
|
||||
TalkData talkForQuest = new TalkData(talkId, "");
|
||||
if (mainQuestData.getTalks() != null) {
|
||||
var talks = mainQuestData.getTalks().stream().filter(p -> p.getId() == talkId).toList();
|
||||
|
||||
if (talks.size() > 0) {
|
||||
talkForQuest = talks.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Add to the list of done talks for this quest.
|
||||
var mainQuest = session.getPlayer().getQuestManager().getMainQuestById(mainQuestId);
|
||||
if (mainQuest != null) {
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.getMainQuestById(mainQuestId)
|
||||
.getTalks()
|
||||
.put(talkId, talkForQuest);
|
||||
}
|
||||
|
||||
// Fire quest triggers.
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(
|
||||
QuestContent.QUEST_CONTENT_COMPLETE_ANY_TALK, String.valueOf(req.getTalkId()), 0, 0);
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_COMPLETE_TALK, req.getTalkId(), 0);
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_FINISH_PLOT, req.getTalkId(), 0);
|
||||
}
|
||||
|
||||
session.send(new PacketNpcTalkRsp(req.getNpcEntityId(), req.getTalkId(), req.getEntityId()));
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.binout.MainQuestData;
|
||||
import emu.grasscutter.data.binout.MainQuestData.TalkData;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketNpcTalkRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.NpcTalkReq)
|
||||
public class HandlerNpcTalkReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
NpcTalkReq req = NpcTalkReq.parseFrom(payload);
|
||||
|
||||
// Check if mainQuest exists
|
||||
// remove last 2 digits to get a mainQuestId
|
||||
int talkId = req.getTalkId();
|
||||
int mainQuestId = talkId / 100;
|
||||
MainQuestData mainQuestData = GameData.getMainQuestDataMap().get(mainQuestId);
|
||||
|
||||
if (mainQuestData != null) {
|
||||
// This talk is associated with a quest. Handle it.
|
||||
// If the quest has no talk data defined on it, create one.
|
||||
TalkData talkForQuest = new TalkData(talkId, "");
|
||||
if (mainQuestData.getTalks() != null) {
|
||||
var talks = mainQuestData.getTalks().stream().filter(p -> p.getId() == talkId).toList();
|
||||
|
||||
if (talks.size() > 0) {
|
||||
talkForQuest = talks.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Add to the list of done talks for this quest.
|
||||
var mainQuest = session.getPlayer().getQuestManager().getMainQuestById(mainQuestId);
|
||||
if (mainQuest != null) {
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.getMainQuestById(mainQuestId)
|
||||
.getTalks()
|
||||
.put(talkId, talkForQuest);
|
||||
}
|
||||
|
||||
// Fire quest triggers.
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(
|
||||
QuestContent.QUEST_CONTENT_COMPLETE_ANY_TALK, String.valueOf(req.getTalkId()), 0, 0);
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_COMPLETE_TALK, req.getTalkId(), 0);
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_FINISH_PLOT, req.getTalkId(), 0);
|
||||
}
|
||||
|
||||
session.send(new PacketNpcTalkRsp(req.getNpcEntityId(), req.getTalkId(), req.getEntityId()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.props.SceneType;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketPostEnterSceneRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.PostEnterSceneReq)
|
||||
public class HandlerPostEnterSceneReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
if (session.getPlayer().getScene().getSceneType() == SceneType.SCENE_ROOM) {
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_ENTER_ROOM, session.getPlayer().getSceneId(), 0);
|
||||
}
|
||||
|
||||
session.send(new PacketPostEnterSceneRsp(session.getPlayer()));
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.props.SceneType;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketPostEnterSceneRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.PostEnterSceneReq)
|
||||
public class HandlerPostEnterSceneReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
if (session.getPlayer().getScene().getSceneType() == SceneType.SCENE_ROOM) {
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(QuestContent.QUEST_CONTENT_ENTER_ROOM, session.getPlayer().getSceneId(), 0);
|
||||
}
|
||||
|
||||
session.send(new PacketPostEnterSceneRsp(session.getPlayer()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
//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.RemoveCustomTeamReqOuterClass.RemoveCustomTeamReq;
|
||||
//import emu.grasscutter.server.game.GameSession;
|
||||
//
|
||||
//@Opcodes(PacketOpcodes.RemoveCustomTeamReq)
|
||||
//public class HandlerRemoveCustomTeamReq extends PacketHandler {
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// RemoveCustomTeamReq req = RemoveCustomTeamReq.parseFrom(payload);
|
||||
// session.getPlayer().getTeamManager().removeCustomTeam(req.getId());
|
||||
// }
|
||||
//}
|
||||
// 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.RemoveCustomTeamReqOuterClass.RemoveCustomTeamReq;
|
||||
// import emu.grasscutter.server.game.GameSession;
|
||||
//
|
||||
// @Opcodes(PacketOpcodes.RemoveCustomTeamReq)
|
||||
// public class HandlerRemoveCustomTeamReq extends PacketHandler {
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// RemoveCustomTeamReq req = RemoveCustomTeamReq.parseFrom(payload);
|
||||
// session.getPlayer().getTeamManager().removeCustomTeam(req.getId());
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,97 +1,102 @@
|
||||
//package emu.grasscutter.server.packet.recv;
|
||||
//
|
||||
//import emu.grasscutter.database.DatabaseHelper;
|
||||
//import emu.grasscutter.game.activity.musicgame.MusicGameActivityHandler;
|
||||
//import emu.grasscutter.game.activity.musicgame.MusicGameBeatmap;
|
||||
//import emu.grasscutter.game.activity.musicgame.MusicGamePlayerData;
|
||||
//import emu.grasscutter.game.props.ActivityType;
|
||||
//import emu.grasscutter.net.packet.Opcodes;
|
||||
//import emu.grasscutter.net.packet.PacketHandler;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
//import emu.grasscutter.net.proto.SaveUgcReqOuterClass;
|
||||
//import emu.grasscutter.net.proto.UgcTypeOuterClass;
|
||||
//import emu.grasscutter.server.game.GameSession;
|
||||
//import emu.grasscutter.server.packet.send.PacketActivityInfoNotify;
|
||||
//import emu.grasscutter.server.packet.send.PacketMusicGameCreateBeatmapRsp;
|
||||
//import emu.grasscutter.utils.Utils;
|
||||
//import java.util.Objects;
|
||||
//import lombok.val;
|
||||
//
|
||||
//@Opcodes(PacketOpcodes.SaveUgcReq)
|
||||
//public class HandlerSaveUgcReq extends PacketHandler {
|
||||
//
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// val req = SaveUgcReqOuterClass.SaveUgcReq.parseFrom(payload);
|
||||
//
|
||||
// // We only support music game user generated content
|
||||
// if (req.getUgcType() != UgcTypeOuterClass.UgcType.UGC_TYPE_MUSIC_GAME) {
|
||||
// session.send(
|
||||
// new PacketMusicGameCreateBeatmapRsp(
|
||||
// RetcodeOuterClass.Retcode.RET_UGC_DISABLED, req.getUgcType()));
|
||||
// return;
|
||||
// }
|
||||
// val briefInfo = req.getMusicBriefInfo();
|
||||
//
|
||||
// val musicGameBeatmap =
|
||||
// MusicGameBeatmap.of()
|
||||
// .musicId(briefInfo.getMusicId())
|
||||
// .musicNoteCount(briefInfo.getNoteCount())
|
||||
// .savePosition(briefInfo.getSaveIdx())
|
||||
// .savePageType(briefInfo.getSavePageType())
|
||||
// .version(briefInfo.getVersion())
|
||||
// .afterNoteList(briefInfo.getAfterNoteListList())
|
||||
// .beforeNoteList(briefInfo.getBeforeNoteListList())
|
||||
// .timeLineEditTime(briefInfo.getTimeLineEditTime())
|
||||
// .publishTime(briefInfo.getPublishTime())
|
||||
// .realTimeEditTime(briefInfo.getRealTimeEditTime())
|
||||
// .maxScore(briefInfo.getMaxScore())
|
||||
// .authorUid(session.getPlayer().getUid())
|
||||
// .beatmap(MusicGameBeatmap.parse(req.getMusicRecord().getMusicTrackListList()))
|
||||
// .createTime(Utils.getCurrentSeconds())
|
||||
// .build();
|
||||
//
|
||||
// musicGameBeatmap.save();
|
||||
//
|
||||
// val playerData =
|
||||
// session
|
||||
// .getPlayer()
|
||||
// .getActivityManager()
|
||||
// .getPlayerActivityDataByActivityType(ActivityType.NEW_ACTIVITY_MUSIC_GAME);
|
||||
// if (playerData.isEmpty()) {
|
||||
// session.send(
|
||||
// new PacketMusicGameCreateBeatmapRsp(
|
||||
// RetcodeOuterClass.Retcode.RET_UGC_DATA_NOT_FOUND, req.getUgcType()));
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// val handler = (MusicGameActivityHandler) playerData.get().getActivityHandler();
|
||||
// val musicGamePlayerData = handler.getMusicGamePlayerData(playerData.get());
|
||||
//
|
||||
// val oldBeatmap =
|
||||
// musicGamePlayerData.getPersonalCustomBeatmapRecord().values().stream()
|
||||
// .map(MusicGamePlayerData.CustomBeatmapRecord::getMusicShareId)
|
||||
// .map(DatabaseHelper::getMusicGameBeatmap)
|
||||
// .filter(Objects::nonNull)
|
||||
// .filter(item -> item.getAuthorUid() == session.getPlayer().getUid())
|
||||
// .filter(item -> item.getMusicId() == req.getMusicBriefInfo().getMusicId())
|
||||
// .filter(item -> item.getSavePosition() == req.getMusicBriefInfo().getSaveIdx())
|
||||
// .findFirst();
|
||||
//
|
||||
// // delete old beatmap for player
|
||||
// // the old beatmap is still in database so that others can still play.
|
||||
// oldBeatmap.ifPresent(i -> handler.removePersonalBeatmap(playerData.get(), i));
|
||||
//
|
||||
// // link this beatmap to player's personal data
|
||||
// handler.addPersonalBeatmap(playerData.get(), musicGameBeatmap);
|
||||
//
|
||||
// session.send(
|
||||
// new PacketActivityInfoNotify(
|
||||
// handler.toProto(
|
||||
// playerData.get(),
|
||||
// session.getPlayer().getActivityManager().getConditionExecutor())));
|
||||
// session.send(
|
||||
// new PacketMusicGameCreateBeatmapRsp(musicGameBeatmap.getMusicShareId(), req.getUgcType()));
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.recv;
|
||||
//
|
||||
// import emu.grasscutter.database.DatabaseHelper;
|
||||
// import emu.grasscutter.game.activity.musicgame.MusicGameActivityHandler;
|
||||
// import emu.grasscutter.game.activity.musicgame.MusicGameBeatmap;
|
||||
// import emu.grasscutter.game.activity.musicgame.MusicGamePlayerData;
|
||||
// import emu.grasscutter.game.props.ActivityType;
|
||||
// import emu.grasscutter.net.packet.Opcodes;
|
||||
// import emu.grasscutter.net.packet.PacketHandler;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
// import emu.grasscutter.net.proto.SaveUgcReqOuterClass;
|
||||
// import emu.grasscutter.net.proto.UgcTypeOuterClass;
|
||||
// import emu.grasscutter.server.game.GameSession;
|
||||
// import emu.grasscutter.server.packet.send.PacketActivityInfoNotify;
|
||||
// import emu.grasscutter.server.packet.send.PacketMusicGameCreateBeatmapRsp;
|
||||
// import emu.grasscutter.utils.Utils;
|
||||
// import java.util.Objects;
|
||||
// import lombok.val;
|
||||
//
|
||||
// @Opcodes(PacketOpcodes.SaveUgcReq)
|
||||
// public class HandlerSaveUgcReq extends PacketHandler {
|
||||
//
|
||||
// @Override
|
||||
// public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
// val req = SaveUgcReqOuterClass.SaveUgcReq.parseFrom(payload);
|
||||
//
|
||||
// // We only support music game user generated content
|
||||
// if (req.getUgcType() != UgcTypeOuterClass.UgcType.UGC_TYPE_MUSIC_GAME) {
|
||||
// session.send(
|
||||
// new PacketMusicGameCreateBeatmapRsp(
|
||||
// RetcodeOuterClass.Retcode.RET_UGC_DISABLED, req.getUgcType()));
|
||||
// return;
|
||||
// }
|
||||
// val briefInfo = req.getMusicBriefInfo();
|
||||
//
|
||||
// val musicGameBeatmap =
|
||||
// MusicGameBeatmap.of()
|
||||
// .musicId(briefInfo.getMusicId())
|
||||
// .musicNoteCount(briefInfo.getNoteCount())
|
||||
// .savePosition(briefInfo.getSaveIdx())
|
||||
// .savePageType(briefInfo.getSavePageType())
|
||||
// .version(briefInfo.getVersion())
|
||||
// .afterNoteList(briefInfo.getAfterNoteListList())
|
||||
// .beforeNoteList(briefInfo.getBeforeNoteListList())
|
||||
// .timeLineEditTime(briefInfo.getTimeLineEditTime())
|
||||
// .publishTime(briefInfo.getPublishTime())
|
||||
// .realTimeEditTime(briefInfo.getRealTimeEditTime())
|
||||
// .maxScore(briefInfo.getMaxScore())
|
||||
// .authorUid(session.getPlayer().getUid())
|
||||
//
|
||||
// .beatmap(MusicGameBeatmap.parse(req.getMusicRecord().getMusicTrackListList()))
|
||||
// .createTime(Utils.getCurrentSeconds())
|
||||
// .build();
|
||||
//
|
||||
// musicGameBeatmap.save();
|
||||
//
|
||||
// val playerData =
|
||||
// session
|
||||
// .getPlayer()
|
||||
// .getActivityManager()
|
||||
//
|
||||
// .getPlayerActivityDataByActivityType(ActivityType.NEW_ACTIVITY_MUSIC_GAME);
|
||||
// if (playerData.isEmpty()) {
|
||||
// session.send(
|
||||
// new PacketMusicGameCreateBeatmapRsp(
|
||||
// RetcodeOuterClass.Retcode.RET_UGC_DATA_NOT_FOUND, req.getUgcType()));
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// val handler = (MusicGameActivityHandler) playerData.get().getActivityHandler();
|
||||
// val musicGamePlayerData = handler.getMusicGamePlayerData(playerData.get());
|
||||
//
|
||||
// val oldBeatmap =
|
||||
// musicGamePlayerData.getPersonalCustomBeatmapRecord().values().stream()
|
||||
// .map(MusicGamePlayerData.CustomBeatmapRecord::getMusicShareId)
|
||||
// .map(DatabaseHelper::getMusicGameBeatmap)
|
||||
// .filter(Objects::nonNull)
|
||||
// .filter(item -> item.getAuthorUid() == session.getPlayer().getUid())
|
||||
// .filter(item -> item.getMusicId() == req.getMusicBriefInfo().getMusicId())
|
||||
// .filter(item -> item.getSavePosition() ==
|
||||
// req.getMusicBriefInfo().getSaveIdx())
|
||||
// .findFirst();
|
||||
//
|
||||
// // delete old beatmap for player
|
||||
// // the old beatmap is still in database so that others can still play.
|
||||
// oldBeatmap.ifPresent(i -> handler.removePersonalBeatmap(playerData.get(), i));
|
||||
//
|
||||
// // link this beatmap to player's personal data
|
||||
// handler.addPersonalBeatmap(playerData.get(), musicGameBeatmap);
|
||||
//
|
||||
// session.send(
|
||||
// new PacketActivityInfoNotify(
|
||||
// handler.toProto(
|
||||
// playerData.get(),
|
||||
//
|
||||
// session.getPlayer().getActivityManager().getConditionExecutor())));
|
||||
// session.send(
|
||||
// new PacketMusicGameCreateBeatmapRsp(musicGameBeatmap.getMusicShareId(),
|
||||
// req.getUgcType()));
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,39 +1,49 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SelectWorktopOptionReqOuterClass.SelectWorktopOptionReq;
|
||||
import emu.grasscutter.scripts.constants.EventType;
|
||||
import emu.grasscutter.scripts.data.ScriptArgs;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketSelectWorktopOptionRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.SelectWorktopOptionReq)
|
||||
public class HandlerSelectWorktopOptionReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
SelectWorktopOptionReq req = SelectWorktopOptionReq.parseFrom(payload);
|
||||
|
||||
try {
|
||||
GameEntity entity = session.getPlayer().getScene().getEntityById(req.getGadgetEntityId());
|
||||
|
||||
if (!(entity instanceof EntityGadget)) {
|
||||
return;
|
||||
}
|
||||
session.getPlayer().getScene().selectWorktopOptionWith(req);
|
||||
session.getPlayer().getScene().getScriptManager().callEvent(
|
||||
new ScriptArgs(entity.getGroupId(), EventType.EVENT_SELECT_OPTION, entity.getConfigId(), req.getOptionId())
|
||||
);
|
||||
session.getPlayer().getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_WORKTOP_SELECT, entity.getConfigId(), req.getOptionId());
|
||||
} finally {
|
||||
// Always send packet
|
||||
session.send(new PacketSelectWorktopOptionRsp(req.getGadgetEntityId(), req.getOptionId()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.quest.enums.QuestContent;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SelectWorktopOptionReqOuterClass.SelectWorktopOptionReq;
|
||||
import emu.grasscutter.scripts.constants.EventType;
|
||||
import emu.grasscutter.scripts.data.ScriptArgs;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketSelectWorktopOptionRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.SelectWorktopOptionReq)
|
||||
public class HandlerSelectWorktopOptionReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
SelectWorktopOptionReq req = SelectWorktopOptionReq.parseFrom(payload);
|
||||
|
||||
try {
|
||||
GameEntity entity = session.getPlayer().getScene().getEntityById(req.getGadgetEntityId());
|
||||
|
||||
if (!(entity instanceof EntityGadget)) {
|
||||
return;
|
||||
}
|
||||
session.getPlayer().getScene().selectWorktopOptionWith(req);
|
||||
session
|
||||
.getPlayer()
|
||||
.getScene()
|
||||
.getScriptManager()
|
||||
.callEvent(
|
||||
new ScriptArgs(
|
||||
entity.getGroupId(),
|
||||
EventType.EVENT_SELECT_OPTION,
|
||||
entity.getConfigId(),
|
||||
req.getOptionId()));
|
||||
session
|
||||
.getPlayer()
|
||||
.getQuestManager()
|
||||
.queueEvent(
|
||||
QuestContent.QUEST_CONTENT_WORKTOP_SELECT, entity.getConfigId(), req.getOptionId());
|
||||
} finally {
|
||||
// Always send packet
|
||||
session.send(new PacketSelectWorktopOptionRsp(req.getGadgetEntityId(), req.getOptionId()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +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.SkipPlayerGameTimeReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerGameTimeNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketSkipPlayerGameTimeRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.SkipPlayerGameTimeReq)
|
||||
public class HandlerSkipPlayerGameTimeReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = SkipPlayerGameTimeReqOuterClass.SkipPlayerGameTimeReq.parseFrom(payload);
|
||||
var player = session.getPlayer();
|
||||
player.updatePlayerGameTime(req.getGameTime());
|
||||
player.getScene().broadcastPacket(new PacketPlayerGameTimeNotify(player));
|
||||
player.sendPacket(new PacketSkipPlayerGameTimeRsp(req));
|
||||
}
|
||||
}
|
||||
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.SkipPlayerGameTimeReqOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerGameTimeNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketSkipPlayerGameTimeRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.SkipPlayerGameTimeReq)
|
||||
public class HandlerSkipPlayerGameTimeReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = SkipPlayerGameTimeReqOuterClass.SkipPlayerGameTimeReq.parseFrom(payload);
|
||||
var player = session.getPlayer();
|
||||
player.updatePlayerGameTime(req.getGameTime());
|
||||
player.getScene().broadcastPacket(new PacketPlayerGameTimeNotify(player));
|
||||
player.sendPacket(new PacketSkipPlayerGameTimeRsp(req));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,28 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.game.entity.gadget.platform.AbilityRoute;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.UpdateAbilityCreatedMovingPlatformNotifyOuterClass.UpdateAbilityCreatedMovingPlatformNotify;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
@Opcodes(PacketOpcodes.UpdateAbilityCreatedMovingPlatformNotify)
|
||||
public class HandlerUpdateAbilityCreatedMovingPlatformNotify extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var notify = UpdateAbilityCreatedMovingPlatformNotify.parseFrom(payload);
|
||||
var entity = session.getPlayer().getScene().getEntityById(notify.getEntityId());
|
||||
|
||||
if (!(entity instanceof EntityGadget entityGadget) || !(entityGadget.getRouteConfig() instanceof AbilityRoute)) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (notify.getOpType()) {
|
||||
case OP_TYPE_ACTIVATE -> entityGadget.startPlatform();
|
||||
case OP_TYPE_DEACTIVATE -> entityGadget.stopPlatform();
|
||||
}
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.game.entity.gadget.platform.AbilityRoute;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.UpdateAbilityCreatedMovingPlatformNotifyOuterClass.UpdateAbilityCreatedMovingPlatformNotify;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
@Opcodes(PacketOpcodes.UpdateAbilityCreatedMovingPlatformNotify)
|
||||
public class HandlerUpdateAbilityCreatedMovingPlatformNotify extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var notify = UpdateAbilityCreatedMovingPlatformNotify.parseFrom(payload);
|
||||
var entity = session.getPlayer().getScene().getEntityById(notify.getEntityId());
|
||||
|
||||
if (!(entity instanceof EntityGadget entityGadget)
|
||||
|| !(entityGadget.getRouteConfig() instanceof AbilityRoute)) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (notify.getOpType()) {
|
||||
case OP_TYPE_ACTIVATE -> entityGadget.startPlatform();
|
||||
case OP_TYPE_DEACTIVATE -> entityGadget.stopPlatform();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
//package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
//import emu.grasscutter.net.packet.BasePacket;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//import emu.grasscutter.net.proto.AddCustomTeamRspOuterClass.AddCustomTeamRsp;
|
||||
//import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
//
|
||||
//public class PacketAddCustomTeamRsp extends BasePacket {
|
||||
// public PacketAddCustomTeamRsp(Retcode retcode) {
|
||||
// super(PacketOpcodes.AddCustomTeamRsp);
|
||||
//
|
||||
// AddCustomTeamRsp proto = AddCustomTeamRsp.newBuilder().setRetcode(retcode.getNumber()).build();
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
//
|
||||
// public PacketAddCustomTeamRsp() {
|
||||
// this(Retcode.RET_SUCC);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.AddCustomTeamRspOuterClass.AddCustomTeamRsp;
|
||||
// import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
//
|
||||
// public class PacketAddCustomTeamRsp extends BasePacket {
|
||||
// public PacketAddCustomTeamRsp(Retcode retcode) {
|
||||
// super(PacketOpcodes.AddCustomTeamRsp);
|
||||
//
|
||||
// AddCustomTeamRsp proto =
|
||||
// AddCustomTeamRsp.newBuilder().setRetcode(retcode.getNumber()).build();
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
//
|
||||
// public PacketAddCustomTeamRsp() {
|
||||
// this(Retcode.RET_SUCC);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,61 +1,61 @@
|
||||
//package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
//import emu.grasscutter.net.packet.BasePacket;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//import emu.grasscutter.net.proto.BeginCameraSceneLookNotifyOuterClass.BeginCameraSceneLookNotify;
|
||||
//import emu.grasscutter.utils.Position;
|
||||
//import java.util.ArrayList;
|
||||
//import java.util.Collection;
|
||||
//import lombok.Data;
|
||||
//import lombok.NoArgsConstructor;
|
||||
//
|
||||
//public class PacketBeginCameraSceneLookNotify extends BasePacket {
|
||||
//
|
||||
// public PacketBeginCameraSceneLookNotify(CameraSceneLookNotify parameters) {
|
||||
// super(PacketOpcodes.BeginCameraSceneLookNotify);
|
||||
// var builder =
|
||||
// BeginCameraSceneLookNotify.newBuilder()
|
||||
// .setLookPos(parameters.lookPos.toProto())
|
||||
// .setFollowPos(parameters.followPos.toProto())
|
||||
// .setDuration(parameters.duration)
|
||||
// .setIsAllowInput(parameters.isAllowInput)
|
||||
// .setIsSetFollowPos(parameters.setFollowPos)
|
||||
// .setIsSetScreenXy(parameters.isScreenXY)
|
||||
// .setIsRecoverKeepCurrent(parameters.recoverKeepCurrent)
|
||||
// .setIsChangePlayMode(parameters.isChangePlayMode)
|
||||
// .setScreenY(parameters.screenY)
|
||||
// .setScreenX(parameters.screenX)
|
||||
// .setIsForce(parameters.isForce)
|
||||
// .setIsForce(parameters.isForceWalk)
|
||||
// .setEntityId(parameters.entityId)
|
||||
// .addAllOtherParams(parameters.otherParams);
|
||||
// this.setData(builder);
|
||||
// }
|
||||
//
|
||||
// // TODO check default values
|
||||
// // todo find missing field usages:
|
||||
// // enum Unk2700_HIAKNNCKHJB (Unk2700_LNCHDDOOECD)
|
||||
// // Unk3000_MNLLCJMPMNH (uint32)
|
||||
// // Unk2700_DHAHEKOGHBJ (float)
|
||||
// // Unk3000_IEFIKMHCKDH (uint32)
|
||||
// // Unk3000_OGCLMFFADBD (float)
|
||||
//
|
||||
// @Data
|
||||
// @NoArgsConstructor
|
||||
// public static class CameraSceneLookNotify {
|
||||
// Position lookPos = new Position();
|
||||
// Position followPos = new Position();
|
||||
// float duration = 0.0f;
|
||||
// boolean isAllowInput = true;
|
||||
// boolean setFollowPos = false;
|
||||
// boolean isScreenXY = false;
|
||||
// boolean recoverKeepCurrent = true;
|
||||
// boolean isForceWalk = false;
|
||||
// boolean isForce = false;
|
||||
// boolean isChangePlayMode = false;
|
||||
// float screenY = 0.0f;
|
||||
// float screenX = 0.0f;
|
||||
// int entityId = 0;
|
||||
// Collection<String> otherParams = new ArrayList<>(0);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.BeginCameraSceneLookNotifyOuterClass.BeginCameraSceneLookNotify;
|
||||
// import emu.grasscutter.utils.Position;
|
||||
// import java.util.ArrayList;
|
||||
// import java.util.Collection;
|
||||
// import lombok.Data;
|
||||
// import lombok.NoArgsConstructor;
|
||||
//
|
||||
// public class PacketBeginCameraSceneLookNotify extends BasePacket {
|
||||
//
|
||||
// public PacketBeginCameraSceneLookNotify(CameraSceneLookNotify parameters) {
|
||||
// super(PacketOpcodes.BeginCameraSceneLookNotify);
|
||||
// var builder =
|
||||
// BeginCameraSceneLookNotify.newBuilder()
|
||||
// .setLookPos(parameters.lookPos.toProto())
|
||||
// .setFollowPos(parameters.followPos.toProto())
|
||||
// .setDuration(parameters.duration)
|
||||
// .setIsAllowInput(parameters.isAllowInput)
|
||||
// .setIsSetFollowPos(parameters.setFollowPos)
|
||||
// .setIsSetScreenXy(parameters.isScreenXY)
|
||||
// .setIsRecoverKeepCurrent(parameters.recoverKeepCurrent)
|
||||
// .setIsChangePlayMode(parameters.isChangePlayMode)
|
||||
// .setScreenY(parameters.screenY)
|
||||
// .setScreenX(parameters.screenX)
|
||||
// .setIsForce(parameters.isForce)
|
||||
// .setIsForce(parameters.isForceWalk)
|
||||
// .setEntityId(parameters.entityId)
|
||||
// .addAllOtherParams(parameters.otherParams);
|
||||
// this.setData(builder);
|
||||
// }
|
||||
//
|
||||
// // TODO check default values
|
||||
// // todo find missing field usages:
|
||||
// // enum Unk2700_HIAKNNCKHJB (Unk2700_LNCHDDOOECD)
|
||||
// // Unk3000_MNLLCJMPMNH (uint32)
|
||||
// // Unk2700_DHAHEKOGHBJ (float)
|
||||
// // Unk3000_IEFIKMHCKDH (uint32)
|
||||
// // Unk3000_OGCLMFFADBD (float)
|
||||
//
|
||||
// @Data
|
||||
// @NoArgsConstructor
|
||||
// public static class CameraSceneLookNotify {
|
||||
// Position lookPos = new Position();
|
||||
// Position followPos = new Position();
|
||||
// float duration = 0.0f;
|
||||
// boolean isAllowInput = true;
|
||||
// boolean setFollowPos = false;
|
||||
// boolean isScreenXY = false;
|
||||
// boolean recoverKeepCurrent = true;
|
||||
// boolean isForceWalk = false;
|
||||
// boolean isForce = false;
|
||||
// boolean isChangePlayMode = false;
|
||||
// float screenY = 0.0f;
|
||||
// float screenX = 0.0f;
|
||||
// int entityId = 0;
|
||||
// Collection<String> otherParams = new ArrayList<>(0);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
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.ChangeGameTimeRspOuterClass.ChangeGameTimeRsp;
|
||||
|
||||
public class PacketChangeGameTimeRsp extends BasePacket {
|
||||
|
||||
public PacketChangeGameTimeRsp(Player player) {
|
||||
super(PacketOpcodes.ChangeGameTimeRsp);
|
||||
|
||||
ChangeGameTimeRsp proto =
|
||||
ChangeGameTimeRsp.newBuilder().setCurGameTime(player.getWorld().getGameTime()).build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
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.ChangeGameTimeRspOuterClass.ChangeGameTimeRsp;
|
||||
|
||||
public class PacketChangeGameTimeRsp extends BasePacket {
|
||||
|
||||
public PacketChangeGameTimeRsp(Player player) {
|
||||
super(PacketOpcodes.ChangeGameTimeRsp);
|
||||
|
||||
ChangeGameTimeRsp proto =
|
||||
ChangeGameTimeRsp.newBuilder().setCurGameTime(player.getWorld().getGameTime()).build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
//package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
//import emu.grasscutter.net.packet.BasePacket;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//import emu.grasscutter.net.proto.Unk2700FJEHHCPCBLGServerNotify;
|
||||
//
|
||||
//public class PacketChangeHomeBgmNotify extends BasePacket {
|
||||
// public PacketChangeHomeBgmNotify(int homeBgmId) {
|
||||
// super(PacketOpcodes.Unk2700_FJEHHCPCBLG_ServerNotify);
|
||||
//
|
||||
// var notify =
|
||||
// Unk2700FJEHHCPCBLGServerNotify.Unk2700_FJEHHCPCBLG_ServerNotify.newBuilder()
|
||||
// .setUnk2700BJHAMKKECEI(homeBgmId)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(notify);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.Unk2700FJEHHCPCBLGServerNotify;
|
||||
//
|
||||
// public class PacketChangeHomeBgmNotify extends BasePacket {
|
||||
// public PacketChangeHomeBgmNotify(int homeBgmId) {
|
||||
// super(PacketOpcodes.Unk2700_FJEHHCPCBLG_ServerNotify);
|
||||
//
|
||||
// var notify =
|
||||
// Unk2700FJEHHCPCBLGServerNotify.Unk2700_FJEHHCPCBLG_ServerNotify.newBuilder()
|
||||
// .setUnk2700BJHAMKKECEI(homeBgmId)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(notify);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
//package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
//import emu.grasscutter.net.packet.BasePacket;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//import emu.grasscutter.net.proto.Unk2700OGHMHELMBNNServerRsp;
|
||||
//
|
||||
//public class PacketChangeHomeBgmRsp extends BasePacket {
|
||||
// public PacketChangeHomeBgmRsp() {
|
||||
// super(PacketOpcodes.Unk2700_OGHMHELMBNN_ServerRsp);
|
||||
//
|
||||
// var rsp =
|
||||
// Unk2700OGHMHELMBNNServerRsp.Unk2700_OGHMHELMBNN_ServerRsp.newBuilder()
|
||||
// .setRetcode(0)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(rsp);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.Unk2700OGHMHELMBNNServerRsp;
|
||||
//
|
||||
// public class PacketChangeHomeBgmRsp extends BasePacket {
|
||||
// public PacketChangeHomeBgmRsp() {
|
||||
// super(PacketOpcodes.Unk2700_OGHMHELMBNN_ServerRsp);
|
||||
//
|
||||
// var rsp =
|
||||
// Unk2700OGHMHELMBNNServerRsp.Unk2700_OGHMHELMBNN_ServerRsp.newBuilder()
|
||||
// .setRetcode(0)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(rsp);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,29 +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.CustomTeamListNotifyOuterClass.CustomTeamListNotify;
|
||||
//
|
||||
//public class PacketCustomTeamListNotify extends BasePacket {
|
||||
// public PacketCustomTeamListNotify(Player player) {
|
||||
// super(PacketOpcodes.CustomTeamListNotify);
|
||||
//
|
||||
// CustomTeamListNotify.Builder proto = CustomTeamListNotify.newBuilder();
|
||||
//
|
||||
// // Add the id list for custom teams.
|
||||
// for (int id : player.getTeamManager().getTeams().keySet()) {
|
||||
// if (id > 4) {
|
||||
// proto.addCustomTeamIds(id);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // Add the avatar lists for all the teams the player has.
|
||||
// player
|
||||
// .getTeamManager()
|
||||
// .getTeams()
|
||||
// .forEach((id, teamInfo) -> proto.putAvatarTeamMap(id, teamInfo.toProto(player)));
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
//}
|
||||
// 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.CustomTeamListNotifyOuterClass.CustomTeamListNotify;
|
||||
//
|
||||
// public class PacketCustomTeamListNotify extends BasePacket {
|
||||
// public PacketCustomTeamListNotify(Player player) {
|
||||
// super(PacketOpcodes.CustomTeamListNotify);
|
||||
//
|
||||
// CustomTeamListNotify.Builder proto = CustomTeamListNotify.newBuilder();
|
||||
//
|
||||
// // Add the id list for custom teams.
|
||||
// for (int id : player.getTeamManager().getTeams().keySet()) {
|
||||
// if (id > 4) {
|
||||
// proto.addCustomTeamIds(id);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // Add the avatar lists for all the teams the player has.
|
||||
// player
|
||||
// .getTeamManager()
|
||||
// .getTeams()
|
||||
// .forEach((id, teamInfo) -> proto.putAvatarTeamMap(id, teamInfo.toProto(player)));
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.dungeons.dungeon_results.BaseDungeonResult;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
|
||||
public class PacketDungeonSettleNotify extends BasePacket {
|
||||
public PacketDungeonSettleNotify(BaseDungeonResult result) {
|
||||
super(PacketOpcodes.DungeonSettleNotify);
|
||||
|
||||
this.setData(result.getProto());
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.dungeons.dungeon_results.BaseDungeonResult;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
|
||||
public class PacketDungeonSettleNotify extends BasePacket {
|
||||
public PacketDungeonSettleNotify(BaseDungeonResult result) {
|
||||
super(PacketOpcodes.DungeonSettleNotify);
|
||||
|
||||
this.setData(result.getProto());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,31 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EntityFightPropUpdateNotifyOuterClass.EntityFightPropUpdateNotify;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class PacketEntityFightPropUpdateNotify extends BasePacket {
|
||||
public PacketEntityFightPropUpdateNotify(GameEntity entity, FightProperty prop) {
|
||||
super(PacketOpcodes.EntityFightPropUpdateNotify);
|
||||
|
||||
EntityFightPropUpdateNotify proto =
|
||||
EntityFightPropUpdateNotify.newBuilder()
|
||||
.setEntityId(entity.getId())
|
||||
.putFightPropMap(prop.getId(), entity.getFightProperty(prop))
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketEntityFightPropUpdateNotify(GameEntity entity, Collection<FightProperty> props) {
|
||||
super(PacketOpcodes.EntityFightPropUpdateNotify);
|
||||
|
||||
var protoBuilder = EntityFightPropUpdateNotify.newBuilder()
|
||||
.setEntityId(entity.getId());
|
||||
props.forEach(p -> protoBuilder.putFightPropMap(p.getId(), entity.getFightProperty(p)));
|
||||
|
||||
this.setData(protoBuilder);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.GameEntity;
|
||||
import emu.grasscutter.game.props.FightProperty;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.EntityFightPropUpdateNotifyOuterClass.EntityFightPropUpdateNotify;
|
||||
import java.util.Collection;
|
||||
|
||||
public class PacketEntityFightPropUpdateNotify extends BasePacket {
|
||||
public PacketEntityFightPropUpdateNotify(GameEntity entity, FightProperty prop) {
|
||||
super(PacketOpcodes.EntityFightPropUpdateNotify);
|
||||
|
||||
EntityFightPropUpdateNotify proto =
|
||||
EntityFightPropUpdateNotify.newBuilder()
|
||||
.setEntityId(entity.getId())
|
||||
.putFightPropMap(prop.getId(), entity.getFightProperty(prop))
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketEntityFightPropUpdateNotify(GameEntity entity, Collection<FightProperty> props) {
|
||||
super(PacketOpcodes.EntityFightPropUpdateNotify);
|
||||
|
||||
var protoBuilder = EntityFightPropUpdateNotify.newBuilder().setEntityId(entity.getId());
|
||||
props.forEach(p -> protoBuilder.putFightPropMap(p.getId(), entity.getFightProperty(p)));
|
||||
|
||||
this.setData(protoBuilder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.GameMainQuest;
|
||||
import emu.grasscutter.game.quest.enums.ParentQuestState;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.FinishedParentQuestNotifyOuterClass.FinishedParentQuestNotify;
|
||||
|
||||
public class PacketFinishedParentQuestNotify extends BasePacket {
|
||||
|
||||
public PacketFinishedParentQuestNotify(Player player) {
|
||||
super(PacketOpcodes.FinishedParentQuestNotify, true);
|
||||
|
||||
FinishedParentQuestNotify.Builder proto = FinishedParentQuestNotify.newBuilder();
|
||||
|
||||
for (GameMainQuest mainQuest : player.getQuestManager().getMainQuests().values()) {
|
||||
//Canceled Quests do not appear in this packet
|
||||
if (mainQuest.getState() != ParentQuestState.PARENT_QUEST_STATE_CANCELED) {
|
||||
proto.addParentQuestList(mainQuest.toProto(false));
|
||||
}
|
||||
}
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.quest.GameMainQuest;
|
||||
import emu.grasscutter.game.quest.enums.ParentQuestState;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.FinishedParentQuestNotifyOuterClass.FinishedParentQuestNotify;
|
||||
|
||||
public class PacketFinishedParentQuestNotify extends BasePacket {
|
||||
|
||||
public PacketFinishedParentQuestNotify(Player player) {
|
||||
super(PacketOpcodes.FinishedParentQuestNotify, true);
|
||||
|
||||
FinishedParentQuestNotify.Builder proto = FinishedParentQuestNotify.newBuilder();
|
||||
|
||||
for (GameMainQuest mainQuest : player.getQuestManager().getMainQuests().values()) {
|
||||
// Canceled Quests do not appear in this packet
|
||||
if (mainQuest.getState() != ParentQuestState.PARENT_QUEST_STATE_CANCELED) {
|
||||
proto.addParentQuestList(mainQuest.toProto(false));
|
||||
}
|
||||
}
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.quest.GameMainQuest;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.FinishedParentQuestUpdateNotifyOuterClass.FinishedParentQuestUpdateNotify;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PacketFinishedParentQuestUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketFinishedParentQuestUpdateNotify(GameMainQuest quest) {
|
||||
super(PacketOpcodes.FinishedParentQuestUpdateNotify);
|
||||
|
||||
FinishedParentQuestUpdateNotify proto = FinishedParentQuestUpdateNotify.newBuilder()
|
||||
.addParentQuestList(quest.toProto(true))
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketFinishedParentQuestUpdateNotify(List<GameMainQuest> quests) {
|
||||
super(PacketOpcodes.FinishedParentQuestUpdateNotify);
|
||||
|
||||
var proto = FinishedParentQuestUpdateNotify.newBuilder();
|
||||
|
||||
for (GameMainQuest mainQuest : quests) {
|
||||
proto.addParentQuestList(mainQuest.toProto(true));
|
||||
}
|
||||
proto.build();
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.quest.GameMainQuest;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.FinishedParentQuestUpdateNotifyOuterClass.FinishedParentQuestUpdateNotify;
|
||||
import java.util.List;
|
||||
|
||||
public class PacketFinishedParentQuestUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketFinishedParentQuestUpdateNotify(GameMainQuest quest) {
|
||||
super(PacketOpcodes.FinishedParentQuestUpdateNotify);
|
||||
|
||||
FinishedParentQuestUpdateNotify proto =
|
||||
FinishedParentQuestUpdateNotify.newBuilder()
|
||||
.addParentQuestList(quest.toProto(true))
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketFinishedParentQuestUpdateNotify(List<GameMainQuest> quests) {
|
||||
super(PacketOpcodes.FinishedParentQuestUpdateNotify);
|
||||
|
||||
var proto = FinishedParentQuestUpdateNotify.newBuilder();
|
||||
|
||||
for (GameMainQuest mainQuest : quests) {
|
||||
proto.addParentQuestList(mainQuest.toProto(true));
|
||||
}
|
||||
proto.build();
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +1,42 @@
|
||||
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.GetAllMailResultNotifyOuterClass.GetAllMailResultNotify;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
|
||||
public final class PacketGetAllMailResultNotify extends BasePacket {
|
||||
/**
|
||||
* @param player The player to fetch the mail for.
|
||||
* @param gifts Is the mail for gifts?
|
||||
*/
|
||||
public PacketGetAllMailResultNotify(Player player, boolean gifts) {
|
||||
super(PacketOpcodes.GetAllMailResultNotify);
|
||||
|
||||
var packet = GetAllMailResultNotify.newBuilder()
|
||||
.setTransaction(player.getUid() + "-" + Utils.getCurrentSeconds() + "-" + 0)
|
||||
.setIsCollected(gifts)
|
||||
.setPacketBeSentNum(1)
|
||||
.setPacketNum(1);
|
||||
|
||||
var inbox = player.getAllMail();
|
||||
if (!gifts && inbox.size() > 0) {
|
||||
packet.addAllMailList(inbox.stream()
|
||||
.filter(mail -> mail.stateValue == 1)
|
||||
.filter(mail -> mail.expireTime > Instant.now().getEpochSecond())
|
||||
.map(mail -> mail.toProto(player)).toList());
|
||||
} else {
|
||||
// Empty mailbox.
|
||||
// TODO: Implement the gift mailbox.
|
||||
packet.addAllMailList(List.of());
|
||||
}
|
||||
|
||||
this.setData(packet.build());
|
||||
}
|
||||
}
|
||||
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.GetAllMailResultNotifyOuterClass.GetAllMailResultNotify;
|
||||
import emu.grasscutter.utils.Utils;
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
|
||||
public final class PacketGetAllMailResultNotify extends BasePacket {
|
||||
/**
|
||||
* @param player The player to fetch the mail for.
|
||||
* @param gifts Is the mail for gifts?
|
||||
*/
|
||||
public PacketGetAllMailResultNotify(Player player, boolean gifts) {
|
||||
super(PacketOpcodes.GetAllMailResultNotify);
|
||||
|
||||
var packet =
|
||||
GetAllMailResultNotify.newBuilder()
|
||||
.setTransaction(player.getUid() + "-" + Utils.getCurrentSeconds() + "-" + 0)
|
||||
.setIsCollected(gifts)
|
||||
.setPacketBeSentNum(1)
|
||||
.setPacketNum(1);
|
||||
|
||||
var inbox = player.getAllMail();
|
||||
if (!gifts && inbox.size() > 0) {
|
||||
packet.addAllMailList(
|
||||
inbox.stream()
|
||||
.filter(mail -> mail.stateValue == 1)
|
||||
.filter(mail -> mail.expireTime > Instant.now().getEpochSecond())
|
||||
.map(mail -> mail.toProto(player))
|
||||
.toList());
|
||||
} else {
|
||||
// Empty mailbox.
|
||||
// TODO: Implement the gift mailbox.
|
||||
packet.addAllMailList(List.of());
|
||||
}
|
||||
|
||||
this.setData(packet.build());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
//package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
//import emu.grasscutter.net.packet.BasePacket;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//import emu.grasscutter.net.proto.HomeUnknown1NotifyOuterClass;
|
||||
//
|
||||
//public class PacketHomeUnknown1Notify extends BasePacket {
|
||||
//
|
||||
// public PacketHomeUnknown1Notify(boolean isEnterEditMode) {
|
||||
// super(PacketOpcodes.Unk2700_JDMPECKFGIG_ServerNotify);
|
||||
//
|
||||
// var proto = HomeUnknown1NotifyOuterClass.HomeUnknown1Notify.newBuilder();
|
||||
//
|
||||
// proto.setIsEnterEditMode(isEnterEditMode);
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.HomeUnknown1NotifyOuterClass;
|
||||
//
|
||||
// public class PacketHomeUnknown1Notify extends BasePacket {
|
||||
//
|
||||
// public PacketHomeUnknown1Notify(boolean isEnterEditMode) {
|
||||
// super(PacketOpcodes.Unk2700_JDMPECKFGIG_ServerNotify);
|
||||
//
|
||||
// var proto = HomeUnknown1NotifyOuterClass.HomeUnknown1Notify.newBuilder();
|
||||
//
|
||||
// proto.setIsEnterEditMode(isEnterEditMode);
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
//import emu.grasscutter.net.packet.BasePacket;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//
|
||||
//public class PacketHomeUnknown2Rsp extends BasePacket {
|
||||
//
|
||||
// public PacketHomeUnknown2Rsp() {
|
||||
// super(PacketOpcodes.Unk2700_KIIOGMKFNNP_ServerRsp);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//
|
||||
// public class PacketHomeUnknown2Rsp extends BasePacket {
|
||||
//
|
||||
// public PacketHomeUnknown2Rsp() {
|
||||
// super(PacketOpcodes.Unk2700_KIIOGMKFNNP_ServerRsp);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,32 +1,33 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.MusicGameSettleReqOuterClass;
|
||||
import emu.grasscutter.net.proto.MusicGameSettleRspOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketMusicGameSettleRsp extends BasePacket {
|
||||
|
||||
public PacketMusicGameSettleRsp(int musicBasicId, long musicShareId, boolean isNewRecord) {
|
||||
super(PacketOpcodes.MusicGameSettleRsp);
|
||||
|
||||
var proto = MusicGameSettleRspOuterClass.MusicGameSettleRsp.newBuilder();
|
||||
|
||||
proto.setMusicBasicId(musicBasicId).setUgcGuid(musicShareId).setIsNewRecord(isNewRecord);
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketMusicGameSettleRsp(RetcodeOuterClass.Retcode errorCode, MusicGameSettleReqOuterClass.MusicGameSettleReq req) {
|
||||
super(PacketOpcodes.MusicGameSettleRsp);
|
||||
|
||||
var proto = MusicGameSettleRspOuterClass.MusicGameSettleRsp.newBuilder()
|
||||
.setRetcode(errorCode.getNumber())
|
||||
.setMusicBasicId(req.getMusicBasicId())
|
||||
.setUgcGuid(req.getUgcGuid());
|
||||
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.MusicGameSettleReqOuterClass;
|
||||
import emu.grasscutter.net.proto.MusicGameSettleRspOuterClass;
|
||||
import emu.grasscutter.net.proto.RetcodeOuterClass;
|
||||
|
||||
public class PacketMusicGameSettleRsp extends BasePacket {
|
||||
|
||||
public PacketMusicGameSettleRsp(int musicBasicId, long musicShareId, boolean isNewRecord) {
|
||||
super(PacketOpcodes.MusicGameSettleRsp);
|
||||
|
||||
var proto = MusicGameSettleRspOuterClass.MusicGameSettleRsp.newBuilder();
|
||||
|
||||
proto.setMusicBasicId(musicBasicId).setUgcGuid(musicShareId).setIsNewRecord(isNewRecord);
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketMusicGameSettleRsp(
|
||||
RetcodeOuterClass.Retcode errorCode, MusicGameSettleReqOuterClass.MusicGameSettleReq req) {
|
||||
super(PacketOpcodes.MusicGameSettleRsp);
|
||||
|
||||
var proto =
|
||||
MusicGameSettleRspOuterClass.MusicGameSettleRsp.newBuilder()
|
||||
.setRetcode(errorCode.getNumber())
|
||||
.setMusicBasicId(req.getMusicBasicId())
|
||||
.setUgcGuid(req.getUgcGuid());
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlatformStartRouteNotifyOuterClass.PlatformStartRouteNotify;
|
||||
import lombok.val;
|
||||
|
||||
public class PacketPlatformStartRouteNotify extends BasePacket {
|
||||
public PacketPlatformStartRouteNotify(EntityGadget gadgetEntity) {
|
||||
super(PacketOpcodes.PlatformStartRouteNotify);
|
||||
|
||||
val notify = PlatformStartRouteNotify.newBuilder()
|
||||
.setEntityId(gadgetEntity.getId())
|
||||
.setSceneTime(gadgetEntity.getScene().getSceneTime())
|
||||
.setPlatform(gadgetEntity.getPlatformInfo());
|
||||
|
||||
this.setData(notify);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlatformStartRouteNotifyOuterClass.PlatformStartRouteNotify;
|
||||
import lombok.val;
|
||||
|
||||
public class PacketPlatformStartRouteNotify extends BasePacket {
|
||||
public PacketPlatformStartRouteNotify(EntityGadget gadgetEntity) {
|
||||
super(PacketOpcodes.PlatformStartRouteNotify);
|
||||
|
||||
val notify =
|
||||
PlatformStartRouteNotify.newBuilder()
|
||||
.setEntityId(gadgetEntity.getId())
|
||||
.setSceneTime(gadgetEntity.getScene().getSceneTime())
|
||||
.setPlatform(gadgetEntity.getPlatformInfo());
|
||||
|
||||
this.setData(notify);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlatformStopRouteNotifyOuterClass;
|
||||
|
||||
public class PacketPlatformStopRouteNotify extends BasePacket {
|
||||
public PacketPlatformStopRouteNotify(EntityGadget gadgetEntity) {
|
||||
super(PacketOpcodes.PlatformStopRouteNotify);
|
||||
|
||||
var notify = PlatformStopRouteNotifyOuterClass.PlatformStopRouteNotify.newBuilder()
|
||||
.setPlatform(gadgetEntity.getPlatformInfo())
|
||||
.setSceneTime(gadgetEntity.getScene().getSceneTime())
|
||||
.setEntityId(gadgetEntity.getId())
|
||||
.build();
|
||||
|
||||
this.setData(notify);
|
||||
}
|
||||
}
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.game.entity.EntityGadget;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.PlatformStopRouteNotifyOuterClass;
|
||||
|
||||
public class PacketPlatformStopRouteNotify extends BasePacket {
|
||||
public PacketPlatformStopRouteNotify(EntityGadget gadgetEntity) {
|
||||
super(PacketOpcodes.PlatformStopRouteNotify);
|
||||
|
||||
var notify =
|
||||
PlatformStopRouteNotifyOuterClass.PlatformStopRouteNotify.newBuilder()
|
||||
.setPlatform(gadgetEntity.getPlatformInfo())
|
||||
.setSceneTime(gadgetEntity.getScene().getSceneTime())
|
||||
.setEntityId(gadgetEntity.getId())
|
||||
.build();
|
||||
|
||||
this.setData(notify);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
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.PlayerGameTimeNotifyOuterClass.PlayerGameTimeNotify;
|
||||
|
||||
public class PacketPlayerGameTimeNotify extends BasePacket {
|
||||
|
||||
public PacketPlayerGameTimeNotify(Player player) {
|
||||
super(PacketOpcodes.PlayerGameTimeNotify);
|
||||
|
||||
PlayerGameTimeNotify proto =
|
||||
PlayerGameTimeNotify.newBuilder()
|
||||
.setGameTime(player.getWorld().getGameTime())
|
||||
.setUid(player.getUid())
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
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.PlayerGameTimeNotifyOuterClass.PlayerGameTimeNotify;
|
||||
|
||||
public class PacketPlayerGameTimeNotify extends BasePacket {
|
||||
|
||||
public PacketPlayerGameTimeNotify(Player player) {
|
||||
super(PacketOpcodes.PlayerGameTimeNotify);
|
||||
|
||||
PlayerGameTimeNotify proto =
|
||||
PlayerGameTimeNotify.newBuilder()
|
||||
.setGameTime(player.getWorld().getGameTime())
|
||||
.setUid(player.getUid())
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +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.RemoveCustomTeamRspOuterClass.RemoveCustomTeamRsp;
|
||||
//import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
//
|
||||
//public class PacketRemoveCustomTeamRsp extends BasePacket {
|
||||
// public PacketRemoveCustomTeamRsp(Retcode retcode, int id) {
|
||||
// super(PacketOpcodes.RemoveCustomTeamRsp);
|
||||
//
|
||||
// RemoveCustomTeamRsp proto =
|
||||
// RemoveCustomTeamRsp.newBuilder().setRetcode(retcode.getNumber()).setId(id).build();
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
//
|
||||
// public PacketRemoveCustomTeamRsp(int id) {
|
||||
// this(Retcode.RET_SUCC, id);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.RemoveCustomTeamRspOuterClass.RemoveCustomTeamRsp;
|
||||
// import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
|
||||
//
|
||||
// public class PacketRemoveCustomTeamRsp extends BasePacket {
|
||||
// public PacketRemoveCustomTeamRsp(Retcode retcode, int id) {
|
||||
// super(PacketOpcodes.RemoveCustomTeamRsp);
|
||||
//
|
||||
// RemoveCustomTeamRsp proto =
|
||||
//
|
||||
// RemoveCustomTeamRsp.newBuilder().setRetcode(retcode.getNumber()).setId(id).build();
|
||||
//
|
||||
// this.setData(proto);
|
||||
// }
|
||||
//
|
||||
// public PacketRemoveCustomTeamRsp(int id) {
|
||||
// this(Retcode.RET_SUCC, id);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
//package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
//import emu.grasscutter.net.packet.BasePacket;
|
||||
//import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
//import emu.grasscutter.net.proto.Unk2700MEBFPBDNPGOServerNotify;
|
||||
//
|
||||
//public class PacketUnlockHomeBgmNotify extends BasePacket {
|
||||
// public PacketUnlockHomeBgmNotify(int homeBgmId) {
|
||||
// super(PacketOpcodes.Unk2700_MEBFPBDNPGO_ServerNotify);
|
||||
//
|
||||
// var notify =
|
||||
// Unk2700MEBFPBDNPGOServerNotify.Unk2700_MEBFPBDNPGO_ServerNotify.newBuilder()
|
||||
// .addUnk2700ELJPLMIHNIP(homeBgmId)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(notify);
|
||||
// }
|
||||
//}
|
||||
// package emu.grasscutter.server.packet.send;
|
||||
//
|
||||
// import emu.grasscutter.net.packet.BasePacket;
|
||||
// import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
// import emu.grasscutter.net.proto.Unk2700MEBFPBDNPGOServerNotify;
|
||||
//
|
||||
// public class PacketUnlockHomeBgmNotify extends BasePacket {
|
||||
// public PacketUnlockHomeBgmNotify(int homeBgmId) {
|
||||
// super(PacketOpcodes.Unk2700_MEBFPBDNPGO_ServerNotify);
|
||||
//
|
||||
// var notify =
|
||||
// Unk2700MEBFPBDNPGOServerNotify.Unk2700_MEBFPBDNPGO_ServerNotify.newBuilder()
|
||||
// .addUnk2700ELJPLMIHNIP(homeBgmId)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(notify);
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
//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.Unk2700LOHBMOKOPLHServerNotify;
|
||||
//
|
||||
//public class PacketUnlockedHomeBgmNotify extends BasePacket {
|
||||
// public PacketUnlockedHomeBgmNotify(Player player) {
|
||||
// super(PacketOpcodes.Unk2700_LOHBMOKOPLH_ServerNotify);
|
||||
//
|
||||
// if (player.getRealmList() == null) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var unlocked = player.getHome().getUnlockedHomeBgmList();
|
||||
//
|
||||
// var notify =
|
||||
// Unk2700LOHBMOKOPLHServerNotify.Unk2700_LOHBMOKOPLH_ServerNotify.newBuilder()
|
||||
// .addAllUnk2700KMEKMNONMGE(unlocked)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(notify);
|
||||
// }
|
||||
//}
|
||||
// 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.Unk2700LOHBMOKOPLHServerNotify;
|
||||
//
|
||||
// public class PacketUnlockedHomeBgmNotify extends BasePacket {
|
||||
// public PacketUnlockedHomeBgmNotify(Player player) {
|
||||
// super(PacketOpcodes.Unk2700_LOHBMOKOPLH_ServerNotify);
|
||||
//
|
||||
// if (player.getRealmList() == null) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// var unlocked = player.getHome().getUnlockedHomeBgmList();
|
||||
//
|
||||
// var notify =
|
||||
// Unk2700LOHBMOKOPLHServerNotify.Unk2700_LOHBMOKOPLH_ServerNotify.newBuilder()
|
||||
// .addAllUnk2700KMEKMNONMGE(unlocked)
|
||||
// .build();
|
||||
//
|
||||
// this.setData(notify);
|
||||
// }
|
||||
// }
|
||||
|
||||
Reference in New Issue
Block a user