diff --git a/pswgcommon b/pswgcommon index 688bd625c..221a3ecea 160000 --- a/pswgcommon +++ b/pswgcommon @@ -1 +1 @@ -Subproject commit 688bd625c5739b9b1696caf87d736ce8e145a9e2 +Subproject commit 221a3ecea4b1da7a9d9c302d24647e96db35043f diff --git a/src/main/java/com/projectswg/holocore/intents/support/global/chat/SpatialChatIntent.java b/src/main/java/com/projectswg/holocore/intents/support/global/chat/SpatialChatIntent.java index 96b7377c3..3cef48b01 100644 --- a/src/main/java/com/projectswg/holocore/intents/support/global/chat/SpatialChatIntent.java +++ b/src/main/java/com/projectswg/holocore/intents/support/global/chat/SpatialChatIntent.java @@ -35,12 +35,14 @@ public class SpatialChatIntent extends Intent { private String message; private int chatType; private int moodId; + private int languageId; - public SpatialChatIntent(Player player, int chatType, String message, int moodId) { + public SpatialChatIntent(Player player, int chatType, String message, int moodId, int languageId) { this.player = player; this.message = message; this.chatType = chatType; this.moodId = moodId; + this.languageId = languageId; } public Player getPlayer() { @@ -58,4 +60,8 @@ public class SpatialChatIntent extends Intent { public int getMoodId() { return moodId; } + + public int getLanguageId() { + return languageId; + } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/chat/CmdSetSpokenLanguage.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/chat/CmdSetSpokenLanguage.java new file mode 100644 index 000000000..646dc9e31 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/chat/CmdSetSpokenLanguage.java @@ -0,0 +1,44 @@ +/*********************************************************************************** + * Copyright (c) 2019 /// 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 com.projectswg.holocore.resources.support.global.commands.callbacks.chat; + +import com.projectswg.holocore.resources.support.global.commands.ICmdCallback; +import com.projectswg.holocore.resources.support.global.player.Player; +import com.projectswg.holocore.resources.support.objects.swg.SWGObject; +import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class CmdSetSpokenLanguage implements ICmdCallback { + + @Override + public void execute(@NotNull Player player, @Nullable SWGObject target, @NotNull String args) { + PlayerObject playerObject = player.getPlayerObject(); + + playerObject.setLanguageId(Integer.parseInt(args)); + } +} diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/chat/CmdSpatialChatInternal.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/chat/CmdSpatialChatInternal.java index 053c90967..56bc56b2e 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/chat/CmdSpatialChatInternal.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/callbacks/chat/CmdSpatialChatInternal.java @@ -10,9 +10,9 @@ public final class CmdSpatialChatInternal implements ICmdCallback { @Override public void execute(@NotNull Player player, SWGObject target, @NotNull String args) { - String[] cmdArgs = args.split(" ", 5); + String[] cmdArgs = args.split(" ", 6); - new SpatialChatIntent(player, Integer.valueOf(cmdArgs[1]), args.substring(10), Integer.valueOf(cmdArgs[2])).broadcast(); + new SpatialChatIntent(player, Integer.parseInt(cmdArgs[1]), args.substring(10), Integer.parseInt(cmdArgs[2]), Integer.parseInt(cmdArgs[4])).broadcast(); } } diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreation.java b/src/main/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreation.java index 1681c7a61..cda95d37b 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreation.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreation.java @@ -53,6 +53,9 @@ import me.joshlarson.jlcommon.utilities.Arguments; import org.jetbrains.annotations.NotNull; import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; public class CharacterCreation { @@ -70,10 +73,10 @@ public class CharacterCreation { CreatureObject creatureObj = createCreature(race.getFilename(), info); PlayerObject playerObj = createPlayer(creatureObj); - setCreatureObjectValues(creatureObj); - setPlayerObjectValues(playerObj); + setCreatureObjectValues(creatureObj, race); + setPlayerObjectValues(playerObj, race); createHair(creatureObj, create.getHair(), create.getHairCustomization()); - createStarterClothing(creatureObj, create.getRace(), create.getClothes()); + createStarterClothing(creatureObj, race, create.getClothes()); playerObj.setAdminTag(accessLevel); ObjectCreatedIntent.broadcast(playerObj); @@ -142,8 +145,8 @@ public class CharacterCreation { hairObj.setAppearanceData(customization); } - private void setCreatureObjectValues(CreatureObject creatureObj) { - creatureObj.setRace(Race.getRaceByFile(create.getRace())); + private void setCreatureObjectValues(CreatureObject creatureObj, Race race) { + creatureObj.setRace(race); creatureObj.setAppearanceData(create.getCharCustomization()); creatureObj.setHeight(create.getHeight()); creatureObj.setObjectName(create.getName()); @@ -154,6 +157,12 @@ public class CharacterCreation { new GrantSkillIntent(GrantSkillIntent.IntentType.GRANT, create.getStartingPhase(), creatureObj, true).broadcast(); new GrantSkillIntent(GrantSkillIntent.IntentType.GRANT, "species_" + creatureObj.getRace().getSpecies(), creatureObj, true).broadcast(); + Collection languages = languagesSkillsForRace(creatureObj.getRace()); + + for (String language : languages) { + new GrantSkillIntent(GrantSkillIntent.IntentType.GRANT, language, creatureObj, true).broadcast(); + } + WeaponObject defWeapon = (WeaponObject) createInventoryObject(creatureObj, "object/weapon/melee/unarmed/shared_unarmed_default_player.iff"); defWeapon.setMaxRange(5); defWeapon.setType(WeaponType.UNARMED); @@ -168,14 +177,15 @@ public class CharacterCreation { createInventoryObject(creatureObj, "object/tangible/mission_bag/shared_mission_bag.iff"); } - private void setPlayerObjectValues(PlayerObject playerObj) { + private void setPlayerObjectValues(PlayerObject playerObj, Race race) { playerObj.setProfession(Profession.getProfessionFromClient(create.getProfession())); playerObj.setBornDate(Instant.now()); playerObj.setAccount(player.getUsername()); + playerObj.setLanguageId(defaultLanguageForRace(race)); } - private void createStarterClothing(CreatureObject creature, String race, String clothing) { - List items = DataLoader.Companion.playerStartClothing().getClothing(Race.getRaceByFile(race), clothing); + private void createStarterClothing(CreatureObject creature, Race race, String clothing) { + List items = DataLoader.Companion.playerStartClothing().getClothing(race, clothing); if (items != null) { for (String itemTemplate : items) { createDefaultObject(creature, itemTemplate); @@ -187,6 +197,80 @@ public class CharacterCreation { createDefaultObject(inventory, "object/tangible/npe/shared_npe_uniform_box.iff"); } + private Collection languagesSkillsForRace(Race race) { + Collection languages = new HashSet<>(); + + languages.add("social_language_basic_comprehend"); // Anyone can comprehend Galactic Basic + languages.add("social_language_wookiee_comprehend"); // Anyone can comprehend Shyriiwook + + switch (race) { + case HUMAN_MALE: + case HUMAN_FEMALE: + languages.add("social_language_basic_speak"); + break; + case BOTHAN_MALE: + case BOTHAN_FEMALE: + languages.add("social_language_basic_speak"); + languages.add("social_language_bothan_speak"); + languages.add("social_language_bothan_comprehend"); + break; + case ITHORIAN_MALE: + case ITHORIAN_FEMALE: + languages.add("social_language_basic_speak"); + languages.add("social_language_ithorian_speak"); + languages.add("social_language_ithorian_comprehend"); + break; + case TWILEK_MALE: + case TWILEK_FEMALE: + languages.add("social_language_basic_speak"); + languages.add("social_language_lekku_comprehend"); + languages.add("social_language_lekku_speak"); + languages.add("social_language_twilek_comprehend"); + languages.add("social_language_twilek_speak"); + break; + case MONCAL_MALE: + case MONCAL_FEMALE: + languages.add("social_language_basic_speak"); + languages.add("social_language_moncalamari_comprehend"); + languages.add("social_language_moncalamari_speak"); + break; + case RODIAN_MALE: + case RODIAN_FEMALE: + languages.add("social_language_basic_speak"); + languages.add("social_language_rodian_comprehend"); + languages.add("social_language_rodian_speak"); + break; + case SULLUSTAN_MALE: + case SULLUSTAN_FEMALE: + languages.add("social_language_basic_speak"); + languages.add("social_language_sullustan_comprehend"); + languages.add("social_language_sullustan_speak"); + break; + case TRANDOSHAN_MALE: + case TRANDOSHAN_FEMALE: + languages.add("social_language_basic_speak"); + languages.add("social_language_trandoshan_comprehend"); + languages.add("social_language_trandoshan_speak"); + break; + case WOOKIEE_MALE: + case WOOKIEE_FEMALE: + languages.add("social_language_wookiee_speak"); + break; + } + + return languages; + } + + private static int defaultLanguageForRace(Race race) { + switch (race) { + case WOOKIEE_MALE: + case WOOKIEE_FEMALE: + return 5; // Wookiees speak Shyriiwook by default + default: + return 1; // Galactic basic + } + } + private static Location generateRandomLocation(ZoneInsertion info) { return Location.builder() .setTerrain(info.getTerrain()) diff --git a/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatSpatialService.java b/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatSpatialService.java index c07c0daf9..2b260b4bd 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatSpatialService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/chat/ChatSpatialService.java @@ -24,7 +24,7 @@ public class ChatSpatialService extends Service { String senderName = sender.getCharacterFirstName(); // Send to self - SpatialChat message = new SpatialChat(actor.getObjectId(), actor.getObjectId(), 0, spi.getMessage(), (short) spi.getChatType(), (short) 0); + SpatialChat message = new SpatialChat(actor.getObjectId(), actor.getObjectId(), 0, spi.getMessage(), (short) spi.getChatType(), (short) 0, (byte) spi.getLanguageId()); // Notify observers of the chat message for (Player owner : actor.getObservers()) { diff --git a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java index 2659805e4..3d15b2499 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandExecutionService.java @@ -120,6 +120,7 @@ public class CommandExecutionService extends Service { registerCallback("broadcastPlanet", CmdBroadcastPlanet::new); registerCallback("planetChat", CmdPlanetChat::new); registerCallback("spatialChatInternal", CmdSpatialChatInternal::new); + registerCallback("setSpokenLanguage", CmdSetSpokenLanguage::new); addChatFriendScripts(); }