From 6c0b2b1b33608ae1abd84506ae136fe1def7b7f6 Mon Sep 17 00:00:00 2001 From: Skyler Lehan Date: Wed, 21 Sep 2016 13:16:45 -0400 Subject: [PATCH 1/4] NGE-165 is ready for testing, added Roadmap Rewards --- src/resources/rewards/RoadmapReward.java | 116 ++++++++++++++++++ .../experience/SkillTemplateService.java | 59 ++++++++- 2 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 src/resources/rewards/RoadmapReward.java diff --git a/src/resources/rewards/RoadmapReward.java b/src/resources/rewards/RoadmapReward.java new file mode 100644 index 000000000..ada10fdb4 --- /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; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * 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 isUniversalReward; // This means the reward is for Wookiees, Ithorians and everything else + + private ArrayList defaultRewardItems = new ArrayList<>(); + private ArrayList wookieRewardItems = new ArrayList<>(); + private ArrayList ithorianRewardItems = new ArrayList<>(); + + 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 isUniversalReward() { + return isUniversalReward; + } + + public ArrayList getDefaultRewardItems() { + return defaultRewardItems; + } + + public ArrayList getWookieRewardItems() { + return wookieRewardItems; + } + + public ArrayList getIthorianRewardItems() { + return ithorianRewardItems; + } + + private void parseItems() { + if (!itemDefault.isEmpty()) + defaultRewardItems = new ArrayList(Arrays.asList(itemDefault.split(","))); + if (!itemWookiee.isEmpty()) + wookieRewardItems = new ArrayList(Arrays.asList(itemWookiee.split(","))); + if (!itemIthorian.isEmpty()) + ithorianRewardItems = new ArrayList(Arrays.asList(itemIthorian.split(","))); + + isUniversalReward = !defaultRewardItems.isEmpty() && (wookieRewardItems.isEmpty() && ithorianRewardItems.isEmpty()); + } +} diff --git a/src/services/experience/SkillTemplateService.java b/src/services/experience/SkillTemplateService.java index 6bd54f375..19d918550 100644 --- a/src/services/experience/SkillTemplateService.java +++ b/src/services/experience/SkillTemplateService.java @@ -30,12 +30,17 @@ package services.experience; import intents.experience.LevelChangedIntent; import intents.experience.SkillBoxGrantedIntent; import java.awt.Color; +import java.util.ArrayList; 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; @@ -43,10 +48,13 @@ 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 @@ -56,7 +64,9 @@ import resources.server_info.Log; public final class SkillTemplateService extends Service { private final Map skillTemplates; - + private static Map rewards = new HashMap<>(); + private DatatableData rewardsTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/roadmap/item_rewards.iff"); + SkillTemplateService() { skillTemplates = new HashMap<>(); registerForIntent(LevelChangedIntent.TYPE); @@ -72,6 +82,9 @@ public final class SkillTemplateService extends Service { skillTemplates.put(profession, templates); } + + loadRewardItemsIff(); + return super.initialize(); } @@ -105,8 +118,8 @@ public final class SkillTemplateService extends Service { new SkillBoxGrantedIntent(skillName, creatureObject).broadcast(); playerObject.setProfWheelPosition(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)); @@ -119,4 +132,44 @@ public final class SkillTemplateService extends Service { } } } + + private void giveRewardItems(CreatureObject creatureObject, String skillName) { + RoadmapReward reward = rewards.get(skillName); + ArrayList items; + Race characterRace = creatureObject.getRace(); + String species = characterRace.getSpecies().toUpperCase(); + + if (reward.isUniversalReward()) + items = reward.getDefaultRewardItems(); + else if (species.equals("ITHORIAN")) + items = reward.getIthorianRewardItems(); + else if (species.equals("WOOKIEE")) + items = reward.getWookieRewardItems(); + else + items = reward.getDefaultRewardItems(); + + for (String item : items) { + SWGObject inventory = creatureObject.getSlottedObject("inventory"); + + if (item.contains(".iff")) { + SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(ClientFactory.formatToSharedFile(item)); + 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)); + } + } } From fcb7e51bb3a07484112a30f388cf7890da2c96aa Mon Sep 17 00:00:00 2001 From: Skyler Lehan Date: Sat, 24 Sep 2016 17:46:03 -0400 Subject: [PATCH 2/4] Fixed issues in NGE-165, switched ArrayLists to a String array for the reward items --- src/resources/rewards/RoadmapReward.java | 28 ++++++++----------- .../experience/SkillTemplateService.java | 14 ++++++---- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/resources/rewards/RoadmapReward.java b/src/resources/rewards/RoadmapReward.java index ada10fdb4..e4f7b8463 100644 --- a/src/resources/rewards/RoadmapReward.java +++ b/src/resources/rewards/RoadmapReward.java @@ -27,9 +27,6 @@ package resources.rewards; -import java.util.ArrayList; -import java.util.Arrays; - /** * Created by skylerlehan on 9/15/16. */ @@ -43,9 +40,9 @@ public class RoadmapReward { private String itemIthorian; private boolean isUniversalReward; // This means the reward is for Wookiees, Ithorians and everything else - private ArrayList defaultRewardItems = new ArrayList<>(); - private ArrayList wookieRewardItems = new ArrayList<>(); - private ArrayList ithorianRewardItems = new ArrayList<>(); + 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; @@ -91,26 +88,23 @@ public class RoadmapReward { return isUniversalReward; } - public ArrayList getDefaultRewardItems() { + public String[] getDefaultRewardItems() { return defaultRewardItems; } - public ArrayList getWookieRewardItems() { - return wookieRewardItems; + public String[] getWookieeRewardItems() { + return wookieeRewardItems; } - public ArrayList getIthorianRewardItems() { + public String[] getIthorianRewardItems() { return ithorianRewardItems; } private void parseItems() { - if (!itemDefault.isEmpty()) - defaultRewardItems = new ArrayList(Arrays.asList(itemDefault.split(","))); - if (!itemWookiee.isEmpty()) - wookieRewardItems = new ArrayList(Arrays.asList(itemWookiee.split(","))); - if (!itemIthorian.isEmpty()) - ithorianRewardItems = new ArrayList(Arrays.asList(itemIthorian.split(","))); + defaultRewardItems = itemDefault.split(","); + wookieeRewardItems = itemWookiee.split(","); + ithorianRewardItems = itemIthorian.split(","); - isUniversalReward = !defaultRewardItems.isEmpty() && (wookieRewardItems.isEmpty() && ithorianRewardItems.isEmpty()); + isUniversalReward = !itemDefault.isEmpty() && (itemWookiee.isEmpty() && itemIthorian.isEmpty()); } } diff --git a/src/services/experience/SkillTemplateService.java b/src/services/experience/SkillTemplateService.java index 19d918550..6abb7211c 100644 --- a/src/services/experience/SkillTemplateService.java +++ b/src/services/experience/SkillTemplateService.java @@ -30,7 +30,6 @@ package services.experience; import intents.experience.LevelChangedIntent; import intents.experience.SkillBoxGrantedIntent; import java.awt.Color; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -46,7 +45,6 @@ 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; @@ -64,7 +62,7 @@ import services.objects.ObjectCreator; public final class SkillTemplateService extends Service { private final Map skillTemplates; - private static Map rewards = new HashMap<>(); + private Map rewards = new HashMap<>(); private DatatableData rewardsTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/roadmap/item_rewards.iff"); SkillTemplateService() { @@ -135,24 +133,28 @@ public final class SkillTemplateService extends Service { private void giveRewardItems(CreatureObject creatureObject, String skillName) { RoadmapReward reward = rewards.get(skillName); - ArrayList items; Race characterRace = creatureObject.getRace(); String species = characterRace.getSpecies().toUpperCase(); + String[] items; if (reward.isUniversalReward()) items = reward.getDefaultRewardItems(); else if (species.equals("ITHORIAN")) items = reward.getIthorianRewardItems(); else if (species.equals("WOOKIEE")) - items = reward.getWookieRewardItems(); + items = reward.getWookieeRewardItems(); else items = reward.getDefaultRewardItems(); for (String item : items) { SWGObject inventory = creatureObject.getSlottedObject("inventory"); - if (item.contains(".iff")) { + 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(); From aa6705533d73a2324a4f49a4463b45cb8746426a Mon Sep 17 00:00:00 2001 From: Skyler Lehan Date: Sat, 24 Sep 2016 18:00:09 -0400 Subject: [PATCH 3/4] NGE-165: prevented blank items from being "added" to the inventory --- src/resources/rewards/RoadmapReward.java | 6 +++ .../experience/SkillTemplateService.java | 40 ++++++++++--------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/resources/rewards/RoadmapReward.java b/src/resources/rewards/RoadmapReward.java index e4f7b8463..bb8b1f774 100644 --- a/src/resources/rewards/RoadmapReward.java +++ b/src/resources/rewards/RoadmapReward.java @@ -38,6 +38,7 @@ public class RoadmapReward { 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; @@ -84,6 +85,10 @@ public class RoadmapReward { return itemIthorian; } + public boolean hasItems() { + return hasItems; + } + public boolean isUniversalReward() { return isUniversalReward; } @@ -106,5 +111,6 @@ public class RoadmapReward { 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 6abb7211c..423eec691 100644 --- a/src/services/experience/SkillTemplateService.java +++ b/src/services/experience/SkillTemplateService.java @@ -115,7 +115,7 @@ public final class SkillTemplateService extends Service { String skillName = templates[skillIndex]; new SkillBoxGrantedIntent(skillName, creatureObject).broadcast(); playerObject.setProfWheelPosition(skillName); - + giveRewardItems(creatureObject, skillName); creatureObject.sendObserversAndSelf(new PlayClientEffectObjectMessage("clienteffect/skill_granted.cef", "", objectId)); @@ -137,27 +137,29 @@ public final class SkillTemplateService extends Service { String species = characterRace.getSpecies().toUpperCase(); String[] items; - 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(); + 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) { - SWGObject inventory = creatureObject.getSlottedObject("inventory"); + for (String item : items) { + SWGObject inventory = creatureObject.getSlottedObject("inventory"); - if (item.endsWith(".iff")) { - SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(ClientFactory.formatToSharedFile(item)); + 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(); + if (nonStaticItem != null) { + nonStaticItem.moveToContainer(inventory); + } + new ObjectCreatedIntent(nonStaticItem).broadcast(); + } else + new CreateStaticItemIntent(creatureObject, inventory, item).broadcast(); + } } } From 85109b2901f0c64c5f9c2555499a6fc3554d3535 Mon Sep 17 00:00:00 2001 From: Skyler Lehan Date: Mon, 26 Sep 2016 08:25:43 -0400 Subject: [PATCH 4/4] Fixed issues in pull request for NGE-165 --- src/resources/rewards/RoadmapReward.java | 2 +- src/services/experience/SkillTemplateService.java | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/resources/rewards/RoadmapReward.java b/src/resources/rewards/RoadmapReward.java index bb8b1f774..b14de2883 100644 --- a/src/resources/rewards/RoadmapReward.java +++ b/src/resources/rewards/RoadmapReward.java @@ -110,7 +110,7 @@ public class RoadmapReward { wookieeRewardItems = itemWookiee.split(","); ithorianRewardItems = itemIthorian.split(","); - isUniversalReward = !itemDefault.isEmpty() && (itemWookiee.isEmpty() && itemIthorian.isEmpty()); + 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 dd399b229..02228dd3e 100644 --- a/src/services/experience/SkillTemplateService.java +++ b/src/services/experience/SkillTemplateService.java @@ -63,11 +63,13 @@ import services.objects.ObjectCreator; public final class SkillTemplateService extends Service { private final Map skillTemplates; - private Map rewards = new HashMap<>(); - private DatatableData rewardsTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/roadmap/item_rewards.iff"); + private Map rewards; + private DatatableData rewardsTable; - SkillTemplateService() { + public SkillTemplateService() { skillTemplates = new HashMap<>(); + rewards = new HashMap<>(); + rewardsTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/roadmap/item_rewards.iff"); registerForIntent(LevelChangedIntent.TYPE); } @@ -139,6 +141,7 @@ public final class SkillTemplateService extends Service { 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()) { @@ -152,8 +155,6 @@ public final class SkillTemplateService extends Service { items = reward.getDefaultRewardItems(); for (String item : items) { - SWGObject inventory = creatureObject.getSlottedObject("inventory"); - if (item.endsWith(".iff")) { SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(ClientFactory.formatToSharedFile(item));