Skip to content

Commit

Permalink
More networking yey
Browse files Browse the repository at this point in the history
ReclipseTheOne committed Jan 10, 2025
1 parent 9e788ee commit e4c38b2
Showing 8 changed files with 375 additions and 6 deletions.
65 changes: 63 additions & 2 deletions src/main/java/com/portingdeadmods/researchd/ResearchTeamUtil.java
Original file line number Diff line number Diff line change
@@ -2,14 +2,16 @@

import com.portingdeadmods.researchd.data.ResearchdSavedData;
import com.portingdeadmods.researchd.data.helper.ResearchTeam;
import com.portingdeadmods.researchd.data.helper.ResearchTeamMap;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;

import java.util.UUID;

public class ResearchTeamUtil {
// CALL THESE METHOD ONLY IF YOU ARE SURE YOU'RE ON SERVER SIDE

/**
* CALL THIS METHOD ONLY IF YOU ARE SURE YOU'RE ON SERVER SIDE
*
* Checks if the Player is the leader of his research team.
* @param player
*/
@@ -27,8 +29,67 @@ public static int getPermissionLevel(Player player) {
return team.getPermissionLevel(uuid);
}

public static int getPermissionLevel(Level level, UUID uuid) {
ResearchTeam team = ResearchdSavedData.get(level).getTeamForUUID(uuid);

return team.getPermissionLevel(uuid);
}


public static ResearchTeam getResearchTeam(Player player) {
UUID uuid = player.getUUID();
return ResearchdSavedData.get(player.level()).getTeamForUUID(uuid);
}

public static boolean isInATeam(Player player) {
UUID uuid = player.getUUID();
return ResearchdSavedData.get(player.level()).getTeamForUUID(uuid) != null;
}

public static boolean arePlayersSameTeam(Player player1, Player player2) {
UUID uuid1 = player1.getUUID();
UUID uuid2 = player2.getUUID();
ResearchTeam team1 = ResearchdSavedData.get(player1.level()).getTeamForUUID(uuid1);
ResearchTeam team2 = ResearchdSavedData.get(player2.level()).getTeamForUUID(uuid2);

return team1.equals(team2);
}

public static boolean arePlayersSameTeam(Player player1, UUID uuid2) {
UUID uuid1 = player1.getUUID();
ResearchdSavedData savedData = ResearchdSavedData.get(player1.level());

ResearchTeam team1 = savedData.getTeamForUUID(uuid1);
ResearchTeam team2 = savedData.getTeamForUUID(uuid2);

return team1.equals(team2);
}

public static boolean arePlayersSameTeam(Level level, UUID uuid1, UUID uuid2) {
ResearchdSavedData savedData = ResearchdSavedData.get(level);

ResearchTeam team1 = savedData.getTeamForUUID(uuid1);
ResearchTeam team2 = savedData.getTeamForUUID(uuid2);

return team1.equals(team2);
}

/**
* Removes the player from his research team.
* <br>
* Sets savedData dirty
* @param player
*/
public static void removeModFromTeam(Player player) {
UUID uuid = player.getUUID();
ResearchdSavedData savedData = ResearchdSavedData.get(player.level());
ResearchTeam team = savedData.getTeamForUUID(uuid);

if (team != null) {
team.removeModerator(uuid);
team.removeMember(uuid);
}

savedData.setDirty();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.portingdeadmods.researchd.networking;

import com.portingdeadmods.researchd.ResearchTeamUtil;
import com.portingdeadmods.researchd.Researchd;
import com.portingdeadmods.researchd.data.ResearchdSavedData;
import com.portingdeadmods.researchd.data.helper.ResearchTeam;
import net.minecraft.core.UUIDUtil;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public record EnterTeamPayload(UUID memberOfTeam) implements CustomPacketPayload {
public static final Type<EnterTeamPayload> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Researchd.MODID, "manage_member_payload"));
public static final StreamCodec<RegistryFriendlyByteBuf, EnterTeamPayload> STREAM_CODEC = StreamCodec.composite(
UUIDUtil.STREAM_CODEC,
EnterTeamPayload::memberOfTeam,
EnterTeamPayload::new
);

@Override
public @NotNull Type<? extends CustomPacketPayload> type() {
return TYPE;
}

public static void enterTeamAction(EnterTeamPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
Player sender = context.player();
Level level = sender.level();
UUID senderId = sender.getUUID();

ResearchdSavedData savedData = ResearchdSavedData.get(level);
ResearchTeam team = savedData.getTeamForUUID(payload.memberOfTeam());

if (team != null && team.getReceivedInvites().contains(senderId)) {
team.addMember(senderId);
team.removeInvite(senderId);
savedData.setDirty();
}

}).exceptionally(e -> {
context.disconnect(Component.literal("Action Failed: " + e.getMessage()));
return null;
});

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.portingdeadmods.researchd.networking;

import com.portingdeadmods.researchd.ResearchTeamUtil;
import com.portingdeadmods.researchd.Researchd;
import com.portingdeadmods.researchd.data.ResearchdSavedData;
import com.portingdeadmods.researchd.data.helper.ResearchTeam;
import net.minecraft.core.UUIDUtil;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.neoforged.neoforge.network.PacketDistributor;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public record LeaveTeamPayload(UUID nextToLead) implements CustomPacketPayload {
public static final Type<LeaveTeamPayload> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Researchd.MODID, "manage_member_payload"));
public static final StreamCodec<RegistryFriendlyByteBuf, LeaveTeamPayload> STREAM_CODEC = StreamCodec.composite(
UUIDUtil.STREAM_CODEC,
LeaveTeamPayload::nextToLead,
LeaveTeamPayload::new
);

@Override
public @NotNull Type<? extends CustomPacketPayload> type() {
return TYPE;
}

public static void leaveTeamAction(LeaveTeamPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
Player sender = context.player();
Level level = sender.level();
UUID senderId = sender.getUUID();

ResearchdSavedData savedData = ResearchdSavedData.get(level);

// Handle the case of transfering ownership
if (ResearchTeamUtil.isResearchTeamLeader(sender)) {
PacketDistributor.sendToServer(new TransferOwnershipPayload(payload.nextToLead()));
savedData.setDirty();
return;
}

if (ResearchTeamUtil.getPermissionLevel(sender) == 1) {
ResearchTeamUtil.removeModFromTeam(sender);
}

}).exceptionally(e -> {
context.disconnect(Component.literal("Action Failed: " + e.getMessage()));
return null;
});

}
}
Original file line number Diff line number Diff line change
@@ -32,16 +32,20 @@ public record ManageMemberPayload(UUID member, boolean remove) implements Custom
return TYPE;
}

public static void keyPressedAction(ManageMemberPayload payload, IPayloadContext context) {
public static void manageMemberAction(ManageMemberPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
Player sender = context.player();
UUID senderId = sender.getUUID();
ResearchdSavedData savedData = ResearchdSavedData.get(sender.level());

if (ResearchTeamUtil.getPermissionLevel(sender) >= 1) {
if (payload.remove() == true)
if (payload.remove() == true) {
ResearchTeamUtil.getResearchTeam(sender).removeMember(payload.member());
else
savedData.setDirty();
} else {
ResearchTeamUtil.getResearchTeam(sender).addInvite(payload.member());
savedData.setDirty();
}
}
}).exceptionally(e -> {
context.disconnect(Component.literal("Action Failed: " + e.getMessage()));
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.portingdeadmods.researchd.networking;

import com.portingdeadmods.researchd.ResearchTeamUtil;
import com.portingdeadmods.researchd.Researchd;
import com.portingdeadmods.researchd.data.ResearchdSavedData;
import net.minecraft.core.UUIDUtil;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public record ManageModeratorPayload(UUID moderator, boolean remove) implements CustomPacketPayload {
public static final Type<ManageModeratorPayload> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Researchd.MODID, "manage_member_payload"));
public static final StreamCodec<RegistryFriendlyByteBuf, ManageModeratorPayload> STREAM_CODEC = StreamCodec.composite(
UUIDUtil.STREAM_CODEC,
ManageModeratorPayload::moderator,
ByteBufCodecs.BOOL,
ManageModeratorPayload::remove,
ManageModeratorPayload::new
);

@Override
public @NotNull Type<? extends CustomPacketPayload> type() {
return TYPE;
}

public static void manageModeratorAction(ManageModeratorPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
Player sender = context.player();
UUID senderId = sender.getUUID();
ResearchdSavedData savedData = ResearchdSavedData.get(sender.level());

if (ResearchTeamUtil.getPermissionLevel(sender) == 2) {
if (payload.remove()) {
ResearchTeamUtil.getResearchTeam(sender).removeModerator(payload.moderator());
savedData.setDirty();
} else {
ResearchTeamUtil.getResearchTeam(sender).addModerator(payload.moderator());
savedData.setDirty();
}
}
}).exceptionally(e -> {
context.disconnect(Component.literal("Action Failed: " + e.getMessage()));
return null;
});

}
}
Original file line number Diff line number Diff line change
@@ -11,10 +11,37 @@ public class NetworkEvents {
@SubscribeEvent
public static void registerPayloads(final RegisterPayloadHandlersEvent event) {
final PayloadRegistrar registrar = event.registrar(Researchd.MODID);
registrar.playToServer(
EnterTeamPayload.TYPE,
EnterTeamPayload.STREAM_CODEC,
EnterTeamPayload::enterTeamAction
);
registrar.playToServer(
LeaveTeamPayload.TYPE,
LeaveTeamPayload.STREAM_CODEC,
LeaveTeamPayload::leaveTeamAction
);

registrar.playToServer(
ManageMemberPayload.TYPE,
ManageMemberPayload.STREAM_CODEC,
ManageMemberPayload::keyPressedAction
ManageMemberPayload::manageMemberAction
);
registrar.playToServer(
ManageModeratorPayload.TYPE,
ManageModeratorPayload.STREAM_CODEC,
ManageModeratorPayload::manageModeratorAction
);
registrar.playToServer(
TransferOwnershipPayload.TYPE,
TransferOwnershipPayload.STREAM_CODEC,
TransferOwnershipPayload::transferOwnershipAction
);

registrar.playToServer(
SetNamePayload.TYPE,
SetNamePayload.STREAM_CODEC,
SetNamePayload::setNameAction
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.portingdeadmods.researchd.networking;

import com.portingdeadmods.researchd.ResearchTeamUtil;
import com.portingdeadmods.researchd.Researchd;
import com.portingdeadmods.researchd.data.ResearchdSavedData;
import net.minecraft.core.UUIDUtil;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public record SetNamePayload(String name) implements CustomPacketPayload {
public static final Type<SetNamePayload> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Researchd.MODID, "manage_member_payload"));
public static final StreamCodec<RegistryFriendlyByteBuf, SetNamePayload> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.STRING_UTF8,
SetNamePayload::name,
SetNamePayload::new
);

@Override
public @NotNull Type<? extends CustomPacketPayload> type() {
return TYPE;
}

public static void setNameAction(SetNamePayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
Player sender = context.player();
UUID senderId = sender.getUUID();
ResearchdSavedData savedData = ResearchdSavedData.get(sender.level());

if (ResearchTeamUtil.getPermissionLevel(sender) == 2) {
ResearchTeamUtil.getResearchTeam(sender).setName(payload.name());
savedData.setDirty();
}
}).exceptionally(e -> {
context.disconnect(Component.literal("Action Failed: " + e.getMessage()));
return null;
});

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.portingdeadmods.researchd.networking;

import com.portingdeadmods.researchd.ResearchTeamUtil;
import com.portingdeadmods.researchd.Researchd;
import com.portingdeadmods.researchd.data.ResearchdSavedData;
import net.minecraft.core.UUIDUtil;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public record TransferOwnershipPayload(UUID uuid) implements CustomPacketPayload {
public static final Type<TransferOwnershipPayload> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Researchd.MODID, "manage_member_payload"));
public static final StreamCodec<RegistryFriendlyByteBuf, TransferOwnershipPayload> STREAM_CODEC = StreamCodec.composite(
UUIDUtil.STREAM_CODEC,
TransferOwnershipPayload::uuid,
TransferOwnershipPayload::new
);

@Override
public @NotNull Type<? extends CustomPacketPayload> type() {
return TYPE;
}

public static void transferOwnershipAction(TransferOwnershipPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
Player sender = context.player();
Level level = sender.level();
UUID senderId = sender.getUUID();
ResearchdSavedData savedData = ResearchdSavedData.get(sender.level());

if (ResearchTeamUtil.getPermissionLevel(sender) == 2) {
if (ResearchTeamUtil.arePlayersSameTeam(level, senderId, payload.uuid())) {
// Set the new leader
ResearchTeamUtil.getResearchTeam(sender).setLeader(payload.uuid());

// If he's moderator remove him from the mod list
if (ResearchTeamUtil.getPermissionLevel(level, payload.uuid()) == 1) {
ResearchTeamUtil.getResearchTeam(sender).removeModerator(payload.uuid());
}

// Set the old leader as moderator
ResearchTeamUtil.getResearchTeam(sender).addModerator(senderId);
savedData.setDirty();
}
}
}).exceptionally(e -> {
context.disconnect(Component.literal("Action Failed: " + e.getMessage()));
return null;
});

}
}

0 comments on commit e4c38b2

Please sign in to comment.