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();
}