Skip to content

Commit f85c219

Browse files
committed
Fix mob variant resolver (FieldResolver) class loader init
Previously due to static final init depending on static final members, success of loading the class was down to ClassLoader RNG. but now everything should be fine :)
1 parent 0db96f0 commit f85c219

File tree

7 files changed

+109
-100
lines changed

7 files changed

+109
-100
lines changed

build.gradle

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
22
import de.dosmike.sponge.pluginpublisher.gradle.NotifyDiscordBotTask
33
import de.dosmike.sponge.pluginpublisher.gradle.PublishToGitTask
44
import de.dosmike.sponge.pluginpublisher.gradle.PublishToOreTask
5-
import de.dosmike.sponge.pluginpublisher.tasks.DiscordBotConfiguration
6-
import de.dosmike.sponge.pluginpublisher.tasks.GitConfiguration
7-
import de.dosmike.sponge.pluginpublisher.tasks.OreConfiguration
85
import de.dosmike.sponge.pluginpublisher.tasks.TaskFunctors
96

107
plugins {
@@ -13,7 +10,7 @@ plugins {
1310
id 'idea'
1411
id 'org.spongepowered.plugin' version '0.9.0'
1512
id 'com.github.johnrengelman.shadow' version '5.1.0'
16-
id 'com.github.dosmike.PluginPublisher' version '1.2.2'
13+
id 'com.github.dosmike.PluginPublisher' version '1.2.3'
1714
}
1815
group = 'com.github.dosmike'
1916

src/main/java/de/dosmike/sponge/vshop/VillagerShops.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
import java.util.zip.ZipOutputStream;
5757

5858
@SuppressWarnings("UnstableApiUsage")
59-
@Plugin(id = "vshop", name = "VillagerShops", version = "2.8.1")
59+
@Plugin(id = "vshop", name = "VillagerShops", version = "2.8.2")
6060
public class VillagerShops {
6161

6262
public static final Random rng = new Random(System.currentTimeMillis());

src/main/java/de/dosmike/sponge/vshop/commands/cmdImport.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import de.dosmike.sponge.vshop.PermissionRegistra;
55
import de.dosmike.sponge.vshop.Utilities;
66
import de.dosmike.sponge.vshop.VillagerShops;
7-
import de.dosmike.sponge.vshop.shops.FieldResolver;
7+
import de.dosmike.sponge.vshop.shops.FieldResolvers;
88
import de.dosmike.sponge.vshop.shops.ShopEntity;
99
import org.jetbrains.annotations.NotNull;
1010
import org.spongepowered.api.command.CommandException;
@@ -83,17 +83,17 @@ public CommandResult execute(@NotNull CommandSource src, @NotNull CommandContext
8383

8484
String skinVariant;
8585
if (entity.getType().equals(EntityTypes.HORSE)) {
86-
skinVariant = FieldResolver.HORSE_VARIANT.getVariant(entity);
86+
skinVariant = FieldResolvers.HORSE_VARIANT.getVariant(entity);
8787
} else if (entity.getType().equals(EntityTypes.LLAMA)) {
88-
skinVariant = FieldResolver.LLAMA_VARIANT.getVariant(entity);
88+
skinVariant = FieldResolvers.LLAMA_VARIANT.getVariant(entity);
8989
} else if (entity.getType().equals(EntityTypes.OCELOT)) {
90-
skinVariant = FieldResolver.OCELOT_VARIANT.getVariant(entity);
90+
skinVariant = FieldResolvers.OCELOT_VARIANT.getVariant(entity);
9191
} else if (entity.getType().equals(EntityTypes.PARROT)) {
92-
skinVariant = FieldResolver.PARROT_VARIANT.getVariant(entity);
92+
skinVariant = FieldResolvers.PARROT_VARIANT.getVariant(entity);
9393
} else if (entity.getType().equals(EntityTypes.RABBIT)) {
94-
skinVariant = FieldResolver.RABBIT_VARIANT.getVariant(entity);
94+
skinVariant = FieldResolvers.RABBIT_VARIANT.getVariant(entity);
9595
} else if (entity.getType().equals(EntityTypes.VILLAGER)) {
96-
skinVariant = FieldResolver.VILLAGER_VARIANT.getVariant(entity);
96+
skinVariant = FieldResolvers.VILLAGER_VARIANT.getVariant(entity);
9797
} else {
9898
skinVariant = "none";
9999
}

src/main/java/de/dosmike/sponge/vshop/shops/FieldResolver.java

Lines changed: 4 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,28 @@
11
package de.dosmike.sponge.vshop.shops;
22

33
import com.google.common.reflect.TypeToken;
4-
import de.dosmike.sponge.vshop.VillagerShops;
54
import org.apache.commons.lang3.StringUtils;
65
import org.spongepowered.api.CatalogType;
76
import org.spongepowered.api.Sponge;
87
import org.spongepowered.api.data.key.Key;
9-
import org.spongepowered.api.data.key.Keys;
10-
import org.spongepowered.api.data.type.Career;
11-
import org.spongepowered.api.data.type.Profession;
128
import org.spongepowered.api.data.value.BaseValue;
139
import org.spongepowered.api.entity.Entity;
1410
import org.spongepowered.api.entity.EntityType;
15-
import org.spongepowered.api.entity.EntityTypes;
16-
import org.spongepowered.api.entity.living.player.User;
1711

1812
import java.util.*;
1913
import java.util.regex.Pattern;
2014
import java.util.stream.Collectors;
2115

2216
public class FieldResolver {
2317

24-
public static final FieldResolver HORSE_VARIANT = new FieldResolver(
25-
EntityTypes.HORSE, Arrays.asList(Keys.HORSE_STYLE, Keys.HORSE_COLOR)
26-
);
27-
public static final FieldResolver OCELOT_VARIANT = new FieldResolver(
28-
EntityTypes.OCELOT, Collections.singletonList(Keys.OCELOT_TYPE)
29-
);
30-
public static final FieldResolver LLAMA_VARIANT = new FieldResolver(
31-
EntityTypes.LLAMA, Collections.singletonList(Keys.LLAMA_VARIANT)
32-
);
33-
public static final FieldResolver RABBIT_VARIANT = new FieldResolver(
34-
EntityTypes.RABBIT, Collections.singletonList(Keys.RABBIT_TYPE)
35-
);
36-
public static final FieldResolver PARROT_VARIANT = new FieldResolver(
37-
EntityTypes.PARROT, Collections.singletonList(Keys.PARROT_VARIANT)
38-
);
39-
public static final FieldResolver PLAYER_SKIN = new FieldResolver(
40-
EntityTypes.HUMAN, Collections.singletonList(Keys.SKIN_UNIQUE_ID)
41-
) {
42-
final Pattern patUUID = Pattern.compile("(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|(?:[0-9a-f]{32})", Pattern.CASE_INSENSITIVE);
43-
44-
@Override
45-
public KeyAttacher validate(String magicVariant) {
46-
UUID uuid = null;
47-
if (patUUID.matcher(magicVariant).matches()) {
48-
if (magicVariant.indexOf('-') < 0) {
49-
magicVariant = magicVariant.substring(0, 8) + "-" + magicVariant.substring(8, 12) + "-" + magicVariant.substring(12, 16) + "-" + magicVariant.substring(16, 20) + "-" + magicVariant.substring(20);
50-
}
51-
uuid = UUID.fromString(magicVariant);
52-
} else {
53-
try {
54-
User user = VillagerShops.getUserStorage()
55-
.get(magicVariant).orElse(null);
56-
if (user != null)
57-
uuid = user.getUniqueId();
58-
} catch (Exception e) {
59-
/* ignore invalid values */
60-
}
61-
}
62-
KeyAttacher attacher = new KeyAttacher();
63-
attacher.add(Keys.SKIN_UNIQUE_ID, uuid);
64-
return attacher;
65-
}
66-
67-
/** can't auto this on server startup */
68-
@Override
69-
public Set<String> registerAutoComplete() {
70-
return new HashSet<>();
71-
}
72-
};
7318
protected static final Map<EntityType, Set<String>> autoTabCompleteMapping = new HashMap<>();
74-
private static final String VARIANT_CONCATINATOR = "+";
75-
private static final Pattern VARIANT_SPLITERATOR = Pattern.compile("\\+");
76-
public static final FieldResolver VILLAGER_VARIANT = new FieldResolver(
77-
EntityTypes.VILLAGER, Collections.singletonList(Keys.CAREER)
78-
) {
79-
@Override
80-
public KeyAttacher validate(String magicVariant) {
81-
String[] raw = VARIANT_SPLITERATOR.split(magicVariant);
82-
Career career = null;
83-
Profession profession = null;
84-
for (String s : raw) {
85-
Optional<Career> careerOptional = Sponge.getRegistry().getType(Career.class, s);
86-
if (careerOptional.isPresent()) career = careerOptional.get();
87-
Optional<Profession> professionOptional = Sponge.getRegistry().getType(Profession.class, s);
88-
if (professionOptional.isPresent()) profession = professionOptional.get();
89-
}
90-
if (career == null && profession != null)
91-
career = profession.getCareers().stream().findAny().orElse(null);
19+
static final String VARIANT_CONCATINATOR = "+";
20+
static final Pattern VARIANT_SPLITERATOR = Pattern.compile("\\+");
9221

93-
KeyAttacher attacher = new KeyAttacher();
94-
attacher.add(Keys.CAREER, career);
95-
return attacher;
96-
}
97-
};
9822
private static final Map<EntityType, FieldResolver> autoResolverMapping = new HashMap<>();
9923
protected final ArrayList<Key<? extends BaseValue<?>>> keys;
10024

101-
private FieldResolver(EntityType type, List<Key<? extends BaseValue<?>>> keyList) {
25+
FieldResolver(EntityType type, List<Key<? extends BaseValue<?>>> keyList) {
10226
this.keys = new ArrayList<>(keyList);
10327
autoResolverMapping.put(type, this);
10428
autoTabCompleteMapping.put(type, registerAutoComplete());
@@ -230,7 +154,7 @@ public String toString() {
230154
public static class KeyAttacher {
231155
final List<KeyValuePair<?, ?>> values = new LinkedList<>();
232156

233-
private KeyAttacher() {
157+
KeyAttacher() {
234158
}
235159

236160
<V, K extends BaseValue<V>> void add(Key<K> key, V value) {
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package de.dosmike.sponge.vshop.shops;
2+
3+
import de.dosmike.sponge.vshop.VillagerShops;
4+
import org.spongepowered.api.Sponge;
5+
import org.spongepowered.api.data.key.Keys;
6+
import org.spongepowered.api.data.type.Career;
7+
import org.spongepowered.api.data.type.Profession;
8+
import org.spongepowered.api.entity.EntityTypes;
9+
import org.spongepowered.api.entity.living.player.User;
10+
11+
import java.util.*;
12+
import java.util.regex.Pattern;
13+
14+
public class FieldResolvers {
15+
16+
public static final FieldResolver HORSE_VARIANT = new FieldResolver(
17+
EntityTypes.HORSE, Arrays.asList(Keys.HORSE_STYLE, Keys.HORSE_COLOR)
18+
);
19+
public static final FieldResolver OCELOT_VARIANT = new FieldResolver(
20+
EntityTypes.OCELOT, Collections.singletonList(Keys.OCELOT_TYPE)
21+
);
22+
public static final FieldResolver LLAMA_VARIANT = new FieldResolver(
23+
EntityTypes.LLAMA, Collections.singletonList(Keys.LLAMA_VARIANT)
24+
);
25+
public static final FieldResolver RABBIT_VARIANT = new FieldResolver(
26+
EntityTypes.RABBIT, Collections.singletonList(Keys.RABBIT_TYPE)
27+
);
28+
public static final FieldResolver PARROT_VARIANT = new FieldResolver(
29+
EntityTypes.PARROT, Collections.singletonList(Keys.PARROT_VARIANT)
30+
);
31+
public static final FieldResolver PLAYER_SKIN = new FieldResolver(
32+
EntityTypes.HUMAN, Collections.singletonList(Keys.SKIN_UNIQUE_ID)
33+
) {
34+
final Pattern patUUID = Pattern.compile("(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|(?:[0-9a-f]{32})", Pattern.CASE_INSENSITIVE);
35+
36+
@Override
37+
public KeyAttacher validate(String magicVariant) {
38+
UUID uuid = null;
39+
if (patUUID.matcher(magicVariant).matches()) {
40+
if (magicVariant.indexOf('-') < 0) {
41+
magicVariant = magicVariant.substring(0, 8) + "-" + magicVariant.substring(8, 12) + "-" + magicVariant.substring(12, 16) + "-" + magicVariant.substring(16, 20) + "-" + magicVariant.substring(20);
42+
}
43+
uuid = UUID.fromString(magicVariant);
44+
} else {
45+
try {
46+
User user = VillagerShops.getUserStorage()
47+
.get(magicVariant).orElse(null);
48+
if (user != null)
49+
uuid = user.getUniqueId();
50+
} catch (Exception e) {
51+
/* ignore invalid values */
52+
}
53+
}
54+
KeyAttacher attacher = new FieldResolver.KeyAttacher();
55+
attacher.add(Keys.SKIN_UNIQUE_ID, uuid);
56+
return attacher;
57+
}
58+
59+
/** can't auto this on server startup */
60+
@Override
61+
public Set<String> registerAutoComplete() {
62+
return new HashSet<>();
63+
}
64+
};
65+
public static final FieldResolver VILLAGER_VARIANT = new FieldResolver(
66+
EntityTypes.VILLAGER, Collections.singletonList(Keys.CAREER)
67+
) {
68+
@Override
69+
public KeyAttacher validate(String magicVariant) {
70+
String[] raw = VARIANT_SPLITERATOR.split(magicVariant);
71+
Career career = null;
72+
Profession profession = null;
73+
for (String s : raw) {
74+
Optional<Career> careerOptional = Sponge.getRegistry().getType(Career.class, s);
75+
if (careerOptional.isPresent()) career = careerOptional.get();
76+
Optional<Profession> professionOptional = Sponge.getRegistry().getType(Profession.class, s);
77+
if (professionOptional.isPresent()) profession = professionOptional.get();
78+
}
79+
if (career == null && profession != null)
80+
career = profession.getCareers().stream().findAny().orElse(null);
81+
82+
KeyAttacher attacher = new FieldResolver.KeyAttacher();
83+
attacher.add(Keys.CAREER, career);
84+
return attacher;
85+
}
86+
};
87+
88+
}

src/main/java/de/dosmike/sponge/vshop/shops/ShopEntity.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,19 +155,19 @@ public void setVariant(String magicVariant) {
155155
if (magicVariant.equalsIgnoreCase("none")) {
156156
variant = null;
157157
} else if (npcType.equals(EntityTypes.HUMAN)) {
158-
variant = FieldResolver.PLAYER_SKIN.validate(magicVariant);
158+
variant = FieldResolvers.PLAYER_SKIN.validate(magicVariant);
159159
} else if (npcType.equals(EntityTypes.HORSE)) {
160-
variant = FieldResolver.HORSE_VARIANT.validate(magicVariant);
160+
variant = FieldResolvers.HORSE_VARIANT.validate(magicVariant);
161161
} else if (npcType.equals(EntityTypes.OCELOT)) {
162-
variant = FieldResolver.OCELOT_VARIANT.validate(magicVariant);
162+
variant = FieldResolvers.OCELOT_VARIANT.validate(magicVariant);
163163
} else if (npcType.equals(EntityTypes.VILLAGER)) {
164-
variant = FieldResolver.VILLAGER_VARIANT.validate(magicVariant);
164+
variant = FieldResolvers.VILLAGER_VARIANT.validate(magicVariant);
165165
} else if (npcType.equals(EntityTypes.LLAMA)) {
166-
variant = FieldResolver.LLAMA_VARIANT.validate(magicVariant);
166+
variant = FieldResolvers.LLAMA_VARIANT.validate(magicVariant);
167167
} else if (npcType.equals(EntityTypes.RABBIT)) {
168-
variant = FieldResolver.RABBIT_VARIANT.validate(magicVariant);
168+
variant = FieldResolvers.RABBIT_VARIANT.validate(magicVariant);
169169
} else if (npcType.equals(EntityTypes.PARROT)) {
170-
variant = FieldResolver.PARROT_VARIANT.validate(magicVariant);
170+
variant = FieldResolvers.PARROT_VARIANT.validate(magicVariant);
171171
} else {
172172
variantName = "NONE";
173173
variant = null;

src/main/resources/mcmod.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"modid": "vshop",
33
"name": "VillagerShops",
44
"description": "Set up Mobs of any type as admin shop. Shops will use a Inventory-Menu to buy/sell items",
5-
"version": "2.8.1",
5+
"version": "2.8.2",
66
"url": "https://github.com/DosMike/VillagerShops",
77
"authorList": [ "DosMike" ],
88
"useDependencyInformation": "true",

0 commit comments

Comments
 (0)