Create files from Grasscutter-Quests

these files are NOT directly compatible with Grasscutter, and require additional modifications to the codebase to work.
This commit is contained in:
KingRainbow44
2023-03-31 23:58:12 -04:00
parent 86aad96125
commit 262ee38ded
229 changed files with 6729 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.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();
}
}

View File

@@ -0,0 +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());
}
}

View File

@@ -0,0 +1,23 @@
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.CheckUgcStateReqOuterClass.CheckUgcStateReq;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketCheckUgcStateRsp;
import lombok.val;
@Opcodes(PacketOpcodes.CheckUgcStateReq)
public class HandlerCheckUgcStateReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = CheckUgcStateReq.parseFrom(payload);
session.send(new PacketCheckUgcStateRsp(Retcode.RET_SUCC));
}
}

View File

@@ -0,0 +1,20 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.CheckUgcUpdateReqOuterClass.CheckUgcUpdateReq;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketCheckUgcUpdateRsp;
@Opcodes(PacketOpcodes.CheckUgcUpdateReq)
public class HandlerCheckUgcUpdateReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = CheckUgcUpdateReq.parseFrom(payload);
session.send(new PacketCheckUgcUpdateRsp(req.getUgcType()));
}
}

View File

@@ -0,0 +1,28 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.DungeonPlayerDieReqOuterClass.DungeonPlayerDieReq;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketDungeonPlayerDieRsp;
import lombok.val;
@Opcodes(PacketOpcodes.DungeonPlayerDieReq)
public class HandlerDungeonPlayerDieReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
DungeonPlayerDieReq req = DungeonPlayerDieReq.parseFrom(payload);
Player player = session.getPlayer();
boolean result = player.getScene().respawnPlayer(player);
player.sendPacket(new PacketDungeonPlayerDieRsp(result ? Retcode.RET_SUCC : Retcode.RET_FAIL));
}
}

View File

@@ -0,0 +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.DungeonSlipRevivePointActivateReqOuterClass.DungeonSlipRevivePointActivateReq;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketDungeonSlipRevivePointActivateRsp;
@Opcodes(PacketOpcodes.DungeonSlipRevivePointActivateReq)
public class HandlerDungeonSlipRevivePointActivateReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = DungeonSlipRevivePointActivateReq.parseFrom(payload);
var dungeonManager = session.getPlayer().getScene().getDungeonManager();
boolean success = false;
if (dungeonManager != null) {
success = dungeonManager.activateRespawnPoint(req.getSlipRevivePointId());
}
session.send(new PacketDungeonSlipRevivePointActivateRsp(success, req.getSlipRevivePointId()));
}
}

View File

@@ -0,0 +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.DungeonWayPointActivateReqOuterClass.DungeonWayPointActivateReq;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketDungeonWayPointActivateRsp;
@Opcodes(PacketOpcodes.DungeonWayPointActivateReq)
public class HandlerDungeonWayPointActivateReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = DungeonWayPointActivateReq.parseFrom(payload);
var dungeonManager = session.getPlayer().getScene().getDungeonManager();
boolean success = false;
if(dungeonManager != null){
success = dungeonManager.activateRespawnPoint(req.getWayPointId());
}
session.send(new PacketDungeonWayPointActivateRsp(success, req.getWayPointId()));
}
}

View File

@@ -0,0 +1,33 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.activity.trialavatar.TrialAvatarActivityHandler;
import emu.grasscutter.game.props.ActivityType;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.server.packet.send.PacketEnterTrialAvatarActivityDungeonRsp;
import emu.grasscutter.server.packet.send.PacketScenePlayerLocationNotify;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.net.proto.EnterTrialAvatarActivityDungeonReqOuterClass.EnterTrialAvatarActivityDungeonReq;
import emu.grasscutter.server.game.GameSession;
import lombok.val;
@Opcodes(PacketOpcodes.EnterTrialAvatarActivityDungeonReq)
public class HandlerEnterTrialAvatarActivityDungeonReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = EnterTrialAvatarActivityDungeonReq.parseFrom(payload);
val handler = session.getPlayer().getActivityManager()
.getActivityHandlerAs(ActivityType.NEW_ACTIVITY_TRIAL_AVATAR, TrialAvatarActivityHandler.class);
boolean result = handler.isPresent() && handler.get().enterTrialDungeon(session.getPlayer(), req.getTrialAvatarIndexId(), req.getEnterPointId());
session.getPlayer().sendPacket(new PacketEnterTrialAvatarActivityDungeonRsp(
req.getActivityId(),
req.getTrialAvatarIndexId(),
result));
}
}

View File

@@ -0,0 +1,30 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.Grasscutter;
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.PacketOpcodes;
import emu.grasscutter.net.proto.ExecuteGadgetLuaReqOuterClass.ExecuteGadgetLuaReq;
import emu.grasscutter.net.packet.PacketHandler;
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));
}
}

View File

@@ -0,0 +1,21 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.FireWorkReqOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketFireworkNotify;
import emu.grasscutter.server.packet.send.PacketFireworkRsp;
@Opcodes(PacketOpcodes.FireworkReq)
public class HandlerFireWorkReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req
= FireWorkReqOuterClass.FireWorkReq.parseFrom(payload);
session.send(new PacketFireworkNotify(req.getFireWorkData()));
session.send(new PacketFireworkRsp());
}
}

View File

@@ -0,0 +1,23 @@
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.FireworkSetReqOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketFireworkSetNotify;
import emu.grasscutter.server.packet.send.PacketFireworkSetRsp;
@Opcodes(PacketOpcodes.FireworkSetReq)
public class HandlerFireworkSetReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req
= FireworkSetReqOuterClass.FireworkSetReq.parseFrom(payload);
session.send(new PacketFireworkSetNotify(req.getData()));
session.send(new PacketFireworkSetRsp());
}
}

View File

@@ -0,0 +1,33 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.activity.musicgame.MusicGameBeatmap;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.GetUgcBriefInfoReqOuterClass;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.net.proto.UgcTypeOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketGetUgcBriefInfoRsp;
@Opcodes(PacketOpcodes.GetUgcBriefInfoReq)
public class HandlerGetUgcBriefInfoReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = GetUgcBriefInfoReqOuterClass.GetUgcBriefInfoReq.parseFrom(payload);
if(req.getUgcType() == UgcTypeOuterClass.UgcType.UGC_TYPE_MUSIC_GAME){
var musicGameBeatmap = MusicGameBeatmap.getByShareId(req.getUgcGuid());
if(musicGameBeatmap != null){
session.send(new PacketGetUgcBriefInfoRsp(musicGameBeatmap.toBriefProto().build(), req.getUgcType()));
return;
}
}
session.send(new PacketGetUgcBriefInfoRsp(Retcode.RET_UGC_BRIEF_NOT_FOUND, req.getUgcType()));
}
}

View File

@@ -0,0 +1,48 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.activity.musicgame.MusicGameBeatmap;
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.UgcTypeOuterClass;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketGetUgcRsp;
import emu.grasscutter.net.proto.GetUgcReqOuterClass.GetUgcReq;
import lombok.val;
@Opcodes(PacketOpcodes.GetUgcReq)
public class HandlerGetUgcReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = GetUgcReq.parseFrom(payload);
PacketGetUgcRsp rsp = null;
if(req.getUgcType() == UgcTypeOuterClass.UgcType.UGC_TYPE_MUSIC_GAME) {
val musicGameBeatmap = MusicGameBeatmap.getByShareId(req.getUgcGuid());
if (musicGameBeatmap != null) {
rsp = new PacketGetUgcRsp(
musicGameBeatmap.toBriefProto().build(),
musicGameBeatmap.toProto(),
req
);
} else {
rsp = new PacketGetUgcRsp(
RetcodeOuterClass.Retcode.RET_UGC_DATA_NOT_FOUND,
req
);
}
}else {
rsp = new PacketGetUgcRsp(
RetcodeOuterClass.Retcode.RET_UGC_DISABLED,
req
);
}
session.send(rsp);
}
}

View File

@@ -0,0 +1,20 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.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());
}
}

View File

@@ -0,0 +1,63 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.GadgetData;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.data.excels.MonsterData;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketQuestCreateEntityRsp;
import emu.grasscutter.utils.Position;
import lombok.val;
import emu.grasscutter.net.proto.QuestCreateEntityReqOuterClass.QuestCreateEntityReq;
@Opcodes(PacketOpcodes.QuestCreateEntityReq)
public class HandlerQuestCreateEntityReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = QuestCreateEntityReq.parseFrom(payload);
val entity = req.getEntity();
val scene = session.getPlayer().getWorld().getSceneById(entity.getSceneId());
val pos = new Position(entity.getPos());
val rot = new Position(entity.getRot());
GameEntity gameEntity = null;
switch (entity.getEntityCase()){
case GADGET_ID -> {
val gadgetId = entity.getGadgetId();
val gadgetInfo = entity.getGadget();
GadgetData gadgetData = GameData.getGadgetDataMap().get(gadgetId);
gameEntity = switch (gadgetData.getType()){
case Vehicle -> new EntityVehicle(scene, session.getPlayer(), gadgetId, 0, pos, rot);
default -> new EntityGadget(scene, gadgetId, pos, rot);
};
}
case ITEM_ID -> {
val itemId = entity.getItemId();
ItemData itemData = GameData.getItemDataMap().get(itemId);
gameEntity = new EntityItem(scene, null, itemData, pos, 1, true);
}
case MONSTER_ID -> {
val monsterId = entity.getMonsterId();
val level = entity.getLevel();
MonsterData monsterData = GameData.getMonsterDataMap().get(monsterId);
gameEntity = new EntityMonster(scene, monsterData, pos, level);
}
case NPC_ID -> {
}
}
if(gameEntity != null){
scene.addEntity(gameEntity);
}
val createdEntityId = gameEntity!=null ? gameEntity.getId() : -1;
session.send(new PacketQuestCreateEntityRsp(createdEntityId, req));
}
}

View File

@@ -0,0 +1,27 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketQuestDestroyEntityRsp;
import lombok.val;
import emu.grasscutter.net.proto.QuestDestroyEntityReqOuterClass.QuestDestroyEntityReq;
@Opcodes(PacketOpcodes.QuestDestroyEntityReq)
public class HandlerQuestDestroyEntityReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = QuestDestroyEntityReq.parseFrom(payload);
val scene = session.getPlayer().getWorld().getSceneById(req.getSceneId());
val entity = scene.getEntityById(req.getEntityId());
if(entity!=null){
scene.removeEntity(entity);
}
session.send(new PacketQuestDestroyEntityRsp(entity!=null, req));
}
}

View File

@@ -0,0 +1,20 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.entity.EntityNPC;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketQuestDestroyNpcRsp;
import lombok.val;
import emu.grasscutter.net.proto.QuestDestroyNpcReqOuterClass.QuestDestroyNpcReq;
@Opcodes(PacketOpcodes.QuestDestroyNpcReq)
public class HandlerQuestDestroyNpcReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = QuestDestroyNpcReq.parseFrom(payload);
session.send(new PacketQuestDestroyNpcRsp(req.getNpcId(), req.getParentQuestId(), 0));
}
}

View File

@@ -0,0 +1,32 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.quest.GameMainQuest;
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.PacketQuestTransmitRsp;
import emu.grasscutter.utils.Position;
import emu.grasscutter.net.proto.QuestTransmitReqOuterClass.QuestTransmitReq;
import java.util.List;
import java.util.ArrayList;
import lombok.val;
@Opcodes(PacketOpcodes.QuestTransmitReq)
public class HandlerQuestTransmitReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = QuestTransmitReq.parseFrom(payload);
GameMainQuest mainQuest = session.getPlayer().getQuestManager().getMainQuestById(req.getQuestId() / 100);
List<Position> posAndRot = new ArrayList<>();
boolean result = false;
if(mainQuest.hasTeleportPostion(req.getQuestId(), posAndRot)){
int sceneId = GameData.getTeleportDataMap().get(req.getQuestId()).getTransmit_points().get(0).getScene_id();
result = session.getPlayer().getWorld().transferPlayerToScene(session.getPlayer(), sceneId, posAndRot.get(0));
}
session.send(new PacketQuestTransmitRsp(result, req));
}
}

View File

@@ -0,0 +1,32 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.game.activity.trialavatar.TrialAvatarActivityHandler;
import emu.grasscutter.game.props.ActivityType;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.net.proto.ReceivedTrialAvatarActivityRewardReqOuterClass.ReceivedTrialAvatarActivityRewardReq;
import emu.grasscutter.server.packet.send.PacketReceivedTrialAvatarActivityRewardRsp;
import lombok.val;
@Opcodes(PacketOpcodes.ReceivedTrialAvatarActivityRewardReq)
public class HandlerReceivedTrialAvatarActivityRewardReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
val req = ReceivedTrialAvatarActivityRewardReq.parseFrom(payload);
val player = session.getPlayer();
val handler = player.getActivityManager().getActivityHandlerAs(ActivityType.NEW_ACTIVITY_TRIAL_AVATAR, TrialAvatarActivityHandler.class);
boolean result = handler.isPresent() && handler.get().getReward(player, req.getTrialAvatarIndexId());
session.getPlayer().sendPacket(new PacketReceivedTrialAvatarActivityRewardRsp(
5002, // trial activity id
req.getTrialAvatarIndexId(),
result));
}
}

View File

@@ -0,0 +1,16 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.RemoveCustomTeamReqOuterClass.RemoveCustomTeamReq;
import emu.grasscutter.net.packet.PacketHandler;
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());
}
}

View File

@@ -0,0 +1,84 @@
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 lombok.val;
import java.util.Objects;
@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()));
}
}