Implement head icons

This commit is contained in:
Melledy
2023-09-30 04:12:12 -07:00
parent 7b6ee81910
commit 21ab12cec5
7 changed files with 157 additions and 2 deletions

View File

@@ -118,6 +118,7 @@ public class Inventory extends BasePlayerManager {
// Add item to inventory store
ItemMainType type = item.getExcel().getItemMainType();
ItemSubType subType = item.getExcel().getItemSubType();
InventoryTab tab = getInventoryTab(type);
// Add
@@ -145,6 +146,12 @@ public class Inventory extends BasePlayerManager {
getPlayer().addAvatar(new GameAvatar(avatarExcel));
}
return null;
case Usable:
if (subType == ItemSubType.HeadIcon) {
getPlayer().addHeadIcon(item.getItemId());
return item;
}
return null;
case Material:
switch (item.getExcel().getItemSubType()) {
default:

View File

@@ -1,5 +1,8 @@
package emu.lunarcore.game.player;
import java.util.HashSet;
import java.util.Set;
import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Id;
import dev.morphia.annotations.Indexed;
@@ -20,6 +23,8 @@ import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.gacha.PlayerGachaInfo;
import emu.lunarcore.game.inventory.Inventory;
import emu.lunarcore.game.scene.Scene;
import emu.lunarcore.proto.BoardDataSyncOuterClass.BoardDataSync;
import emu.lunarcore.proto.HeadIconOuterClass.HeadIcon;
import emu.lunarcore.proto.PlayerBasicInfoOuterClass.PlayerBasicInfo;
import emu.lunarcore.server.game.GameServer;
import emu.lunarcore.server.game.GameSession;
@@ -42,8 +47,9 @@ public class Player {
@Indexed private String accountUid;
private String name;
private String signature;
private PlayerGender gender;
private int headIcon;
private int birthday;
private PlayerGender gender;
private int curBasicType;
private int level;
@@ -61,6 +67,8 @@ public class Player {
private int floorId;
private int entryId;
private Set<Integer> unlockedHeadIcons;
// Etc
@Setter private transient boolean paused;
private transient int nextBattleId;
@@ -75,7 +83,7 @@ public class Player {
@Deprecated // Morphia only
public Player() {
this.curBasicType = 8001;
this.curBasicType = GameConstants.TRAILBLAZER_AVATAR_ID;
this.gender = PlayerGender.GENDER_MAN;
this.avatars = new AvatarStorage(this);
this.inventory = new Inventory(this);
@@ -87,6 +95,8 @@ public class Player {
this.session = session;
this.accountUid = getAccount().getUid();
this.name = GameConstants.DEFAULT_NAME;
this.signature = "";
this.headIcon = 200001;
this.level = 1;
this.stamina = GameConstants.MAX_STAMINA;
@@ -95,6 +105,7 @@ public class Player {
this.floorId = 20001001;
this.entryId = 2000101;
this.unlockedHeadIcons = new HashSet<>();
this.lineupManager = new LineupManager(this);
this.gachaInfo = new PlayerGachaInfo();
@@ -156,6 +167,27 @@ public class Player {
this.save();
this.sendPacket(new PacketPlayerSyncScNotify(this));
}
public Set<Integer> getUnlockedHeadIcons() {
if (this.unlockedHeadIcons == null) {
this.unlockedHeadIcons = new HashSet<>();
}
return this.unlockedHeadIcons;
}
public void addHeadIcon(int headIconId) {
this.getUnlockedHeadIcons().add(headIconId);
this.sendPacket(new PacketPlayerSyncScNotify(this.toBoardData()));
}
public boolean setHeadIcon(int id) {
if (this.getUnlockedHeadIcons().contains(id)) {
this.headIcon = id;
this.save();
return true;
}
return false;
}
public boolean hasLoggedIn() {
return this.getSession() != null && this.getSession().getState() != SessionState.WAITING_FOR_TOKEN;
@@ -363,6 +395,8 @@ public class Player {
this.loadScene(planeId, floorId, entryId, this.getPos());
}
// Proto
public PlayerBasicInfo toProto() {
var proto = PlayerBasicInfo.newInstance()
.setNickname(this.getName())
@@ -376,4 +410,15 @@ public class Player {
return proto;
}
public BoardDataSync toBoardData() {
var proto = BoardDataSync.newInstance()
.setSignature(this.getSignature());
for (int id : this.getUnlockedHeadIcons()) {
proto.addUnlockedHeadIconList(HeadIcon.newInstance().setId(id));
}
return proto;
}
}

View File

@@ -0,0 +1,17 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.send.PacketGetPlayerBoardDataScRsp;
@Opcodes(CmdId.GetPlayerBoardDataCsReq)
public class HandlerGetPlayerBoardDataCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
session.send(new PacketGetPlayerBoardDataScRsp(session.getPlayer()));
}
}

View File

@@ -0,0 +1,26 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.proto.SetHeadIconCsReqOuterClass.SetHeadIconCsReq;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.send.PacketSetHeadIconScRsp;
@Opcodes(CmdId.SetHeadIconCsReq)
public class HandlerSetHeadIconCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
var req = SetHeadIconCsReq.parseFrom(data);
if (session.getPlayer().setHeadIcon(req.getId())) {
// Success
session.send(new PacketSetHeadIconScRsp(req.getId()));
} else {
// Failure (player probably didnt have the head icon)
session.send(new PacketSetHeadIconScRsp());
}
}
}

View File

@@ -0,0 +1,24 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.proto.GetPlayerBoardDataScRspOuterClass.GetPlayerBoardDataScRsp;
import emu.lunarcore.proto.HeadIconOuterClass.HeadIcon;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketGetPlayerBoardDataScRsp extends BasePacket {
public PacketGetPlayerBoardDataScRsp(Player player) {
super(CmdId.GetPlayerBoardDataScRsp);
var data = GetPlayerBoardDataScRsp.newInstance()
.setCurrentHeadIconId(player.getHeadIcon())
.setSignature(player.getSignature());
for (int id : player.getUnlockedHeadIcons()) {
data.addUnlockedHeadIconList(HeadIcon.newInstance().setId(id));
}
this.setData(data);
}
}

View File

@@ -7,6 +7,7 @@ import emu.lunarcore.game.avatar.HeroPath;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.proto.AvatarSyncOuterClass.AvatarSync;
import emu.lunarcore.proto.BoardDataSyncOuterClass.BoardDataSync;
import emu.lunarcore.proto.PlayerSyncScNotifyOuterClass.PlayerSyncScNotify;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
@@ -26,6 +27,15 @@ public class PacketPlayerSyncScNotify extends BasePacket {
this.setData(data);
}
public PacketPlayerSyncScNotify(BoardDataSync boardData) {
this();
var data = PlayerSyncScNotify.newInstance()
.setBoardDataSync(boardData);
this.setData(data);
}
public PacketPlayerSyncScNotify(GameAvatar avatar) {
this();

View File

@@ -0,0 +1,26 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.proto.SetHeadIconScRspOuterClass.SetHeadIconScRsp;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketSetHeadIconScRsp extends BasePacket {
public PacketSetHeadIconScRsp() {
super(CmdId.SetHeadIconScRsp);
var data = SetHeadIconScRsp.newInstance()
.setRetcode(1);
this.setData(data);
}
public PacketSetHeadIconScRsp(int headIconId) {
super(CmdId.SetHeadIconScRsp);
var data = SetHeadIconScRsp.newInstance()
.setId(headIconId);
this.setData(data);
}
}