Changed QuestJournal to use SWGMap, Added counter to retrieve_item task types

This commit is contained in:
Waverunner
2014-08-16 11:42:11 -04:00
parent a62a56c868
commit d33d5adbf2
7 changed files with 59 additions and 87 deletions
+1 -1
View File
@@ -78,7 +78,7 @@ public class ObjControllerMessage extends SWGMessage {
public static final int RESOURCE_WEIGHTS = 0x0207;
public static final int MISSION_ACCEPT_RESPONSE = 0x00FA;
public static final int MISSION_ABORT_RESPONSE = 0x0142;
public static final int QUEST_TASK_TIMER_MESSAGE = 0x0441;
public static final int QUEST_TASK_COUNTER = 0x0441;
public static final int FORCE_ACTIVATE_QUEST = 0x04BE;
public ObjControllerMessage() {
@@ -27,15 +27,16 @@ import org.apache.mina.core.buffer.IoBuffer;
import protocol.swg.ObjControllerMessage;
@SuppressWarnings("unused")
public class QuestTaskTimerMessage extends ObjControllerObject {
public class QuestTaskCounterMessage extends ObjControllerObject {
private long objectId;
private String questName;
private String stf;
public QuestTaskTimerMessage(long objectId, String questName) {
public QuestTaskCounterMessage(long objectId, String questName, String stf) {
this.objectId = objectId;
this.questName = questName;
this.stf = stf;
}
@Override
@@ -45,21 +46,22 @@ public class QuestTaskTimerMessage extends ObjControllerObject {
@Override
public IoBuffer serialize() {
byte[] questNameBytes = getAsciiString(questName);
byte[] stfBytes = getUnicodeString(stf);
IoBuffer buffer = IoBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN);
buffer.setAutoExpand(true);
buffer.putInt(ObjControllerMessage.QUEST_TASK_TIMER_MESSAGE);
IoBuffer buffer = IoBuffer.allocate(38 + questNameBytes.length + stfBytes.length).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(ObjControllerMessage.QUEST_TASK_COUNTER);
buffer.putLong(objectId);
buffer.putInt(0);
buffer.put(getAsciiString("quest/ep3_trando_hssissk_zssik_10"));
buffer.putInt(1);
buffer.put(getUnicodeString("quest/groundquests:destroy_counter"));
buffer.putInt(0);
buffer.putInt(1);
int size = buffer.position();
buffer = IoBuffer.allocate(size).put(buffer.array(), 0, size);
buffer.put(questNameBytes);
buffer.putInt(1); // ??
buffer.put(stfBytes);
buffer.putInt(0); // ??
buffer.putInt(1); // ??
return buffer.flip();
}
+2 -33
View File
@@ -54,7 +54,6 @@ public class SWGList<E> implements List<E>, Serializable {
private byte viewType;
private short updateType;
private boolean addByte;
private boolean questMethod;
protected transient Object objectMutex = new Object();
private transient SWGObject object;
@@ -67,14 +66,6 @@ public class SWGList<E> implements List<E>, Serializable {
this.object = object;
}
public SWGList(SWGObject object, int viewType, int updateType, boolean addByte, boolean questMethod) {
this.viewType = (byte) viewType;
this.updateType = (short) updateType;
this.addByte = addByte;
this.object = object;
this.questMethod = questMethod;
}
public void init(SWGObject object) {
objectMutex = new Object();
updateCounter = 0;
@@ -94,19 +85,7 @@ public class SWGList<E> implements List<E>, Serializable {
public boolean add(E e) {
synchronized(objectMutex) {
if (valid(e) && list.add(e)) {
if (!questMethod) queue(item(1, list.lastIndexOf(e), Baseline.toBytes(e), true, true));
else {
List<byte[]> buffer = new ArrayList<byte[]>();
int index = 0;
for (E element : list) {
buffer.add(item(1, index, Baseline.toBytes(element), true, true));
index++;
}
queue(buffer);
return true;
}
queue(item(1, list.lastIndexOf(e), Baseline.toBytes(e), true, true));
return true;
}
@@ -462,17 +441,7 @@ public class SWGList<E> implements List<E>, Serializable {
}
private byte[] item(int type, int index, byte[] data, boolean useIndex, boolean useData) {
if (questMethod) {
int size = data.length;
IoBuffer buffer = Delta.createBuffer(size);
buffer.put(data);
buffer.flip();
updateCounter++;
return buffer.array();
}
int size = 1 + ((useIndex) ? 2 : 0) + ((useData) ? data.length : 0);
IoBuffer buffer = Delta.createBuffer(size);
+13 -8
View File
@@ -47,6 +47,7 @@ import resources.objects.waypoint.WaypointObject;
import resources.quest.Quest;
import services.quest.QuestItem;
import engine.clients.Client;
import engine.resources.common.StringUtilities;
import engine.resources.objects.Baseline;
import engine.resources.scene.Planet;
import engine.resources.scene.Point3D;
@@ -161,7 +162,7 @@ public class PlayerObject extends IntangibleObject implements Serializable {
baseline.put("currentFSQuestList", new SWGList<Byte>(this, 8, 4, false));
baseline.put("completedFSQuestList", new SWGList<Byte>(this, 8, 5, false));
baseline.put("activeQuest", 0);
baseline.put("questJournal", new SWGList<Quest>(this, 8, 7, false, true));
baseline.put("questJournal", new SWGMap<Integer, Quest>(this, 8, 7, true));
baseline.put("professionWheelPosition", "");
return baseline;
}
@@ -591,8 +592,8 @@ public class PlayerObject extends IntangibleObject implements Serializable {
}
@SuppressWarnings("unchecked")
public SWGList<Quest> getQuestJournal() {
return (SWGList<Quest>) getBaseline(8).get("questJournal");
public SWGMap<Integer, Quest> getQuestJournal() {
return (SWGMap<Integer, Quest>) getBaseline(8).get("questJournal");
}
@SuppressWarnings("unchecked")
@@ -600,11 +601,6 @@ public class PlayerObject extends IntangibleObject implements Serializable {
return (TreeMap<String, QuestItem>) otherVariables.get("questRetrieveItemTemplates");
}
public boolean hasRetrieveItemTemplate(String template) {
TreeMap<String, QuestItem> templates = getQuestRetrieveItemTemplates();
return templates.containsKey(template);
}
public int getActiveQuest() {
return (int) getBaseline(8).get("activeQuest");
}
@@ -1044,10 +1040,19 @@ public class PlayerObject extends IntangibleObject implements Serializable {
getContainer().notifyObservers(getBaseline(viewType).createDelta(updateType, buffer.array()), true);
}
break;
case 8:
switch (updateType) {
case 7:
IoBuffer newBuffer = getBaseline(viewType).createDelta(updateType, buffer.array());
getContainer().getClient().getSession().write(newBuffer.array());
break;
}
break;
default:
if (getContainer() != null && getContainer().getClient() != null) {
getContainer().getClient().getSession().write(getBaseline(viewType).createDelta(updateType, buffer.array()));
StringUtilities.printBytes(getBaseline(viewType).createDelta(updateType, buffer.array()).array());
}
}
}
+3 -3
View File
@@ -130,11 +130,11 @@ public class Quest extends Delta implements Serializable {
byte[] activeStepBytes = activeStepBitmask.toByteArray();
byte[] completedStepBytes = completedStepBitmask.toByteArray();
IoBuffer buffer = createBuffer(23);
IoBuffer buffer = createBuffer(18);
buffer.put((byte) 0);
//buffer.put((byte) 0);
buffer.putInt(getCrc());
//buffer.putInt(getCrc());
buffer.putLong(ownerId); // quest giver id?
+1 -1
View File
@@ -41,7 +41,7 @@ import protocol.swg.CommPlayerMessage;
import protocol.swg.ObjControllerMessage;
import protocol.swg.PlayClientEffectObjectTransformMessage;
import protocol.swg.objectControllerObjects.NpcConversationMessage;
import protocol.swg.objectControllerObjects.QuestTaskTimerMessage;
import protocol.swg.objectControllerObjects.QuestTaskCounterMessage;
import resources.common.OutOfBand;
import resources.common.SpawnPoint;
import resources.datatables.FactionStatus;
+23 -27
View File
@@ -33,12 +33,13 @@ import protocol.swg.CommPlayerMessage;
import protocol.swg.ObjControllerMessage;
import protocol.swg.PlayMusicMessage;
import protocol.swg.objectControllerObjects.ForceActivateQuest;
import protocol.swg.objectControllerObjects.QuestTaskCounterMessage;
import protocol.swg.objectControllerObjects.ShowLootBox;
import resources.common.ObjControllerOpcodes;
import resources.common.OutOfBand;
import resources.common.ProsePackage;
import resources.datatables.DisplayType;
import resources.objects.SWGList;
import resources.objects.SWGMap;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import resources.objects.tangible.TangibleObject;
@@ -84,17 +85,12 @@ public class QuestService implements INetworkDispatch {
catch (Exception e) {e.printStackTrace();}
}
SWGList<Quest> questJournal = ghost.getQuestJournal();
SWGMap<Integer, Quest> questJournal = ghost.getQuestJournal();
if (questJournal.size() == 0)
return false;
for (Quest quest : questJournal) {
if (quest.getName().equals(questName))
return true;
}
return false;
return questJournal.containsKey(CRC.StringtoCRC("quest/" + questName));
}
public boolean isQuestCompleted(CreatureObject creo, String questName) {
@@ -105,17 +101,15 @@ public class QuestService implements INetworkDispatch {
catch (Exception e) {e.printStackTrace();}
}
SWGList<Quest> questJournal = ghost.getQuestJournal();
SWGMap<Integer, Quest> questJournal = ghost.getQuestJournal();
if (questJournal.size() == 0)
return false;
for (Quest quest : questJournal) {
if (quest.getName().equals(questName))
return quest.isCompleted();
}
return false;
if (!questJournal.containsKey(CRC.StringtoCRC("quest/" + questName)))
return false;
else
return questJournal.get(CRC.StringtoCRC("quest/") + questName).isCompleted();
}
public void sendQuestWindow(CreatureObject reciever, String questName) {
@@ -128,13 +122,15 @@ public class QuestService implements INetworkDispatch {
public void activateNextTask(CreatureObject quester, String questName) {
for (Quest quest : quester.getPlayerObject().getQuestJournal()) {
if (quest.getName().equals(questName) && !quest.isCompleted())
activateNextTask(quester, quest);
if (quester.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) {
activateNextTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)));
}
}
public void activateNextTask(CreatureObject quester, Quest quest) {
if (quester == null || quester.getClient() == null || quester.getClient().getSession() == null)
return;
QuestData qData = getQuestData(quest.getName());
if (qData == null)
@@ -167,8 +163,11 @@ public class QuestService implements INetworkDispatch {
// quest.task.ground.retrieve_item
case "retrieve_item":
String template = task.getServerTemplate();
player.getQuestRetrieveItemTemplates().put(template, new QuestItem(quest.getName(), activeStep));
player.getQuestRetrieveItemTemplates().put(task.getServerTemplate(), new QuestItem(quest.getName(), activeStep));
// TODO: add item count
ObjControllerMessage msg = new ObjControllerMessage(11, new QuestTaskCounterMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:retrieve_item_counter"));
quester.getClient().getSession().write(msg.serialize());
break;
case "timer":
@@ -205,7 +204,6 @@ public class QuestService implements INetworkDispatch {
}
public void activateQuest(CreatureObject quester, String questString) {
System.out.println("Activating quest: " + questString);
Quest quest = new Quest(questString, quester.getObjectID());
PlayerObject player = quester.getPlayerObject();
@@ -225,7 +223,7 @@ public class QuestService implements INetworkDispatch {
PlayMusicMessage music = new PlayMusicMessage("sound/ui_npe2_quest_received.snd", quester.getObjectID(), 0, true);
quester.getClient().getSession().write(music.serialize());
player.getQuestJournal().add(quest);
player.getQuestJournal().put(quest.getCrc(), quest);
player.setActiveQuest(quest.getCrc());
activateNextTask(quester, quest);
@@ -321,7 +319,7 @@ public class QuestService implements INetworkDispatch {
if (player.getQuestRetrieveItemTemplates().size() == 0)
return radialName;
if (!player.hasRetrieveItemTemplate(template))
if (!player.getQuestRetrieveItemTemplates().containsKey(template))
return radialName;
QuestItem item = player.getQuestRetrieveItemTemplates().get(template);
@@ -338,18 +336,16 @@ public class QuestService implements INetworkDispatch {
if (player == null)
return;
if (!player.hasRetrieveItemTemplate(target.getTemplate())) {
if (!player.getQuestRetrieveItemTemplates().containsKey(target.getTemplate())) {
System.out.println("Player doesn't have the template: " + target.getTemplate());
return;
}
QuestItem item = player.getQuestRetrieveItemTemplates().get(target.getTemplate());
activateNextTask(quester, item.getQuestName());
System.out.println("activated next task.");
player.getQuestRetrieveItemTemplates().remove(target.getTemplate(), item);
if (player.hasRetrieveItemTemplate(target.getTemplate()))
System.out.println("STILL HAS TEMPLATE!!");
}
public QuestData getQuestData(String questName) {