Fix path changing for the trailblazer

This commit is contained in:
Melledy
2024-07-31 01:26:29 -07:00
parent 3ad4ca201b
commit 17e3bf0f20
5 changed files with 237 additions and 14 deletions

View File

@@ -53,6 +53,16 @@ public final class GetBasicInfoScRspOuterClass {
*/ */
private int retcode; private int retcode;
/**
* <code>optional uint32 gender = 14;</code>
*/
private int gender;
/**
* <code>optional bool is_gender_set = 9;</code>
*/
private boolean isGenderSet;
/** /**
* <code>optional .PlayerSettingInfo player_setting_info = 4;</code> * <code>optional .PlayerSettingInfo player_setting_info = 4;</code>
*/ */
@@ -327,12 +337,86 @@ public final class GetBasicInfoScRspOuterClass {
return this; return this;
} }
/**
* <code>optional uint32 gender = 14;</code>
* @return whether the gender field is set
*/
public boolean hasGender() {
return (bitField0_ & 0x00000080) != 0;
}
/**
* <code>optional uint32 gender = 14;</code>
* @return this
*/
public GetBasicInfoScRsp clearGender() {
bitField0_ &= ~0x00000080;
gender = 0;
return this;
}
/**
* <code>optional uint32 gender = 14;</code>
* @return the gender
*/
public int getGender() {
return gender;
}
/**
* <code>optional uint32 gender = 14;</code>
* @param value the gender to set
* @return this
*/
public GetBasicInfoScRsp setGender(final int value) {
bitField0_ |= 0x00000080;
gender = value;
return this;
}
/**
* <code>optional bool is_gender_set = 9;</code>
* @return whether the isGenderSet field is set
*/
public boolean hasIsGenderSet() {
return (bitField0_ & 0x00000100) != 0;
}
/**
* <code>optional bool is_gender_set = 9;</code>
* @return this
*/
public GetBasicInfoScRsp clearIsGenderSet() {
bitField0_ &= ~0x00000100;
isGenderSet = false;
return this;
}
/**
* <code>optional bool is_gender_set = 9;</code>
* @return the isGenderSet
*/
public boolean getIsGenderSet() {
return isGenderSet;
}
/**
* <code>optional bool is_gender_set = 9;</code>
* @param value the isGenderSet to set
* @return this
*/
public GetBasicInfoScRsp setIsGenderSet(final boolean value) {
bitField0_ |= 0x00000100;
isGenderSet = value;
return this;
}
/** /**
* <code>optional .PlayerSettingInfo player_setting_info = 4;</code> * <code>optional .PlayerSettingInfo player_setting_info = 4;</code>
* @return whether the playerSettingInfo field is set * @return whether the playerSettingInfo field is set
*/ */
public boolean hasPlayerSettingInfo() { public boolean hasPlayerSettingInfo() {
return (bitField0_ & 0x00000080) != 0; return (bitField0_ & 0x00000200) != 0;
} }
/** /**
@@ -340,7 +424,7 @@ public final class GetBasicInfoScRspOuterClass {
* @return this * @return this
*/ */
public GetBasicInfoScRsp clearPlayerSettingInfo() { public GetBasicInfoScRsp clearPlayerSettingInfo() {
bitField0_ &= ~0x00000080; bitField0_ &= ~0x00000200;
playerSettingInfo.clear(); playerSettingInfo.clear();
return this; return this;
} }
@@ -369,7 +453,7 @@ public final class GetBasicInfoScRspOuterClass {
* @return internal storage object for modifications * @return internal storage object for modifications
*/ */
public PlayerSettingInfoOuterClass.PlayerSettingInfo getMutablePlayerSettingInfo() { public PlayerSettingInfoOuterClass.PlayerSettingInfo getMutablePlayerSettingInfo() {
bitField0_ |= 0x00000080; bitField0_ |= 0x00000200;
return playerSettingInfo; return playerSettingInfo;
} }
@@ -380,7 +464,7 @@ public final class GetBasicInfoScRspOuterClass {
*/ */
public GetBasicInfoScRsp setPlayerSettingInfo( public GetBasicInfoScRsp setPlayerSettingInfo(
final PlayerSettingInfoOuterClass.PlayerSettingInfo value) { final PlayerSettingInfoOuterClass.PlayerSettingInfo value) {
bitField0_ |= 0x00000080; bitField0_ |= 0x00000200;
playerSettingInfo.copyFrom(value); playerSettingInfo.copyFrom(value);
return this; return this;
} }
@@ -397,6 +481,8 @@ public final class GetBasicInfoScRspOuterClass {
weekCocoonFinishedCount = other.weekCocoonFinishedCount; weekCocoonFinishedCount = other.weekCocoonFinishedCount;
exchangeTimes = other.exchangeTimes; exchangeTimes = other.exchangeTimes;
retcode = other.retcode; retcode = other.retcode;
gender = other.gender;
isGenderSet = other.isGenderSet;
playerSettingInfo.copyFrom(other.playerSettingInfo); playerSettingInfo.copyFrom(other.playerSettingInfo);
} }
return this; return this;
@@ -429,6 +515,12 @@ public final class GetBasicInfoScRspOuterClass {
if (other.hasRetcode()) { if (other.hasRetcode()) {
setRetcode(other.retcode); setRetcode(other.retcode);
} }
if (other.hasGender()) {
setGender(other.gender);
}
if (other.hasIsGenderSet()) {
setIsGenderSet(other.isGenderSet);
}
if (other.hasPlayerSettingInfo()) { if (other.hasPlayerSettingInfo()) {
getMutablePlayerSettingInfo().mergeFrom(other.playerSettingInfo); getMutablePlayerSettingInfo().mergeFrom(other.playerSettingInfo);
} }
@@ -449,6 +541,8 @@ public final class GetBasicInfoScRspOuterClass {
weekCocoonFinishedCount = 0; weekCocoonFinishedCount = 0;
exchangeTimes = 0; exchangeTimes = 0;
retcode = 0; retcode = 0;
gender = 0;
isGenderSet = false;
playerSettingInfo.clear(); playerSettingInfo.clear();
return this; return this;
} }
@@ -481,6 +575,8 @@ public final class GetBasicInfoScRspOuterClass {
&& (!hasWeekCocoonFinishedCount() || weekCocoonFinishedCount == other.weekCocoonFinishedCount) && (!hasWeekCocoonFinishedCount() || weekCocoonFinishedCount == other.weekCocoonFinishedCount)
&& (!hasExchangeTimes() || exchangeTimes == other.exchangeTimes) && (!hasExchangeTimes() || exchangeTimes == other.exchangeTimes)
&& (!hasRetcode() || retcode == other.retcode) && (!hasRetcode() || retcode == other.retcode)
&& (!hasGender() || gender == other.gender)
&& (!hasIsGenderSet() || isGenderSet == other.isGenderSet)
&& (!hasPlayerSettingInfo() || playerSettingInfo.equals(other.playerSettingInfo)); && (!hasPlayerSettingInfo() || playerSettingInfo.equals(other.playerSettingInfo));
} }
@@ -515,6 +611,14 @@ public final class GetBasicInfoScRspOuterClass {
output.writeUInt32NoTag(retcode); output.writeUInt32NoTag(retcode);
} }
if ((bitField0_ & 0x00000080) != 0) { if ((bitField0_ & 0x00000080) != 0) {
output.writeRawByte((byte) 112);
output.writeUInt32NoTag(gender);
}
if ((bitField0_ & 0x00000100) != 0) {
output.writeRawByte((byte) 72);
output.writeBoolNoTag(isGenderSet);
}
if ((bitField0_ & 0x00000200) != 0) {
output.writeRawByte((byte) 34); output.writeRawByte((byte) 34);
output.writeMessageNoTag(playerSettingInfo); output.writeMessageNoTag(playerSettingInfo);
} }
@@ -545,6 +649,12 @@ public final class GetBasicInfoScRspOuterClass {
size += 1 + ProtoSink.computeUInt32SizeNoTag(retcode); size += 1 + ProtoSink.computeUInt32SizeNoTag(retcode);
} }
if ((bitField0_ & 0x00000080) != 0) { if ((bitField0_ & 0x00000080) != 0) {
size += 1 + ProtoSink.computeUInt32SizeNoTag(gender);
}
if ((bitField0_ & 0x00000100) != 0) {
size += 2;
}
if ((bitField0_ & 0x00000200) != 0) {
size += 1 + ProtoSink.computeMessageSizeNoTag(playerSettingInfo); size += 1 + ProtoSink.computeMessageSizeNoTag(playerSettingInfo);
} }
return size; return size;
@@ -616,6 +726,24 @@ public final class GetBasicInfoScRspOuterClass {
retcode = input.readUInt32(); retcode = input.readUInt32();
bitField0_ |= 0x00000040; bitField0_ |= 0x00000040;
tag = input.readTag(); tag = input.readTag();
if (tag != 112) {
break;
}
}
case 112: {
// gender
gender = input.readUInt32();
bitField0_ |= 0x00000080;
tag = input.readTag();
if (tag != 72) {
break;
}
}
case 72: {
// isGenderSet
isGenderSet = input.readBool();
bitField0_ |= 0x00000100;
tag = input.readTag();
if (tag != 34) { if (tag != 34) {
break; break;
} }
@@ -623,7 +751,7 @@ public final class GetBasicInfoScRspOuterClass {
case 34: { case 34: {
// playerSettingInfo // playerSettingInfo
input.readMessage(playerSettingInfo); input.readMessage(playerSettingInfo);
bitField0_ |= 0x00000080; bitField0_ |= 0x00000200;
tag = input.readTag(); tag = input.readTag();
if (tag != 0) { if (tag != 0) {
break; break;
@@ -668,6 +796,12 @@ public final class GetBasicInfoScRspOuterClass {
output.writeUInt32(FieldNames.retcode, retcode); output.writeUInt32(FieldNames.retcode, retcode);
} }
if ((bitField0_ & 0x00000080) != 0) { if ((bitField0_ & 0x00000080) != 0) {
output.writeUInt32(FieldNames.gender, gender);
}
if ((bitField0_ & 0x00000100) != 0) {
output.writeBool(FieldNames.isGenderSet, isGenderSet);
}
if ((bitField0_ & 0x00000200) != 0) {
output.writeMessage(FieldNames.playerSettingInfo, playerSettingInfo); output.writeMessage(FieldNames.playerSettingInfo, playerSettingInfo);
} }
output.endObject(); output.endObject();
@@ -763,12 +897,35 @@ public final class GetBasicInfoScRspOuterClass {
} }
break; break;
} }
case -1249512767: {
if (input.isAtField(FieldNames.gender)) {
if (!input.trySkipNullValue()) {
gender = input.readUInt32();
bitField0_ |= 0x00000080;
}
} else {
input.skipUnknownField();
}
break;
}
case 1425215447:
case 1366482969: {
if (input.isAtField(FieldNames.isGenderSet)) {
if (!input.trySkipNullValue()) {
isGenderSet = input.readBool();
bitField0_ |= 0x00000100;
}
} else {
input.skipUnknownField();
}
break;
}
case 616260989: case 616260989:
case -1071462949: { case -1071462949: {
if (input.isAtField(FieldNames.playerSettingInfo)) { if (input.isAtField(FieldNames.playerSettingInfo)) {
if (!input.trySkipNullValue()) { if (!input.trySkipNullValue()) {
input.readMessage(playerSettingInfo); input.readMessage(playerSettingInfo);
bitField0_ |= 0x00000080; bitField0_ |= 0x00000200;
} }
} else { } else {
input.skipUnknownField(); input.skipUnknownField();
@@ -842,6 +999,10 @@ public final class GetBasicInfoScRspOuterClass {
static final FieldName retcode = FieldName.forField("retcode"); static final FieldName retcode = FieldName.forField("retcode");
static final FieldName gender = FieldName.forField("gender");
static final FieldName isGenderSet = FieldName.forField("isGenderSet", "is_gender_set");
static final FieldName playerSettingInfo = FieldName.forField("playerSettingInfo", "player_setting_info"); static final FieldName playerSettingInfo = FieldName.forField("playerSettingInfo", "player_setting_info");
} }
} }

View File

@@ -0,0 +1,54 @@
package emu.lunarcore.command.commands;
import emu.lunarcore.GameConstants;
import emu.lunarcore.command.Command;
import emu.lunarcore.command.CommandArgs;
import emu.lunarcore.command.CommandHandler;
import emu.lunarcore.data.GameData;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.player.PlayerGender;
import emu.lunarcore.server.packet.send.PacketGetBasicInfoScRsp;
@Command(label = "gender", permission = "player.gender", requireTarget = true, desc = "/gender {male | female}. Sets the player gender.")
public class GenderCommand implements CommandHandler {
@Override
public void execute(CommandArgs args) {
// Set world level
Player target = args.getTarget();
// Get new gender
String gender = args.get(0).toLowerCase();
PlayerGender playerGender = switch (gender) {
case "m", "male", "boy", "man", "1" -> PlayerGender.GENDER_MAN;
case "f", "female", "girl", "woman", "2" -> PlayerGender.GENDER_WOMAN;
default -> null;
};
// Change gender
if (playerGender != null && playerGender != target.getGender()) {
// Get first hero excel that matches our new player gender
var excel = GameData.getMultiplePathAvatarExcelMap().values().stream()
.filter(path -> path.getBaseAvatarID() == GameConstants.TRAILBLAZER_AVATAR_ID && path.getGender() == playerGender)
.findFirst()
.orElse(null);
// Sanity check. Should never happen
if (excel == null) {
args.sendMessage("Error: No avatar path was found for this gender");
return;
}
// Set our main character's path
target.setAvatarPath(excel.getId());
// Send packet to update our gender
target.sendPacket(new PacketGetBasicInfoScRsp(target));
// Send response message
args.sendMessage("Gender for " + target.getName() + " set successfully");
} else {
args.sendMessage("Error: Invalid input");
}
}
}

View File

@@ -479,13 +479,19 @@ public class Player implements Tickable {
// Set new avatar path // Set new avatar path
avatar.setMultiPath(path); avatar.setMultiPath(path);
// Set current avatar path // Set gender if we are changing the main character
this.getCurAvatarPaths().put(excel.getBaseAvatarID(), pathId); if (excel.getBaseAvatarID() == GameConstants.TRAILBLAZER_AVATAR_ID && excel.getGender() != null) {
this.gender = excel.getGender();
}
// Set current avatar path and save to database
this.getCurAvatarPaths().put(excel.getBaseAvatarID(), pathId);
this.save();
// Sync with client // Sync with client
this.sendPacket(new PacketAvatarPathChangedNotify(avatar, path)); this.sendPacket(new PacketAvatarPathChangedNotify(avatar, path));
this.sendPacket(new PacketPlayerSyncScNotify(avatar)); this.sendPacket(new PacketPlayerSyncScNotify(avatar));
// Success // Success
return pathId; return pathId;
} }

View File

@@ -11,7 +11,7 @@ public class HandlerGetBasicInfoCsReq extends PacketHandler {
@Override @Override
public void handle(GameSession session, byte[] data) throws Exception { public void handle(GameSession session, byte[] data) throws Exception {
session.send(new PacketGetBasicInfoScRsp(session)); session.send(new PacketGetBasicInfoScRsp(session.getPlayer()));
} }
} }

View File

@@ -1,20 +1,22 @@
package emu.lunarcore.server.packet.send; package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.proto.GetBasicInfoScRspOuterClass.GetBasicInfoScRsp; import emu.lunarcore.proto.GetBasicInfoScRspOuterClass.GetBasicInfoScRsp;
import emu.lunarcore.proto.PlayerSettingInfoOuterClass.PlayerSettingInfo; import emu.lunarcore.proto.PlayerSettingInfoOuterClass.PlayerSettingInfo;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.BasePacket; import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId; import emu.lunarcore.server.packet.CmdId;
public class PacketGetBasicInfoScRsp extends BasePacket { public class PacketGetBasicInfoScRsp extends BasePacket {
public PacketGetBasicInfoScRsp(GameSession session) { public PacketGetBasicInfoScRsp(Player player) {
super(CmdId.GetBasicInfoScRsp); super(CmdId.GetBasicInfoScRsp);
var data = GetBasicInfoScRsp.newInstance() var data = GetBasicInfoScRsp.newInstance()
.setCurDay(1) .setCurDay(1)
.setNextRecoverTime(session.getPlayer().getNextStaminaRecover() / 1000) .setIsGenderSet(true)
.setGameplayBirthday(session.getPlayer().getBirthday()) .setGender(player.getGender().getVal())
.setNextRecoverTime(player.getNextStaminaRecover() / 1000)
.setGameplayBirthday(player.getBirthday())
.setPlayerSettingInfo(PlayerSettingInfo.newInstance()); .setPlayerSettingInfo(PlayerSettingInfo.newInstance());
this.setData(data); this.setData(data);