Skip to content

Commit 37dd366

Browse files
author
NeumimTo
committed
bugfixes
1 parent e9245d8 commit 37dd366

13 files changed

Lines changed: 73 additions & 22 deletions

File tree

API/src/main/java/cz/neumimto/rpg/api/entity/players/IActiveCharacter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ default Long getCooldown(String action) {
136136

137137
boolean hasSkill(String name);
138138

139+
void removeClass(ClassDefinition classDefinition);
140+
139141
int getLevel();
140142

141143
PlayerSkillContext getSkillInfo(String s);

API/src/main/java/cz/neumimto/rpg/api/localization/LocalizationKeys.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public class LocalizationKeys {
7575
public static final String ARMOR_MENU_HELP = "gui.label.armor.tooltip";
7676
public static final String PROPERTIES = "gui.label.generic.properties";
7777
public static final String CLASS_TYPES = "gui.label.class-types";
78+
public static final String CLASS_TYPE_IMMUTABLE = "player.message.class-type.immutable";
7879
public static final String BACK = "gui.button.back";
7980
public static final String LEVEL = "gui.label.level";
8081
public static final String PARTY_CREATED = "player.party-created.message";
@@ -162,6 +163,7 @@ public class LocalizationKeys {
162163
public static final String SPELLBOOK_ADDPAGE = "label.item.spellbook.addpage";
163164
public static final String SPELLBOOK_ROTATION = "spellbook.cooldown.text";
164165

166+
165167
private LocalizationKeys() {
166168
}
167169
}

Common/src/main/java/cz/neumimto/rpg/common/commands/CharacterCommandFacade.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,6 @@ public void commandCommitAttribute(IActiveCharacter character) {
7272
}
7373
}
7474

75-
public boolean commandChooseClass(IActiveCharacter character, ClassDefinition configClass) {
76-
if (character.isStub()) {
77-
character.sendMessage(localizationService.translate(LocalizationKeys.CHARACTER_IS_REQUIRED));
78-
return false;
79-
}
80-
81-
ActionResult result = characterService.canGainClass(character, configClass);
82-
if (result.isOk()) {
83-
characterService.addNewClass(character, configClass);
84-
} else {
85-
character.sendMessage(result.getMessage());
86-
}
87-
return true;
88-
}
89-
9075
public void commandCreateCharacter(UUID uuid, String name, String playerName, Consumer<ActionResult> actionResultConsumer) {
9176
CompletableFuture.runAsync(() -> {
9277
int i = characterService.canCreateNewCharacter(uuid, name);

Common/src/main/java/cz/neumimto/rpg/common/commands/CharacterCommands.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import cz.neumimto.rpg.api.entity.players.classes.ClassDefinition;
1414
import cz.neumimto.rpg.api.gui.Gui;
1515
import cz.neumimto.rpg.api.skills.ISkill;
16+
import cz.neumimto.rpg.api.utils.ActionResult;
1617

1718
import javax.inject.Inject;
1819
import javax.inject.Singleton;
@@ -43,7 +44,13 @@ public void characterList(IActiveCharacter character) {
4344

4445
@Subcommand("choose class")
4546
public void chooseCharacterClass(IActiveCharacter character, ClassDefinition classDefinition) {
46-
characterService.addNewClass(character, classDefinition);
47+
ActionResult actionResult = characterService.canGainClass(character, classDefinition);
48+
if (actionResult.isOk()) {
49+
characterService.addNewClass(character, classDefinition);
50+
} else {
51+
String message = actionResult.getMessage();
52+
character.sendMessage(message);
53+
}
4754
}
4855

4956
@Subcommand("attributes")

Common/src/main/java/cz/neumimto/rpg/common/entity/players/AbstractCharacterService.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import cz.neumimto.rpg.api.events.character.*;
4141
import cz.neumimto.rpg.api.gui.Gui;
4242
import cz.neumimto.rpg.api.inventory.InventoryService;
43+
import cz.neumimto.rpg.api.localization.Arg;
4344
import cz.neumimto.rpg.api.localization.LocalizationKeys;
4445
import cz.neumimto.rpg.api.localization.LocalizationService;
4546
import cz.neumimto.rpg.api.logging.Log;
@@ -176,6 +177,8 @@ public void loadPlayerData(UUID id, String playerName) {
176177

177178
protected void initSpellbook(T activeCharacter) {
178179
String[][] spellbookPages = activeCharacter.getCharacterBase().getSpellbookPages();
180+
if (spellbookPages == null)
181+
return;
179182
for (int i = 0; i < spellbookPages.length; i++) {
180183
for (int j = 0; j < spellbookPages[i].length; j++) {
181184
String skillId = spellbookPages[i][j];
@@ -1175,6 +1178,13 @@ public ActionResult canGainClass(T character, ClassDefinition klass) {
11751178
}
11761179

11771180
PluginConfig pluginConfig = Rpg.get().getPluginConfig();
1181+
1182+
ClassTypeDefinition classTypeDefinition = pluginConfig.CLASS_TYPES.get(klass.getClassType());
1183+
PlayerClassData classByType = character.getClassByType(klass.getClassType());
1184+
if (!classTypeDefinition.isChangeable() && classByType != null) {
1185+
String text = localizationService.translate(LocalizationKeys.CLASS_TYPE_IMMUTABLE, Arg.arg("type", klass.getClassType()));
1186+
return ActionResult.withErrorMessage(text);
1187+
}
11781188
if (pluginConfig.RESPECT_CLASS_SELECTION_ORDER) {
11791189
Set<String> classTypes = pluginConfig.CLASS_TYPES.keySet();
11801190
Iterator<String> ctype = classTypes.iterator();
@@ -1185,7 +1195,7 @@ public ActionResult canGainClass(T character, ClassDefinition klass) {
11851195
if (first.equalsIgnoreCase(classType) && first.equalsIgnoreCase(klass.getClassType())) {
11861196
break;
11871197
}
1188-
PlayerClassData classByType = character.getClassByType(classType);
1198+
classByType = character.getClassByType(classType);
11891199
if (classByType == null) {
11901200
String text = localizationService.translate(LocalizationKeys.MISSING_CLASS_DEPENDENCIES);
11911201
return ActionResult.withErrorMessage(text);
@@ -1219,9 +1229,21 @@ public CharacterClass addNewBaseClass(CharacterBase characterBase, ClassDefiniti
12191229
return cc;
12201230
}
12211231

1232+
public void removeBaseClass(CharacterBase characterBase, ClassDefinition klass) {
1233+
characterBase.getCharacterClasses().removeIf(next -> next.getName().equals(klass.getName()));
1234+
}
1235+
1236+
12221237
@Override
12231238
public ActionResult addNewClass(T character, ClassDefinition klass) {
12241239
CharacterBase characterBase = character.getCharacterBase();
1240+
1241+
PlayerClassData classByType = character.getClassByType(klass.getClassType());
1242+
if (classByType != null) {
1243+
character.removeClass(classByType.getClassDefinition());
1244+
}
1245+
removeBaseClass(characterBase, klass);
1246+
12251247
CharacterClass cc = addNewBaseClass(characterBase, klass);
12261248

12271249
characterBase.getCharacterClasses().add(cc);
@@ -1230,6 +1252,7 @@ public ActionResult addNewClass(T character, ClassDefinition klass) {
12301252
PlayerClassData playerClassData = new PlayerClassData(klass, cc);
12311253
character.addClass(playerClassData);
12321254

1255+
12331256
scheduleNextTick(() -> {
12341257
recalculateProperties(character);
12351258
permissionService.addPermissions(character, playerClassData);

Common/src/main/java/cz/neumimto/rpg/common/entity/players/ActiveCharacter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,11 @@ public void addClass(PlayerClassData playerClassData) {
525525
classes.put(playerClassData.getClassDefinition().getName().toLowerCase(), playerClassData);
526526
}
527527

528+
@Override
529+
public void removeClass(ClassDefinition classDefinition) {
530+
classes.remove(classDefinition.getName().toLowerCase());
531+
}
532+
528533
@Override
529534
public int getLevel() {
530535
if (primaryClass == null) {

Common/src/main/java/cz/neumimto/rpg/common/entity/players/PreloadCharacter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,11 @@ public void addClass(PlayerClassData playerClassData) {
430430

431431
}
432432

433+
@Override
434+
public void removeClass(ClassDefinition classDefinition) {
435+
436+
}
437+
433438
@Override
434439
public void removeSkillTreeSpecialization(SkillTreeSpecialization specialization) {
435440

Common/src/main/resources/guis.conf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ gui: [
33
type: class_template
44
inv: [
55
"B-------C"
6-
"---------"
6+
"--------D"
77
"--WA--S--"
88
"------T--"
99
"---------"
@@ -16,6 +16,7 @@ gui: [
1616
"A,gui.label.armor,minecraft:diamond_chestplate,12345,ninfo class-armor %class%"
1717
"S,gui.skilltree.label,minecraft:oak_sapling,12345,skilltree view %class%"
1818
"T,gui.attributes.label,minecraft:book,12345,ninfo class-attributes %class%"
19+
"D,gui.class-dependencies.label,minecraft:coal,12345,ninfo class-dependencies %class%"
1920
"-,,minecraft:gray_stained_glass_pane,1234,---"
2021
]
2122
conditions: """

Common/src/main/resources/localizations/core_localization_en.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ label.attribute-points=Attribute Points
6868
gui.label.armor.tooltip=
6969
gui.label.generic.properties=
7070
gui.label.class-types=Class Types
71+
player.message.class-type.immutable=You already are class type {{type}}
7172
gui.button.back=Back
7273
gui.label.level=Level
7374
player.party-created.message=You've created a new party

Common/src/test/java/cz/neumimto/rpg/CharacterCommandTests.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import cz.neumimto.rpg.api.gui.IPlayerMessage;
1010
import cz.neumimto.rpg.api.logging.Log;
1111
import cz.neumimto.rpg.common.commands.CharacterCommandFacade;
12+
import cz.neumimto.rpg.common.commands.CharacterCommands;
1213
import cz.neumimto.rpg.common.effects.AbstractEffectService;
1314
import cz.neumimto.rpg.common.entity.PropertyServiceImpl;
1415
import cz.neumimto.rpg.junit.CharactersExtension;
@@ -38,6 +39,9 @@ public class CharacterCommandTests {
3839
@Inject
3940
private CharacterCommandFacade characterCommandFacade;
4041

42+
@Inject
43+
private CharacterCommands characterCommands;
44+
4145
@Inject
4246
private AbstractEffectService effectService;
4347

@@ -79,7 +83,7 @@ public void testCommandAddAttribute(@Stage(READY) IActiveCharacter iActiveCharac
7983
@Test
8084
public void testAddExpCommand(@Stage(READY) IActiveCharacter iActiveCharacter) {
8185
ClassDefinition classDefinition = new ClassDefinition("test", Rpg.get().getPluginConfig().CLASS_TYPES.keySet().iterator().next());
82-
characterCommandFacade.commandChooseClass(iActiveCharacter, classDefinition);
86+
characterCommands.chooseCharacterClass(iActiveCharacter, classDefinition);
8387
Assertions.assertTrue(iActiveCharacter.getClasses().containsKey("test"));
8488
}
8589

@@ -89,7 +93,7 @@ public void testAddExpCommand_Wrong_Order(@Stage(READY) IActiveCharacter iActive
8993
iterator.next();
9094
String i = iterator.next();
9195
ClassDefinition classDefinition = new ClassDefinition("test", i);
92-
characterCommandFacade.commandChooseClass(iActiveCharacter, classDefinition);
96+
characterCommands.chooseCharacterClass(iActiveCharacter, classDefinition);
9397
Assertions.assertFalse(iActiveCharacter.getClasses().containsKey("test"));
9498
}
9599

0 commit comments

Comments
 (0)