Skip to content

Commit

Permalink
refactor: 重构协议数据包类以添加协议版本检测
Browse files Browse the repository at this point in the history
  • Loading branch information
babyw1nter committed Jul 17, 2021
1 parent 6280d94 commit 4cdf0c9
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 96 deletions.
Original file line number Diff line number Diff line change
@@ -1,31 +1,29 @@
package io.github.hhui64.pixelmoninfoplus.network;

import io.netty.buffer.ByteBuf;
import com.pixelmonmod.pixelmon.Pixelmon;
import com.pixelmonmod.pixelmon.api.pokemon.Pokemon;
import com.pixelmonmod.pixelmon.entities.pixelmon.stats.IVStore;
import com.pixelmonmod.pixelmon.entities.pixelmon.stats.StatsType;
import com.pixelmonmod.pixelmon.storage.PlayerPartyStorage;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class GetIVSMessageRequest implements IMessage {
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

public class GetIVSMessageRequest extends IMessageBase {
private static final Logger logger = LogManager.getLogger("GetIVSMessageRequest");
public NBTTagCompound compound;

public GetIVSMessageRequest() {
}

@Override
public void fromBytes(ByteBuf buf) {
compound = ByteBufUtils.readTag(buf);
}

@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeTag(buf, compound);
super();
}

public static class GetIvsMessageRequestHandler implements IMessageHandler<GetIVSMessageRequest, IMessage> {
Expand All @@ -35,10 +33,47 @@ public IMessage onMessage(GetIVSMessageRequest message, MessageContext ctx) {
if (ctx.side == Side.SERVER) {
// 获取向服务器发送数据包的玩家
EntityPlayerMP serverPlayer = ctx.getServerHandler().player;
String queryIVSPokemonUUID = message.compound.getString("query");
GetIvsMessageResponse getIvsMessageResponse = new GetIvsMessageResponse();

// 添加为一个计划任务(Scheduled Task),在主服务器线程上执行操作
serverPlayer.getServerWorld().addScheduledTask(() -> {
PixelmonInfoPlusPacketHandler.sendGetIVSMessageResponseToClient(serverPlayer, message.compound.getString("query"));
// 获取玩家的宝可梦 party
PlayerPartyStorage playerPartyStorage = Pixelmon.storageManager.getParty(serverPlayer);

List<UUID> listQueryIVSPokemonUUID = new ArrayList<>();
if (!queryIVSPokemonUUID.equals("")) {
listQueryIVSPokemonUUID = Arrays.stream(queryIVSPokemonUUID.split(":")).map(UUID::fromString).collect(Collectors.toList());
getIvsMessageResponse.compound.setString("query", queryIVSPokemonUUID);
} else {
getIvsMessageResponse.compound.setString("query", "");
}

if (playerPartyStorage != null) {
for (UUID pokemonUUID : listQueryIVSPokemonUUID) {
Pokemon pokemon = playerPartyStorage.get(playerPartyStorage.getSlot(pokemonUUID));

// 写入 NBT 实例
if (pokemon != null && !pokemon.isEgg()) {
IVStore ivs = pokemon.getIVs();
getIvsMessageResponse.compound.setIntArray(pokemon.getUUID().toString(), ivs.getArray());
getIvsMessageResponse.compound.setIntArray(
pokemon.getUUID().toString() + ":ht",
new int[]{ivs.isHyperTrained(StatsType.HP) ? 1 : 0,
ivs.isHyperTrained(StatsType.Attack) ? 1 : 0,
ivs.isHyperTrained(StatsType.Defence) ? 1 : 0,
ivs.isHyperTrained(StatsType.SpecialAttack) ? 1 : 0,
ivs.isHyperTrained(StatsType.SpecialDefence) ? 1 : 0,
ivs.isHyperTrained(StatsType.Speed) ? 1 : 0}
);
} else {
getIvsMessageResponse.compound.setIntArray(String.valueOf(pokemonUUID), new IVStore(new int[]{0, 0, 0, 0, 0, 0}).getArray());
getIvsMessageResponse.compound.setIntArray(pokemonUUID + ":ht", new int[]{0, 0, 0, 0, 0, 0});
}
}
}

PixelmonInfoPlusPacketHandler.INSTANCE.sendTo(getIvsMessageResponse, serverPlayer);
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import com.pixelmonmod.pixelmon.entities.pixelmon.stats.IVStore;
import com.pixelmonmod.pixelmon.entities.pixelmon.stats.StatsType;
import io.github.hhui64.pixelmoninfoplus.util.PartyCache;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraft.util.text.ChatType;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
Expand All @@ -17,29 +16,23 @@
import java.util.*;
import java.util.stream.Collectors;

public class GetIvsMessageResponse implements IMessage {
public class GetIvsMessageResponse extends IMessageBase {
private static final Logger logger = LogManager.getLogger("GetIvsMessageResponse");
public NBTTagCompound compound;

public GetIvsMessageResponse() {
}


@Override
public void fromBytes(ByteBuf buf) {
compound = ByteBufUtils.readTag(buf);
}

@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeTag(buf, compound);
super();
}

public static class IvsMessageHandler implements IMessageHandler<GetIvsMessageResponse, IMessage> {

@Override
public IMessage onMessage(GetIvsMessageResponse message, MessageContext ctx) {
if (ctx.side == Side.CLIENT) {
// 判断协议版本
if (!message.isProtocolVersionMatched()) {
Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentTranslation("pixelmoninfoplus.protocol.versioncheckfialed"));
}

List<UUID> listQueryIVSPokemonUUID;
Map<String, IVStore> pokemonsIVStore = new HashMap<>();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.github.hhui64.pixelmoninfoplus.network;

import io.netty.buffer.ByteBuf;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;

public abstract class IMessageBase implements IMessage {
public static int protocolVersion = 2;
public NBTTagCompound compound;

public IMessageBase() {
super();
compound = new NBTTagCompound();
if (getProtocolVersion() <= 0) {
compound.setInteger("protocolVersion", IMessageBase.protocolVersion);
}
}

@Override
public void fromBytes(ByteBuf buf) {
compound = ByteBufUtils.readTag(buf);
}

@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeTag(buf, compound);
}

public int getLocalProtocolVersion() {
return protocolVersion;
}

public int getProtocolVersion() {
return this.compound.getInteger("protocolVersion");
}

public boolean isProtocolVersionMatched() {
return this.compound.getInteger("protocolVersion") == IMessageBase.protocolVersion;
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,12 @@
package io.github.hhui64.pixelmoninfoplus.network;

import com.pixelmonmod.pixelmon.Pixelmon;
import com.pixelmonmod.pixelmon.api.pokemon.Pokemon;
import com.pixelmonmod.pixelmon.entities.pixelmon.stats.IVStore;
import com.pixelmonmod.pixelmon.entities.pixelmon.stats.StatsType;
import com.pixelmonmod.pixelmon.storage.PlayerPartyStorage;
import io.github.hhui64.pixelmoninfoplus.PixelmonInfoPlus;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import net.minecraftforge.fml.relauncher.Side;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

public class PixelmonInfoPlusPacketHandler {
private static final Logger logger = LogManager.getLogger("PixelmonInfoPlusPacketHandler");
public static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel(PixelmonInfoPlus.MODID);
Expand All @@ -38,56 +25,7 @@ public static void init() {
*/
public static void sendGetIVSMessageRequestToServer(String queryIVSPokemonUUID) {
GetIVSMessageRequest getIVSMessageRequest = new GetIVSMessageRequest();
getIVSMessageRequest.compound = new NBTTagCompound();
getIVSMessageRequest.compound.setString("query", queryIVSPokemonUUID);
PixelmonInfoPlusPacketHandler.INSTANCE.sendToServer(getIVSMessageRequest);
}

/**
* 服务器向指定玩家的客户端发送
*
* @param p 玩家
*/
public static void sendGetIVSMessageResponseToClient(EntityPlayerMP p, String queryIVSPokemonUUID) {
GetIvsMessageResponse getIvsMessageResponse = new GetIvsMessageResponse();
getIvsMessageResponse.compound = new NBTTagCompound();

// 获取玩家的宝可梦 party
PlayerPartyStorage playerPartyStorage = Pixelmon.storageManager.getParty(p);

List<UUID> listQueryIVSPokemonUUID = new ArrayList<>();
if (!queryIVSPokemonUUID.equals("")) {
listQueryIVSPokemonUUID = Arrays.stream(queryIVSPokemonUUID.split(":")).map(UUID::fromString).collect(Collectors.toList());
getIvsMessageResponse.compound.setString("query", queryIVSPokemonUUID);
} else {
getIvsMessageResponse.compound.setString("query", "");
}

if (playerPartyStorage != null) {
for (UUID pokemonUUID : listQueryIVSPokemonUUID) {
Pokemon pokemon = playerPartyStorage.get(playerPartyStorage.getSlot(pokemonUUID));

// 写入 NBT 实例
if (pokemon != null && !pokemon.isEgg()) {
IVStore ivs = pokemon.getIVs();
getIvsMessageResponse.compound.setIntArray(pokemon.getUUID().toString(), ivs.getArray());
getIvsMessageResponse.compound.setIntArray(
pokemon.getUUID().toString() + ":ht",
new int[]{ivs.isHyperTrained(StatsType.HP) ? 1 : 0,
ivs.isHyperTrained(StatsType.Attack) ? 1 : 0,
ivs.isHyperTrained(StatsType.Defence) ? 1 : 0,
ivs.isHyperTrained(StatsType.SpecialAttack) ? 1 : 0,
ivs.isHyperTrained(StatsType.SpecialDefence) ? 1 : 0,
ivs.isHyperTrained(StatsType.Speed) ? 1 : 0}
);
} else {
getIvsMessageResponse.compound.setIntArray(String.valueOf(pokemonUUID), new IVStore(new int[]{0, 0, 0, 0, 0, 0}).getArray());
getIvsMessageResponse.compound.setIntArray(pokemonUUID + ":ht", new int[]{0, 0, 0, 0, 0, 0});
}
}
}

// 无论如何,都要响应
PixelmonInfoPlusPacketHandler.INSTANCE.sendTo(getIvsMessageResponse, p);
}
}
5 changes: 4 additions & 1 deletion src/main/resources/assets/pixelmoninfoplus/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@ gui.statspanel.spdefense.name=SpDef
gui.statspanel.speed.name=Spd

# more
mod.pixelmoninfoplus.name=Pixelmon Info Plus
mod.pixelmoninfoplus.name=Pixelmon Info Plus

# message
pixelmoninfoplus.protocol.versioncheckfialed=[PixelmonInfoPlus] Protocol version does not match, please update to the latest version.
5 changes: 4 additions & 1 deletion src/main/resources/assets/pixelmoninfoplus/lang/zh_cn.lang
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@ gui.statspanel.spdefense.name=特防
gui.statspanel.speed.name=速度

# more
mod.pixelmoninfoplus.name=Pixelmon Info Plus
mod.pixelmoninfoplus.name=Pixelmon Info Plus

# message
pixelmoninfoplus.protocol.versioncheckfialed=[PixelmonInfoPlus] 协议版本不匹配,请更新至最新版本。

0 comments on commit 4cdf0c9

Please sign in to comment.