diff --git a/src/resources/rewards/RoadmapReward.java b/src/resources/rewards/RoadmapReward.java
new file mode 100644
index 000000000..b14de2883
--- /dev/null
+++ b/src/resources/rewards/RoadmapReward.java
@@ -0,0 +1,116 @@
+/************************************************************************************
+ * Copyright (c) 2015 /// Project SWG /// www.projectswg.com *
+ * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on *
+ * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. *
+ * Our goal is to create an emulator which will provide a server for players to *
+ * continue playing a game similar to the one they used to play. We are basing *
+ * it on the final publish of the game prior to end-game events. *
+ * *
+ * This file is part of Holocore. *
+ * *
+ * -------------------------------------------------------------------------------- *
+ *
+ * Holocore is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU Affero General Public License as *
+ * published by the Free Software Foundation, either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * Holocore is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU Affero General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Affero General Public License *
+ * along with Holocore. If not, see . *
+ * *
+ ************************************************************************************/
+
+package resources.rewards;
+
+/**
+ * Created by skylerlehan on 9/15/16.
+ */
+public class RoadmapReward {
+ private String roadmapTemplate;
+ private String roadmapSkillName;
+ private String appearanceName;
+ private String stringId;
+ private String itemDefault;
+ private String itemWookiee;
+ private String itemIthorian;
+ private boolean hasItems;
+ private boolean isUniversalReward; // This means the reward is for Wookiees, Ithorians and everything else
+
+ private String[] defaultRewardItems;
+ private String[] wookieeRewardItems;
+ private String[] ithorianRewardItems;
+
+ public RoadmapReward(String roadmapTemplate, String roadmapSkillName, String appearanceName, String stringId, String itemDefault, String itemWookiee, String itemIthorian) {
+ this.roadmapTemplate = roadmapTemplate;
+ this.roadmapSkillName = roadmapSkillName;
+ this.appearanceName = appearanceName;
+ this.stringId = stringId;
+ this.itemDefault = itemDefault;
+ this.itemWookiee = itemWookiee;
+ this.itemIthorian = itemIthorian;
+
+ parseItems();
+ }
+
+ public String getRoadmapTemplate() {
+ return roadmapTemplate;
+ }
+
+ public String getRoadmapSkillName() {
+ return roadmapSkillName;
+ }
+
+ public String getAppearanceName() {
+ return appearanceName;
+ }
+
+ public String getStringId() {
+ return stringId;
+ }
+
+ public String getItemDefault() {
+ return itemDefault;
+ }
+
+ public String getItemWookiee() {
+ return itemWookiee;
+ }
+
+ public String getItemIthorian() {
+ return itemIthorian;
+ }
+
+ public boolean hasItems() {
+ return hasItems;
+ }
+
+ public boolean isUniversalReward() {
+ return isUniversalReward;
+ }
+
+ public String[] getDefaultRewardItems() {
+ return defaultRewardItems;
+ }
+
+ public String[] getWookieeRewardItems() {
+ return wookieeRewardItems;
+ }
+
+ public String[] getIthorianRewardItems() {
+ return ithorianRewardItems;
+ }
+
+ private void parseItems() {
+ defaultRewardItems = itemDefault.split(",");
+ wookieeRewardItems = itemWookiee.split(",");
+ ithorianRewardItems = itemIthorian.split(",");
+
+ isUniversalReward = !itemDefault.isEmpty() && itemWookiee.isEmpty() && itemIthorian.isEmpty();
+ hasItems = !itemDefault.isEmpty() && !itemWookiee.isEmpty() && !itemIthorian.isEmpty();
+ }
+}
diff --git a/src/services/experience/SkillTemplateService.java b/src/services/experience/SkillTemplateService.java
index 65710dbe8..02228dd3e 100644
--- a/src/services/experience/SkillTemplateService.java
+++ b/src/services/experience/SkillTemplateService.java
@@ -33,21 +33,27 @@ import intents.experience.SkillBoxGrantedIntent;
import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
+
+import intents.object.CreateStaticItemIntent;
+import intents.object.ObjectCreatedIntent;
import network.packets.swg.zone.PlayClientEffectObjectMessage;
import network.packets.swg.zone.PlayMusicMessage;
import network.packets.swg.zone.object_controller.ShowFlyText;
import network.packets.swg.zone.object_controller.ShowFlyText.Scale;
+import resources.Race;
import resources.client_info.ClientFactory;
import resources.client_info.visitors.DatatableData;
import resources.common.RGB;
import resources.control.Intent;
import resources.control.Service;
-import resources.encodables.OutOfBandPackage;
import resources.encodables.StringId;
+import resources.objects.SWGObject;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import resources.player.Player;
+import resources.rewards.RoadmapReward;
import resources.server_info.Log;
+import services.objects.ObjectCreator;
/**
* This is a service that listens for {@link LevelChangedIntent} and grants
@@ -57,9 +63,13 @@ import resources.server_info.Log;
public final class SkillTemplateService extends Service {
private final Map skillTemplates;
-
- SkillTemplateService() {
+ private Map rewards;
+ private DatatableData rewardsTable;
+
+ public SkillTemplateService() {
skillTemplates = new HashMap<>();
+ rewards = new HashMap<>();
+ rewardsTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/roadmap/item_rewards.iff");
registerForIntent(LevelChangedIntent.TYPE);
}
@@ -73,6 +83,9 @@ public final class SkillTemplateService extends Service {
skillTemplates.put(profession, templates);
}
+
+ loadRewardItemsIff();
+
return super.initialize();
}
@@ -105,12 +118,12 @@ public final class SkillTemplateService extends Service {
String skillName = templates[skillIndex];
new SkillBoxGrantedIntent(skillName, creatureObject).broadcast();
playerObject.setProfWheelPosition(skillName);
-
+
// Grants a mastery collection badge, IF they qualify.
grantMasteryBadge(creatureObject, profession, skillName);
-
- // TODO roadmap reward items
-
+
+ giveRewardItems(creatureObject, skillName);
+
creatureObject.sendObserversAndSelf(new PlayClientEffectObjectMessage("clienteffect/skill_granted.cef", "", objectId));
sendPacket(player, new ShowFlyText(objectId, new StringId("cbt_spam", "skill_up"), Scale.LARGEST, new RGB(Color.GREEN)));
sendPacket(player, new PlayMusicMessage(0, "sound/music_acq_bountyhunter.snd", 1, false));
@@ -123,6 +136,51 @@ public final class SkillTemplateService extends Service {
}
}
}
+
+ private void giveRewardItems(CreatureObject creatureObject, String skillName) {
+ RoadmapReward reward = rewards.get(skillName);
+ Race characterRace = creatureObject.getRace();
+ String species = characterRace.getSpecies().toUpperCase();
+ SWGObject inventory = creatureObject.getSlottedObject("inventory");
+ String[] items;
+
+ if (reward.hasItems() || reward.isUniversalReward()) {
+ if (reward.isUniversalReward())
+ items = reward.getDefaultRewardItems();
+ else if (species.equals("ITHORIAN"))
+ items = reward.getIthorianRewardItems();
+ else if (species.equals("WOOKIEE"))
+ items = reward.getWookieeRewardItems();
+ else
+ items = reward.getDefaultRewardItems();
+
+ for (String item : items) {
+ if (item.endsWith(".iff")) {
+ SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(ClientFactory.formatToSharedFile(item));
+
+ if (nonStaticItem != null) {
+ nonStaticItem.moveToContainer(inventory);
+ }
+ new ObjectCreatedIntent(nonStaticItem).broadcast();
+ } else
+ new CreateStaticItemIntent(creatureObject, inventory, item).broadcast();
+ }
+ }
+ }
+
+ private void loadRewardItemsIff() {
+ for (int row = 0; row < rewardsTable.getRowCount(); row++) {
+ String roadmapTemplate = rewardsTable.getCell(row, 0).toString();
+ String roadmapSkillName = rewardsTable.getCell(row, 1).toString();
+ String appearanceName = rewardsTable.getCell(row, 2).toString();
+ String stringId = rewardsTable.getCell(row, 3).toString();
+ String itemDefault = rewardsTable.getCell(row, 4).toString();
+ String itemWookiee = rewardsTable.getCell(row, 5).toString();
+ String itemIthorian = rewardsTable.getCell(row, 6).toString();
+
+ rewards.put(roadmapSkillName, new RoadmapReward(roadmapTemplate, roadmapSkillName, appearanceName, stringId, itemDefault, itemWookiee, itemIthorian));
+ }
+ }
private void grantMasteryBadge(CreatureObject creature, String profession, String skillName) {
if (skillName.endsWith("_phase4_master")) {