Files
CustomNPC-Plus/src/main/java/noppes/npcs/controllers/data/Party.java
T

489 lines
17 KiB
Java
Raw Normal View History

2023-10-30 21:06:01 -04:00
package noppes.npcs.controllers.data;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
2023-10-30 21:06:01 -04:00
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
2024-02-08 14:12:44 -05:00
import net.minecraft.util.ChatComponentText;
import noppes.npcs.NoppesUtilServer;
import noppes.npcs.api.entity.IPlayer;
2023-10-30 21:06:01 -04:00
import noppes.npcs.api.handler.IPlayerQuestData;
import noppes.npcs.api.handler.data.IParty;
2023-10-30 21:06:01 -04:00
import noppes.npcs.api.handler.data.IQuest;
2024-03-06 20:20:37 -05:00
import noppes.npcs.constants.EnumPartyObjectives;
2024-02-08 14:12:44 -05:00
import noppes.npcs.constants.EnumPartyRequirements;
import noppes.npcs.controllers.PartyController;
2023-10-30 21:06:01 -04:00
import noppes.npcs.controllers.PlayerDataController;
import noppes.npcs.controllers.QuestController;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.*;
2023-10-30 21:06:01 -04:00
public class Party implements IParty {
private final UUID partyUUID;
2023-10-30 21:06:01 -04:00
private UUID partyLeader;
2024-03-02 17:13:50 -05:00
private QuestData questData;
2023-10-30 21:06:01 -04:00
2023-10-31 23:26:57 -04:00
private final HashMap<UUID, String> partyMembers = new HashMap<>();
private final ArrayList<UUID> partyOrder = new ArrayList<>();
2023-10-30 21:06:01 -04:00
private int currentQuestID = -1;
2024-02-12 23:56:55 -06:00
private String currentQuestName = "";
private boolean friendlyFire;
2024-02-07 23:55:55 -05:00
private boolean partyLocked = false;
//Client-sided
private String partyLeaderName;
2024-02-18 01:30:34 -06:00
private Quest quest;
public Party() {
this.partyUUID = UUID.randomUUID();
2023-10-30 21:06:01 -04:00
}
public Party(UUID uuid) {
this.partyUUID = uuid;
}
public UUID getPartyUUID() {
return this.partyUUID;
2023-10-30 21:06:01 -04:00
}
@Override
public String getPartyUUIDString() {
return this.partyUUID.toString();
}
@Override
2024-02-07 23:55:55 -05:00
public boolean getIsLocked() {
return this.partyLocked;
}
@Override
2024-02-12 23:56:55 -06:00
public void setQuest(IQuest quest) {
if (quest != null) {
this.currentQuestID = quest.getId();
this.currentQuestName = quest.getName();
2024-03-02 17:13:50 -05:00
this.questData = new QuestData((Quest) quest);
2024-02-12 23:56:55 -06:00
} else {
this.currentQuestID = -1;
this.currentQuestName = "";
2024-03-02 17:13:50 -05:00
this.questData = null;
2024-02-12 23:56:55 -06:00
}
this.partyLocked = quest != null;
}
@Override
2024-02-12 23:56:55 -06:00
public IQuest getQuest() {
2024-02-18 01:30:34 -06:00
if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) {
return QuestController.Instance.get(this.currentQuestID);
} else {
return this.quest;
}
2024-02-07 23:55:55 -05:00
}
2024-03-02 17:13:50 -05:00
public QuestData getQuestData() {
return questData;
}
2024-03-06 20:20:37 -05:00
public EnumPartyObjectives getObjectiveRequirement() {
2025-03-13 17:14:45 -04:00
if (getQuestData() != null) {
if (getQuestData().quest != null) {
2024-03-06 20:20:37 -05:00
return getQuestData().quest.partyOptions.objectiveRequirement;
}
}
return null;
}
@Override
2023-10-30 21:06:01 -04:00
public int getCurrentQuestID() {
return currentQuestID;
}
@Override
2024-02-12 23:56:55 -06:00
public String getCurrentQuestName() {
return this.currentQuestName;
2023-10-30 21:06:01 -04:00
}
2023-10-31 23:26:57 -04:00
public boolean addPlayer(EntityPlayer player) {
if (player == null) return false;
2025-03-13 17:14:45 -04:00
if (partyMembers.containsKey(player.getUniqueID())) {
2023-10-31 23:26:57 -04:00
return false;
}
2023-10-30 21:06:01 -04:00
PlayerData playerData = PlayerData.get(player);
playerData.partyUUID = this.partyUUID;
2023-10-31 23:26:57 -04:00
partyMembers.put(player.getUniqueID(), player.getCommandSenderName());
partyOrder.add(player.getUniqueID());
return true;
2023-10-30 21:06:01 -04:00
}
public boolean removePlayer(EntityPlayer player) {
if (player == null) return false;
2023-10-31 23:26:57 -04:00
UUID uuid = player.getUniqueID();
2025-03-13 17:14:45 -04:00
if (partyMembers.containsKey(uuid)) {
2023-10-31 23:26:57 -04:00
partyMembers.remove(uuid);
partyOrder.remove(uuid);
2025-03-13 17:14:45 -04:00
if (uuid.equals(partyLeader)) {
if (partyMembers.size() > 0) {
2023-10-31 23:26:57 -04:00
partyLeader = partyOrder.get(0);
}
}
PlayerData playerData = PlayerData.get(player);
playerData.partyUUID = null;
2023-10-31 23:26:57 -04:00
return true;
}
return false;
2023-10-30 21:06:01 -04:00
}
2024-03-06 05:23:45 -05:00
public boolean removePlayer(UUID uuid) {
if (uuid == null) return false;
2025-03-13 17:14:45 -04:00
if (partyMembers.containsKey(uuid)) {
2024-03-06 05:23:45 -05:00
partyMembers.remove(uuid);
partyOrder.remove(uuid);
2025-03-13 17:14:45 -04:00
if (uuid.equals(partyLeader)) {
if (!partyMembers.isEmpty()) {
2024-03-06 05:23:45 -05:00
partyLeader = partyOrder.get(0);
}
}
PlayerData playerData = PlayerDataController.Instance.getPlayerDataCache(uuid.toString());
playerData.partyUUID = null;
return true;
}
return false;
}
@Override
public boolean addPlayer(String playerName) {
return playerName != null && this.addPlayer(NoppesUtilServer.getPlayerByName(playerName));
}
@Override
public boolean removePlayer(String playerName) {
return playerName != null && this.removePlayer(NoppesUtilServer.getPlayerByName(playerName));
2023-10-30 21:06:01 -04:00
}
@Override
public boolean addPlayer(IPlayer player) {
2025-03-13 17:14:45 -04:00
return player != null && this.addPlayer((EntityPlayerMP) player.getMCEntity());
}
@Override
public boolean removePlayer(IPlayer player) {
2025-03-13 17:14:45 -04:00
return player != null && this.removePlayer((EntityPlayerMP) player.getMCEntity());
}
public boolean hasPlayer(EntityPlayer player) {
return partyMembers.containsKey(player.getUniqueID());
2023-10-31 23:26:57 -04:00
}
@Override
public boolean hasPlayer(IPlayer player) {
2025-03-13 17:14:45 -04:00
if (player == null)
return false;
2025-03-13 17:14:45 -04:00
EntityPlayer entityPlayer = (EntityPlayer) player.getMCEntity();
return partyMembers.containsKey(entityPlayer.getUniqueID());
2024-03-02 23:50:42 -05:00
}
@Override
2023-10-31 23:26:57 -04:00
public boolean hasPlayer(String playerName) {
UUID uuid = getUUID(playerName);
2025-03-13 17:14:45 -04:00
if (uuid == null) {
2023-10-31 23:26:57 -04:00
return false;
}
return partyMembers.containsKey(uuid);
}
public EntityPlayer getPartyLeader() {
return NoppesUtilServer.getPlayer(this.partyLeader);
}
@Override
public String getPartyLeaderName() {
if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
return this.partyLeaderName;
} else {
return this.getPartyLeader().getCommandSenderName();
}
}
2025-03-13 17:14:45 -04:00
public boolean setLeader(EntityPlayer player) {
UUID uuid = player.getUniqueID();
2025-03-13 17:14:45 -04:00
if (partyLeader != null && partyLeader.equals(uuid)) {
2023-10-31 23:26:57 -04:00
return false;
}
2025-03-13 17:14:45 -04:00
if (!partyMembers.containsKey(uuid)) {
2023-10-31 23:26:57 -04:00
return false;
}
// Remove New Leader
partyOrder.remove(uuid);
2024-02-15 17:54:28 -05:00
2023-10-31 23:26:57 -04:00
// Add New Leader to Front
partyOrder.add(0, uuid);
// Set New Leader
partyLeader = uuid;
return true;
2023-10-30 21:06:01 -04:00
}
public UUID getLeaderUUID() {
return partyLeader;
}
public Collection<String> getPlayerNames() {
return this.getPlayerNames(false);
}
@Override
public List<String> getPlayerNamesList() {
return new ArrayList<>(this.getPlayerNames(false));
}
public Collection<String> getPlayerNames(boolean lowercase) {
Collection<String> names = this.partyMembers.values();
if (!lowercase) {
return names;
}
ArrayList<String> lowerNames = new ArrayList<>();
for (String s : names) {
lowerNames.add(s.toLowerCase());
}
return lowerNames;
}
public Collection<UUID> getPlayerUUIDs() {
return this.partyMembers.keySet();
}
// Called when Set Quest is Called
@Override
2025-03-13 17:14:45 -04:00
public boolean validateQuest(int questID, boolean sendLeaderMessages) {
2023-10-30 21:06:01 -04:00
IQuest quest = QuestController.Instance.get(questID);
2024-02-08 14:12:44 -05:00
if (quest == null) {
2023-10-30 21:06:01 -04:00
return false;
}
2024-02-08 14:12:44 -05:00
EntityPlayer leader = PlayerDataController.getPlayerFromUUID(partyLeader);
if (leader == null) {
return false;
2023-10-30 21:06:01 -04:00
}
2024-02-08 14:12:44 -05:00
int partyReq = quest.getPartyOptions().getPartyRequirements();
2024-02-08 14:12:44 -05:00
if (partyReq < 0 || partyReq >= EnumPartyRequirements.values().length) {
sendInfoMessage(leader, "Error in quest party requirements", sendLeaderMessages);
2024-02-08 14:12:44 -05:00
return false;
}
if (partyMembers.size() < quest.getPartyOptions().getMinPartySize()) {
sendInfoMessage(leader, String.format("Party too small. Min %d members", quest.getPartyOptions().getMinPartySize()), sendLeaderMessages);
return false;
}
if (partyMembers.size() > quest.getPartyOptions().getMaxPartySize()) {
sendInfoMessage(leader, String.format("Party too large. Max %d members", quest.getPartyOptions().getMaxPartySize()), sendLeaderMessages);
2024-02-08 14:12:44 -05:00
return false;
}
EnumPartyRequirements partyRequirements = EnumPartyRequirements.values()[partyReq];
if (partyRequirements == EnumPartyRequirements.Leader) {
boolean leaderBool = isValidLeaderQuest(leader, questID);
2025-03-13 17:14:45 -04:00
if (!leaderBool) {
sendInfoMessage(leader, "\u00A7cYou are invalid for this quest", sendLeaderMessages);
2024-02-08 14:12:44 -05:00
}
return leaderBool;
2023-10-30 21:06:01 -04:00
}
2024-02-08 14:12:44 -05:00
return arePlayersValid(leader, partyRequirements, quest, sendLeaderMessages);
2024-02-08 14:12:44 -05:00
}
private boolean isValidLeaderQuest(EntityPlayer leader, int questID) {
IPlayerQuestData questData = PlayerData.get(leader).getQuestData();
2024-02-08 14:12:44 -05:00
return questData != null && questData.hasActiveQuest(questID);
}
private boolean arePlayersValid(EntityPlayer leader, EnumPartyRequirements requirements, IQuest quest, boolean sendLeaderMessages) {
2024-02-08 14:12:44 -05:00
boolean allowQuest = true;
for (UUID playerUUID : partyMembers.keySet()) {
EntityPlayer player = PlayerDataController.getPlayerFromUUID(playerUUID);
if (player != null) {
PlayerData playerData = PlayerData.get(player);
2024-02-08 14:12:44 -05:00
if (playerData != null) {
IPlayerQuestData questData = playerData.getQuestData();
if (questData != null) {
2024-03-03 05:59:17 -05:00
boolean hasActive = questData.hasActiveQuest(quest.getId());
boolean hasFinished = questData.hasFinishedQuest(quest.getId());
2024-02-08 14:12:44 -05:00
2024-03-03 05:59:17 -05:00
if (requirements == EnumPartyRequirements.All && !hasActive) {
allowQuest = false;
sendInfoMessage(leader, String.format("%s does not have quest active", player.getCommandSenderName()), sendLeaderMessages);
2024-03-03 05:59:17 -05:00
} else if (requirements == EnumPartyRequirements.Valid && !hasActive && !hasFinished) {
2024-02-08 14:12:44 -05:00
allowQuest = false;
sendInfoMessage(leader, String.format("%s does not have the quest active or finished", player.getCommandSenderName()), sendLeaderMessages);
2024-02-08 14:12:44 -05:00
}
} else {
allowQuest = false;
sendInfoMessage(leader, String.format("%s has no quest data", player.getCommandSenderName()), sendLeaderMessages);
2024-02-08 14:12:44 -05:00
}
} else {
allowQuest = false;
sendInfoMessage(leader, String.format("%s has no player data", player.getCommandSenderName()), sendLeaderMessages);
2024-02-08 14:12:44 -05:00
}
} else {
allowQuest = false;
String playerName = partyMembers.get(playerUUID);
sendInfoMessage(leader, String.format("%s was not found", playerName), sendLeaderMessages);
2024-02-08 14:12:44 -05:00
}
}
return allowQuest;
}
private void sendInfoMessage(EntityPlayer player, String message, boolean send) {
2025-03-13 17:14:45 -04:00
if (!send)
return;
2024-02-08 14:12:44 -05:00
player.addChatMessage(new ChatComponentText(String.format("\u00A7c%s", message)));
2023-10-30 21:06:01 -04:00
}
@Override
public void toggleFriendlyFire() {
this.friendlyFire = !this.friendlyFire;
}
@Override
public boolean friendlyFire() {
return this.friendlyFire;
}
2023-10-30 21:06:01 -04:00
public static UUID getUUID(String name) {
UUID uuid = null;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(new URL("https://api.mojang.com/users/profiles/minecraft/" + name).openStream()));
String uuidString;
2025-03-13 17:14:45 -04:00
uuidString = (((JsonObject) new JsonParser().parse(in)).get("id")).toString().replaceAll("\"", "");
2023-10-30 21:06:01 -04:00
uuidString = uuidString.replaceAll("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5");
in.close();
uuid = UUID.fromString(uuidString);
2025-03-13 17:14:45 -04:00
} catch (Exception ignored) {
}
2023-10-30 21:06:01 -04:00
return uuid;
}
public void readFromNBT(NBTTagCompound compound) {
this.partyLeaderName = compound.getString("PartyLeader");
2024-02-12 23:56:55 -06:00
this.currentQuestName = compound.getString("PartyQuestName");
this.friendlyFire = compound.getBoolean("FriendlyFire");
2024-02-07 23:55:55 -05:00
this.partyLocked = compound.getBoolean("PartyLocked");
2024-02-18 01:30:34 -06:00
this.currentQuestID = compound.getInteger("PartyQuestID");
if (compound.hasKey("QuestNBT")) {
this.quest = new Quest();
this.quest.readNBT(compound.getCompoundTag("QuestNBT"));
}
NBTTagList list = compound.getTagList("PartyMembers", 10);
for (int i = 0; i < list.tagCount(); i++) {
NBTTagCompound tagCompound = list.getCompoundTagAt(i);
UUID uuid = UUID.fromString(tagCompound.getString("UUID"));
String playerName = tagCompound.getString("PlayerName");
this.partyOrder.add(uuid);
this.partyMembers.put(uuid, playerName);
}
}
public NBTTagCompound writeToNBT() {
NBTTagCompound compound = new NBTTagCompound();
compound.setString("PartyUUID", this.partyUUID.toString());
2024-02-12 23:56:55 -06:00
compound.setString("PartyQuestName", this.currentQuestName);
compound.setBoolean("FriendlyFire", this.friendlyFire);
2024-02-07 23:55:55 -05:00
compound.setBoolean("PartyLocked", this.partyLocked);
2024-02-18 01:30:34 -06:00
compound.setInteger("PartyQuestID", this.currentQuestID);
if (this.getQuest() != null) {
Quest quest = (Quest) this.getQuest();
compound.setTag("QuestNBT", quest.writeToNBT(new NBTTagCompound()));
}
NBTTagList list = new NBTTagList();
for (UUID uuid : this.partyOrder) {
NBTTagCompound uuidCompound = new NBTTagCompound();
uuidCompound.setString("UUID", uuid.toString());
uuidCompound.setString("PlayerName", this.partyMembers.get(uuid));
list.appendTag(uuidCompound);
}
compound.setTag("PartyMembers", list);
compound.setString("PartyLeader", getPartyLeader().getCommandSenderName());
Quest quest = (Quest) QuestController.Instance.get(this.getCurrentQuestID());
if (quest != null) {
compound.setString("QuestName", quest.getName());
compound.setString("QuestCategory", quest.getCategory().getName());
}
return compound;
}
@Override
2025-03-13 17:14:45 -04:00
public void updateQuestObjectiveData() {
if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) {
PartyController.Instance().pingPartyQuestObjectiveUpdate(this);
}
}
@Override
2025-03-13 17:14:45 -04:00
public void updatePartyData() {
if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) {
PartyController.Instance().pingPartyUpdate(this);
}
}
public void readClientNBT(NBTTagCompound compound) {
this.currentQuestID = compound.getInteger("PartyQuestID");
2024-02-12 23:56:55 -06:00
this.currentQuestName = compound.getString("PartyQuestName");
this.friendlyFire = compound.getBoolean("FriendlyFire");
2025-06-23 23:48:35 -04:00
NBTTagList list = compound.getTagList("PartyMembers", 10);
for (int i = 0; i < list.tagCount(); i++) {
NBTTagCompound tagCompound = list.getCompoundTagAt(i);
UUID uuid = UUID.fromString(tagCompound.getString("UUID"));
String playerName = tagCompound.getString("PlayerName");
this.partyOrder.add(uuid);
this.partyMembers.put(uuid, playerName);
}
}
public NBTTagCompound writeClientNBT() {
NBTTagCompound compound = new NBTTagCompound();
compound.setInteger("PartyQuestID", this.currentQuestID);
2024-02-12 23:56:55 -06:00
compound.setString("PartyQuestName", this.currentQuestName);
compound.setBoolean("FriendlyFire", this.friendlyFire);
2025-06-23 23:48:35 -04:00
NBTTagList list = new NBTTagList();
for (UUID uuid : this.partyOrder) {
NBTTagCompound uuidCompound = new NBTTagCompound();
uuidCompound.setString("UUID", uuid.toString());
uuidCompound.setString("PlayerName", this.partyMembers.get(uuid));
list.appendTag(uuidCompound);
}
compound.setTag("PartyMembers", list);
return compound;
}
2023-10-30 21:06:01 -04:00
}