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")) {