Magic Modification Per NPC

This commit is contained in:
Kam committed 2025-03-08 16:45:06 -05:00
1 parent 382fb0cf9c
commit 71d309eed1
6 files changed
+418 -2

No files matched your search

@@ -328,7 +328,7 @@ public class PacketHandler {
REQUEST_PACKET.registerPacket(new ProfileRenamePacket());
REQUEST_PACKET.registerPacket(new ProfileChangePacket());
// Job Packets
// Magic Packets
REQUEST_PACKET.registerPacket(new MagicCycleRemovePacket());
REQUEST_PACKET.registerPacket(new MagicCycleSavePacket());
REQUEST_PACKET.registerPacket(new MagicGetAllPacket());
@@ -336,6 +336,8 @@ public class PacketHandler {
REQUEST_PACKET.registerPacket(new MagicRemovePacket());
REQUEST_PACKET.registerPacket(new MagicGetPacket());
REQUEST_PACKET.registerPacket(new MagicDataGetPacket());
REQUEST_PACKET.registerPacket(new MagicNpcGetPacket());
REQUEST_PACKET.registerPacket(new MagicNpcSavePacket());
// Other Packets
REQUEST_PACKET.registerPacket(new IsGuiOpenInform());
@@ -136,6 +136,7 @@ public enum EnumRequestPacket {
PlayerDataDeleteInfo,
PlayerDataRemove,
PlayerDataMapRegen,
PlayerDataSave,
JobSave,
JobGet,
@@ -198,5 +199,7 @@ public enum EnumRequestPacket {
MagicRemove,
MagicGet,
MagicSave,
PlayerDataSave, MagicDataGet
NpcMagicGet,
NpcMagicSave,
MagicDataGet,
}
@@ -0,0 +1,59 @@
package kamkeel.npcs.network.packets.request.magic;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import kamkeel.npcs.network.AbstractPacket;
import kamkeel.npcs.network.PacketChannel;
import kamkeel.npcs.network.PacketHandler;
import kamkeel.npcs.network.PacketUtil;
import kamkeel.npcs.network.enums.EnumItemPacketType;
import kamkeel.npcs.network.enums.EnumRequestPacket;
import kamkeel.npcs.network.packets.data.large.GuiDataPacket;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import noppes.npcs.controllers.TagController;
import noppes.npcs.controllers.data.MagicData;
import noppes.npcs.controllers.data.Tag;
import java.io.IOException;
import java.util.UUID;
public final class MagicNpcGetPacket extends AbstractPacket {
public static final String packetName = "Request|NpcMagicGet";
public MagicNpcGetPacket() {}
@Override
public Enum getType() {
return EnumRequestPacket.NpcMagicGet;
}
@Override
public PacketChannel getChannel() {
return PacketHandler.REQUEST_PACKET;
}
@Override
public boolean needsNPC() {
return true;
}
@SideOnly(Side.CLIENT)
@Override
public void sendData(ByteBuf out) throws IOException {
}
@Override
public void receiveData(ByteBuf in, EntityPlayer player) throws IOException {
if (!PacketUtil.verifyItemPacket(player, EnumItemPacketType.WAND))
return;
NBTTagCompound compound = new NBTTagCompound();
npc.stats.magicData.writeToNBT(compound);
GuiDataPacket.sendGuiData((EntityPlayerMP) player, compound);
}
}
@@ -0,0 +1,71 @@
package kamkeel.npcs.network.packets.request.magic;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import kamkeel.npcs.network.AbstractPacket;
import kamkeel.npcs.network.PacketChannel;
import kamkeel.npcs.network.PacketHandler;
import kamkeel.npcs.network.PacketUtil;
import kamkeel.npcs.network.enums.EnumItemPacketType;
import kamkeel.npcs.network.enums.EnumRequestPacket;
import kamkeel.npcs.network.packets.data.large.GuiDataPacket;
import kamkeel.npcs.util.ByteBufUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import noppes.npcs.CustomNpcsPermissions;
import noppes.npcs.controllers.data.MagicData;
import java.io.IOException;
public final class MagicNpcSavePacket extends AbstractPacket {
public static final String packetName = "Request|NpcMagicGet";
private MagicData magicData;
public MagicNpcSavePacket() {}
public MagicNpcSavePacket(MagicData magicData) {
this.magicData = magicData;
}
@Override
public Enum getType() {
return EnumRequestPacket.NpcMagicSave;
}
@Override
public PacketChannel getChannel() {
return PacketHandler.REQUEST_PACKET;
}
@Override
public boolean needsNPC() {
return true;
}
@Override
public CustomNpcsPermissions.Permission getPermission() {
return CustomNpcsPermissions.NPC_ADVANCED;
}
@SideOnly(Side.CLIENT)
@Override
public void sendData(ByteBuf out) throws IOException {
NBTTagCompound compound = new NBTTagCompound();
if(magicData != null){
magicData.writeToNBT(compound);
}
ByteBufUtils.writeNBT(out, compound);
}
@Override
public void receiveData(ByteBuf in, EntityPlayer player) throws IOException {
if (!PacketUtil.verifyItemPacket(player, EnumItemPacketType.WAND))
return;
NBTTagCompound compound = ByteBufUtils.readNBT(in);
npc.stats.magicData.readToNBT(compound);
}
}
@@ -0,0 +1,275 @@
package noppes.npcs.client.gui.advanced;
import kamkeel.npcs.network.PacketClient;
import kamkeel.npcs.network.packets.request.magic.MagicGetAllPacket;
import kamkeel.npcs.network.packets.request.magic.MagicNpcGetPacket;
import kamkeel.npcs.network.packets.request.magic.MagicNpcSavePacket;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.nbt.NBTTagCompound;
import noppes.npcs.client.gui.util.*;
import noppes.npcs.constants.EnumScrollData;
import noppes.npcs.controllers.data.MagicData;
import noppes.npcs.entity.EntityNPCInterface;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;
public class GuiNPCMagic extends GuiNPCInterface2 implements IScrollData, ICustomScrollListener, IGuiData, ITextfieldListener {
private GuiCustomScroll allMagicScroll;
private GuiCustomScroll npcMagicScroll;
private final HashMap<String, Integer> allMagic = new HashMap<>();
// Initialize npcMagicData here so we don't need to check for null.
private MagicData npcMagicData = new MagicData();
private String search = "";
private GuiNpcTextField splitField, damageField;
public GuiNPCMagic(EntityNPCInterface npc) {
super(npc);
PacketClient.sendClient(new MagicGetAllPacket());
PacketClient.sendClient(new MagicNpcGetPacket());
}
@Override
public void initGui() {
super.initGui();
// Left scroll: display all available magic.
if (allMagicScroll == null) {
allMagicScroll = new GuiCustomScroll(this, 0);
allMagicScroll.setSize(150, 150);
}
allMagicScroll.guiLeft = guiLeft + 20;
allMagicScroll.guiTop = guiTop + 24;
allMagicScroll.setList(new ArrayList<>(allMagic.keySet()));
this.addScroll(allMagicScroll);
// Search bar to filter available magic (text field id 4).
addTextField(new GuiNpcTextField(4, this, fontRendererObj, guiLeft + 20, guiTop + 24 + 155, 150, 20, search));
// Right scroll: display currently selected magic.
if (npcMagicScroll == null) {
npcMagicScroll = new GuiCustomScroll(this, 1);
npcMagicScroll.setSize(150, 150);
}
npcMagicScroll.guiLeft = guiLeft + 250;
npcMagicScroll.guiTop = guiTop + 24;
List<String> selectedList = new ArrayList<>();
for (String name : allMagic.keySet()) {
int id = allMagic.get(name);
if (npcMagicData.hasMagic(id)) {
selectedList.add(name);
}
}
npcMagicScroll.setList(selectedList);
this.addScroll(npcMagicScroll);
// Arrow buttons for adding and removing magic entries.
addButton(new GuiNpcButton(70, guiLeft + 185, guiTop + 90, 55, 20, ">")); // Add
addButton(new GuiNpcButton(71, guiLeft + 185, guiTop + 112, 55, 20, "<")); // Remove
// Standardize button: evenly distribute split value among all magic entries.
addButton(new GuiNpcButton(72, guiLeft + 185, guiTop + 140, 55, 20, "Std"));
// Add Split and Bonus Damage text fields.
int tfY = guiTop + 24 + 155;
addLabel(new GuiNpcLabel(5002, "magic.split", guiLeft + 193, tfY + 5));
splitField = new GuiNpcTextField(73, this, fontRendererObj, guiLeft + 250, tfY, 45, 20, "");
splitField.setFloatsOnly();
splitField.setMinMaxDefaultFloat(0, 1000000000, 0);
splitField.enabled = false;
addTextField(splitField);
addLabel(new GuiNpcLabel(5003, "magic.bonus", guiLeft + 300, tfY + 5));
damageField = new GuiNpcTextField(74, this, fontRendererObj, guiLeft + 400 - 45, tfY, 45, 20, "");
damageField.setFloatsOnly();
damageField.setMinMaxDefaultFloat(0, 1000000000, 0);
damageField.enabled = false;
addTextField(damageField);
}
@Override
public void buttonEvent(GuiButton guibutton) {
// Add magic from available list.
if (guibutton.id == 70) {
if (allMagicScroll.hasSelected()) {
String selected = allMagicScroll.getSelected();
int id = allMagic.get(selected);
if (!npcMagicData.hasMagic(id)) {
npcMagicData.addMagic(id, 0, 0);
}
}
updateNpcMagicSelectedList();
save();
return;
}
// Remove magic from NPC's magic list.
if (guibutton.id == 71) {
if (npcMagicScroll.hasSelected()) {
String selected = npcMagicScroll.getSelected();
int id = allMagic.get(selected);
if (npcMagicData.hasMagic(id)) {
npcMagicData.removeMagic(id);
}
}
updateNpcMagicSelectedList();
// Clear text fields when removal.
if (splitField != null) {
splitField.setText("");
splitField.enabled = false;
}
if (damageField != null) {
damageField.setText("");
damageField.enabled = false;
}
save();
return;
}
// Standardize: evenly distribute 1.0 split value among all magic entries.
if (guibutton.id == 72) {
if (npcMagicData.getMagics().size() > 0) {
int count = npcMagicData.getMagics().size();
float stdSplit = 1.0f / count;
for (Integer key : npcMagicData.getMagics().keySet()) {
npcMagicData.getMagic(key).split = stdSplit;
}
// Update the split field for the currently selected magic.
if (npcMagicScroll.getSelected() != null && splitField != null) {
String name = npcMagicScroll.getSelected();
int id = allMagic.get(name);
if (npcMagicData.hasMagic(id)) {
splitField.setText(npcMagicData.getMagic(id).split + "");
}
}
}
save();
return;
}
initGui();
}
@Override
public void setData(Vector<String> list, HashMap<String, Integer> data, EnumScrollData type) {
if (type == EnumScrollData.MAGIC) {
allMagic.clear();
allMagic.putAll(data);
if (allMagicScroll != null) {
allMagicScroll.setList(new ArrayList<>(allMagic.keySet()));
}
}
initGui();
}
@Override
public void setGuiData(NBTTagCompound compound) {
npcMagicData.readToNBT(compound);
initGui();
}
@Override
public void mouseClicked(int i, int j, int k) {
super.mouseClicked(i, j, k);
if (k == 0 && allMagicScroll != null)
allMagicScroll.mouseClicked(i, j, k);
}
@Override
public void keyTyped(char c, int i) {
super.keyTyped(c, i);
if (getTextField(4) != null && getTextField(4).isFocused()) {
if (search.equals(getTextField(4).getText()))
return;
search = getTextField(4).getText().toLowerCase();
allMagicScroll.setList(getSearchList());
allMagicScroll.resetScroll();
}
}
private List<String> getSearchList() {
if (search.isEmpty()) {
return new ArrayList<>(allMagic.keySet());
}
List<String> list = new ArrayList<>();
for (String name : allMagic.keySet()) {
if (name.toLowerCase().contains(search))
list.add(name);
}
return list;
}
private void updateNpcMagicSelectedList() {
List<String> selected = new ArrayList<>();
for (String name : allMagic.keySet()) {
int id = allMagic.get(name);
if (npcMagicData.hasMagic(id)) {
selected.add(name);
}
}
if (npcMagicScroll != null)
npcMagicScroll.setList(selected);
}
public void save() {
PacketClient.sendClient(new MagicNpcSavePacket(npcMagicData));
}
@Override
public void setSelected(String selected) {
if (allMagicScroll != null)
allMagicScroll.setSelected(selected);
}
@Override
public void customScrollClicked(int i, int j, int k, GuiCustomScroll guiCustomScroll) {
// When the right scroll is clicked, update the text fields with the selected magic's values.
if (guiCustomScroll == npcMagicScroll) {
if (npcMagicScroll.getSelected() != null) {
String name = npcMagicScroll.getSelected();
int id = allMagic.get(name);
if (npcMagicData.hasMagic(id)) {
if (splitField != null) {
splitField.setText(npcMagicData.getMagic(id).split + "");
splitField.enabled = true;
}
if (damageField != null) {
damageField.setText(npcMagicData.getMagic(id).damage + "");
damageField.enabled = true;
}
}
}
}
}
@Override
public void customScrollDoubleClicked(String selection, GuiCustomScroll scroll) {
}
@Override
public void unFocused(GuiNpcTextField textField) {
// When the split (id 73) or bonus damage (id 74) text field loses focus,
// update the corresponding magic entry.
if (textField.id == 73 || textField.id == 74) {
if (npcMagicScroll != null && npcMagicScroll.getSelected() != null) {
String name = npcMagicScroll.getSelected();
int id = allMagic.get(name);
if (npcMagicData.hasMagic(id)) {
if (textField.id == 73) {
try {
float split = Float.parseFloat(textField.getText());
npcMagicData.getMagic(id).split = split;
} catch (NumberFormatException e) { }
} else if (textField.id == 74) {
try {
float bonus = Float.parseFloat(textField.getText());
npcMagicData.getMagic(id).damage = bonus;
} catch (NumberFormatException e) { }
}
save();
}
}
}
}
}
@@ -52,6 +52,8 @@ public class GuiNpcAdvanced extends GuiNPCInterface2 implements IGuiData
this.addButton(new GuiNpcButton(14, guiLeft + 15, y += 22, 190, 20, "menu.tags"));
this.addButton(new GuiNpcButton(15, guiLeft + 208, y, 190, 20, "advanced.marks"));
this.addButton(new GuiNpcButton(16, guiLeft + 15, y += 22, 190, 20, "menu.magics"));
}
@Override
@@ -109,6 +111,10 @@ public class GuiNpcAdvanced extends GuiNPCInterface2 implements IGuiData
save();
NoppesUtil.openGUI(player, new GuiNPCMarks(npc));
}
if(button.id == 16){
save();
NoppesUtil.openGUI(player, new GuiNPCMagic(npc));
}
}
@Override