mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-14 22:34:35 +01:00
Fix various bugs with lineups and optimize them by using fastutil
This commit is contained in:
@@ -56,7 +56,7 @@ public final class DatabaseManager {
|
|||||||
|
|
||||||
// Add our custom fastutil codecs
|
// Add our custom fastutil codecs
|
||||||
var codecProvider = CodecRegistries.fromCodecs(
|
var codecProvider = CodecRegistries.fromCodecs(
|
||||||
new IntSetCodec(), new Int2IntMapCodec()
|
new IntSetCodec(), new IntListCodec(), new Int2IntMapCodec()
|
||||||
);
|
);
|
||||||
|
|
||||||
// Set mapper options.
|
// Set mapper options.
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package emu.lunarcore.database.codecs;
|
||||||
|
|
||||||
|
import org.bson.BsonReader;
|
||||||
|
import org.bson.BsonType;
|
||||||
|
import org.bson.BsonWriter;
|
||||||
|
import org.bson.codecs.Codec;
|
||||||
|
import org.bson.codecs.DecoderContext;
|
||||||
|
import org.bson.codecs.EncoderContext;
|
||||||
|
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntArrayList;
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom mongodb codec for encoding/decoding fastutil int sets.
|
||||||
|
*/
|
||||||
|
public class IntListCodec implements Codec<IntList> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<IntList> getEncoderClass() {
|
||||||
|
return IntList.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void encode(BsonWriter writer, IntList collection, EncoderContext encoderContext) {
|
||||||
|
writer.writeStartArray();
|
||||||
|
for (int value : collection) {
|
||||||
|
writer.writeInt32(value);
|
||||||
|
}
|
||||||
|
writer.writeEndArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IntList decode(BsonReader reader, DecoderContext decoderContext) {
|
||||||
|
IntList collection = new IntArrayList();
|
||||||
|
reader.readStartArray();
|
||||||
|
while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) {
|
||||||
|
collection.add(reader.readInt32());
|
||||||
|
}
|
||||||
|
reader.readEndArray();
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -151,6 +151,11 @@ public class LineupManager {
|
|||||||
|
|
||||||
// Lineup functions
|
// Lineup functions
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the player's current active avatar
|
||||||
|
* @param slot The slot of the avatar we are changing to
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
public boolean changeLeader(int slot) {
|
public boolean changeLeader(int slot) {
|
||||||
PlayerLineup lineup = this.getCurrentLineup();
|
PlayerLineup lineup = this.getCurrentLineup();
|
||||||
|
|
||||||
@@ -162,6 +167,13 @@ public class LineupManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an avatar to a lineup
|
||||||
|
* @param index Index of the lineup we are adding the avatar to
|
||||||
|
* @param slot The slot that we want to put the avatar at
|
||||||
|
* @param avatarId Id of the avatar we are adding
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
public boolean joinLineup(int index, int slot, int avatarId) {
|
public boolean joinLineup(int index, int slot, int avatarId) {
|
||||||
// Get lineup
|
// Get lineup
|
||||||
PlayerLineup lineup = this.getLineupByIndex(index);
|
PlayerLineup lineup = this.getLineupByIndex(index);
|
||||||
@@ -174,7 +186,7 @@ public class LineupManager {
|
|||||||
if (avatar == null) return false;
|
if (avatar == null) return false;
|
||||||
|
|
||||||
// Join lineup
|
// Join lineup
|
||||||
if (slot >= 0 && slot < lineup.size()) {
|
if (lineup.isActiveSlot(slot)) {
|
||||||
// Replace avatar
|
// Replace avatar
|
||||||
lineup.getAvatars().set(slot, avatarId);
|
lineup.getAvatars().set(slot, avatarId);
|
||||||
} else if (lineup.size() < GameConstants.MAX_AVATARS_IN_TEAM) {
|
} else if (lineup.size() < GameConstants.MAX_AVATARS_IN_TEAM) {
|
||||||
@@ -199,6 +211,13 @@ public class LineupManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an avatar from a lineup
|
||||||
|
* @param index Index of the lineup we are removing the avatar from
|
||||||
|
* @param slot The slot that we want to remove the avatar from
|
||||||
|
* @param avatarId Id of the avatar we are removing
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
public boolean quitLineup(int index, int avatarId) {
|
public boolean quitLineup(int index, int avatarId) {
|
||||||
// Get lineup
|
// Get lineup
|
||||||
PlayerLineup lineup = this.getLineupByIndex(index);
|
PlayerLineup lineup = this.getLineupByIndex(index);
|
||||||
@@ -211,7 +230,7 @@ public class LineupManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
// Remove avatar from lineup
|
||||||
int i = lineup.getAvatars().indexOf(avatarId);
|
int i = lineup.getAvatars().indexOf(avatarId);
|
||||||
if (i != -1) {
|
if (i != -1) {
|
||||||
lineup.getAvatars().remove(i);
|
lineup.getAvatars().remove(i);
|
||||||
@@ -238,6 +257,11 @@ public class LineupManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the player's active lineup
|
||||||
|
* @param index Index of the lineup we are changing to
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
public boolean switchLineup(int index) {
|
public boolean switchLineup(int index) {
|
||||||
// Sanity + Prevent lineups from being changed when the player is using an extra lineup
|
// Sanity + Prevent lineups from being changed when the player is using an extra lineup
|
||||||
if (index == this.getCurrentIndex() || this.currentExtraIndex > 0) {
|
if (index == this.getCurrentIndex() || this.currentExtraIndex > 0) {
|
||||||
@@ -247,7 +271,7 @@ public class LineupManager {
|
|||||||
// Get lineup
|
// Get lineup
|
||||||
PlayerLineup lineup = this.getLineupByIndex(index);
|
PlayerLineup lineup = this.getLineupByIndex(index);
|
||||||
|
|
||||||
// Make sure lineup exists and has size
|
// Make sure our next lineup exists and has avatars in it
|
||||||
if (lineup == null || lineup.size() == 0) {
|
if (lineup == null || lineup.size() == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -265,6 +289,13 @@ public class LineupManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the avatars of a lineup
|
||||||
|
* @param index Index of the lineup we are replacing the avatars on
|
||||||
|
* @param extraLineupType
|
||||||
|
* @param lineupList New avatar list
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
public boolean replaceLineup(int index, int extraLineupType, List<Integer> lineupList) {
|
public boolean replaceLineup(int index, int extraLineupType, List<Integer> lineupList) {
|
||||||
// Get lineup
|
// Get lineup
|
||||||
PlayerLineup lineup = this.getLineupByIndex(index, extraLineupType);
|
PlayerLineup lineup = this.getLineupByIndex(index, extraLineupType);
|
||||||
@@ -305,17 +336,23 @@ public class LineupManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swaps the positions of 2 avatars on a lineup
|
||||||
|
* @param index Index of the lineup we are swapping avatars on
|
||||||
|
* @param src 1st avatar slot
|
||||||
|
* @param dest 2nd avatar slot
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
public boolean swapLineup(int index, int src, int dest) {
|
public boolean swapLineup(int index, int src, int dest) {
|
||||||
// Sanity
|
// Sanity
|
||||||
if (src == dest) return false;
|
if (src == dest) return false;
|
||||||
|
|
||||||
// Get lineup
|
// Get lineup
|
||||||
PlayerLineup lineup = this.getLineupByIndex(index);
|
PlayerLineup lineup = this.getLineupByIndex(index);
|
||||||
// Validate slots
|
if (lineup == null) return false;
|
||||||
if ((lineup == null) || (src < 0 && src >= lineup.size())) {
|
|
||||||
return false;
|
// Validate slots to make sure avatars are in them
|
||||||
}
|
if (!lineup.isActiveSlot(src) || !lineup.isActiveSlot(dest)) {
|
||||||
if (dest < 0 && dest >= lineup.size()) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,6 +372,12 @@ public class LineupManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes a lineup's name
|
||||||
|
* @param index
|
||||||
|
* @param name
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public boolean changeLineupName(int index, String name) {
|
public boolean changeLineupName(int index, String name) {
|
||||||
// Get lineup
|
// Get lineup
|
||||||
PlayerLineup lineup = this.getLineupByIndex(index);
|
PlayerLineup lineup = this.getLineupByIndex(index);
|
||||||
@@ -347,6 +390,8 @@ public class LineupManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Database
|
||||||
|
|
||||||
public void loadFromDatabase() {
|
public void loadFromDatabase() {
|
||||||
// Load lineups from database
|
// Load lineups from database
|
||||||
var list = LunarCore.getGameDatabase()
|
var list = LunarCore.getGameDatabase()
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package emu.lunarcore.game.player.lineup;
|
package emu.lunarcore.game.player.lineup;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -15,6 +14,8 @@ import emu.lunarcore.game.avatar.GameAvatar;
|
|||||||
import emu.lunarcore.game.player.Player;
|
import emu.lunarcore.game.player.Player;
|
||||||
import emu.lunarcore.proto.LineupInfoOuterClass.LineupInfo;
|
import emu.lunarcore.proto.LineupInfoOuterClass.LineupInfo;
|
||||||
import emu.lunarcore.server.packet.send.PacketSyncLineupNotify;
|
import emu.lunarcore.server.packet.send.PacketSyncLineupNotify;
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntArrayList;
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ public class PlayerLineup {
|
|||||||
private transient Player owner;
|
private transient Player owner;
|
||||||
|
|
||||||
protected int index;
|
protected int index;
|
||||||
protected List<Integer> avatars;
|
protected IntList avatars;
|
||||||
|
|
||||||
@Setter private int leader;
|
@Setter private int leader;
|
||||||
@Setter private String name;
|
@Setter private String name;
|
||||||
@@ -38,7 +39,7 @@ public class PlayerLineup {
|
|||||||
this.owner = player;
|
this.owner = player;
|
||||||
this.ownerUid = player.getUid();
|
this.ownerUid = player.getUid();
|
||||||
this.index = index;
|
this.index = index;
|
||||||
this.avatars = new ArrayList<>(GameConstants.MAX_AVATARS_IN_TEAM);
|
this.avatars = new IntArrayList(GameConstants.MAX_AVATARS_IN_TEAM);
|
||||||
|
|
||||||
// Set team name if not an extra lineup
|
// Set team name if not an extra lineup
|
||||||
if (!this.isExtraLineup()) {
|
if (!this.isExtraLineup()) {
|
||||||
@@ -65,7 +66,7 @@ public class PlayerLineup {
|
|||||||
public synchronized List<Integer> getAvatars() {
|
public synchronized List<Integer> getAvatars() {
|
||||||
return avatars;
|
return avatars;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int size() {
|
public int size() {
|
||||||
return getAvatars().size();
|
return getAvatars().size();
|
||||||
}
|
}
|
||||||
@@ -127,6 +128,15 @@ public class PlayerLineup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the slot contains an avatar
|
||||||
|
* @param slot The slot we are checking for
|
||||||
|
* @return true if the slot contains an avatar
|
||||||
|
*/
|
||||||
|
public synchronized boolean isActiveSlot(int slot) {
|
||||||
|
return slot >= 0 && slot < this.size();
|
||||||
|
}
|
||||||
|
|
||||||
// Database
|
// Database
|
||||||
|
|
||||||
public void save() {
|
public void save() {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public class HandlerSetLineupNameCsReq extends PacketHandler {
|
|||||||
var req = SetLineupNameCsReq.parseFrom(data);
|
var req = SetLineupNameCsReq.parseFrom(data);
|
||||||
|
|
||||||
var success = session.getPlayer().getLineupManager().changeLineupName(req.getIndex(), req.getName());
|
var success = session.getPlayer().getLineupManager().changeLineupName(req.getIndex(), req.getName());
|
||||||
session.send(new PacketSetLineupNameScRsp(success ? req.getName() : null));
|
session.send(new PacketSetLineupNameScRsp(req.getIndex(), success ? req.getName() : null));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,13 @@ import emu.lunarcore.server.packet.CmdId;
|
|||||||
|
|
||||||
public class PacketSetLineupNameScRsp extends BasePacket {
|
public class PacketSetLineupNameScRsp extends BasePacket {
|
||||||
|
|
||||||
public PacketSetLineupNameScRsp(String name) {
|
public PacketSetLineupNameScRsp(int index, String name) {
|
||||||
super(CmdId.SetLineupNameScRsp);
|
super(CmdId.SetLineupNameScRsp);
|
||||||
|
|
||||||
var data = SetLineupNameScRsp.newInstance();
|
var data = SetLineupNameScRsp.newInstance();
|
||||||
|
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
|
data.setIndex(index);
|
||||||
data.setName(name);
|
data.setName(name);
|
||||||
} else {
|
} else {
|
||||||
data.setRetcode(1);
|
data.setRetcode(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user