Skip to content

Commit e43cfcd

Browse files
committed
Fix some armor slot cosmetic bugs; bump version
1 parent ad77456 commit e43cfcd

8 files changed

Lines changed: 148 additions & 104 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ allprojects {
44
apply plugin: 'idea'
55

66
group = 'be.isach'
7-
version = '2.6.2-DEV-b2'
7+
version = '2.6.2-DEV-b3'
88

99
compileJava.options.encoding = 'UTF-8'
1010

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package be.isach.ultracosmetics.cosmetics;
2+
3+
import be.isach.ultracosmetics.UltraCosmetics;
4+
import be.isach.ultracosmetics.config.MessageManager;
5+
import be.isach.ultracosmetics.cosmetics.suits.ArmorSlot;
6+
import be.isach.ultracosmetics.cosmetics.type.CosmeticType;
7+
import be.isach.ultracosmetics.player.UltraPlayer;
8+
9+
import org.bukkit.inventory.ItemStack;
10+
11+
public abstract class ArmorCosmetic<T extends CosmeticType<?>> extends Cosmetic<T> {
12+
protected boolean success = false;
13+
public ArmorCosmetic(UltraCosmetics ultraCosmetics, Category category, UltraPlayer owner, T type) {
14+
super(ultraCosmetics, category, owner, type);
15+
}
16+
17+
@Override
18+
public void clear() {
19+
super.clear();
20+
setArmorItem(null);
21+
}
22+
23+
@Override
24+
protected boolean tryEquip() {
25+
return trySetSlot();
26+
}
27+
28+
protected boolean trySetSlot() {
29+
// Remove current equipped armor piece
30+
getOwner().removeSuit(getArmorSlot());
31+
32+
if (getArmorSlot() == ArmorSlot.HELMET) {
33+
getOwner().removeHat();
34+
getOwner().removeEmote();
35+
}
36+
37+
// If the user's armor slot is still occupied after we've removed all related cosmetics,
38+
// give up and ask the user to free up the slot.
39+
if (getArmorItem() != null) {
40+
getOwner().sendMessage(MessageManager.getMessage(getOccupiedSlotKey()));
41+
return false;
42+
}
43+
setArmorItem(getType().getItemStack());
44+
success = true;
45+
return true;
46+
}
47+
48+
protected ItemStack getArmorItem() {
49+
switch (getArmorSlot()) {
50+
case BOOTS:
51+
return getPlayer().getInventory().getBoots();
52+
case LEGGINGS:
53+
return getPlayer().getInventory().getLeggings();
54+
case CHESTPLATE:
55+
return getPlayer().getInventory().getChestplate();
56+
case HELMET:
57+
return getPlayer().getInventory().getHelmet();
58+
default:
59+
return null;
60+
}
61+
}
62+
63+
protected void setArmorItem(ItemStack item) {
64+
switch (getArmorSlot()) {
65+
case BOOTS:
66+
getPlayer().getInventory().setBoots(item);
67+
break;
68+
case LEGGINGS:
69+
getPlayer().getInventory().setLeggings(item);
70+
break;
71+
case CHESTPLATE:
72+
getPlayer().getInventory().setChestplate(item);
73+
break;
74+
case HELMET:
75+
getPlayer().getInventory().setHelmet(item);
76+
break;
77+
}
78+
}
79+
80+
protected abstract ArmorSlot getArmorSlot();
81+
protected abstract String getOccupiedSlotKey();
82+
}

core/src/main/java/be/isach/ultracosmetics/cosmetics/Cosmetic.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public Cosmetic(UltraCosmetics ultraCosmetics, Category category, UltraPlayer ow
4141
this.cosmeticType = type;
4242
}
4343

44-
public void equip() {
44+
public final void equip() {
4545
if (!owner.getBukkitPlayer().hasPermission(getType().getPermission())) {
4646
getPlayer().sendMessage(MessageManager.getMessage("No-Permission"));
4747
return;
@@ -52,6 +52,10 @@ public void equip() {
5252
return;
5353
}
5454

55+
if (!tryEquip()) {
56+
return;
57+
}
58+
5559
ultraCosmetics.getServer().getPluginManager().registerEvents(this, ultraCosmetics);
5660

5761
this.equipped = true;
@@ -61,7 +65,7 @@ public void equip() {
6165
onEquip();
6266
}
6367

64-
public void clear() {
68+
public /* final */ void clear() {
6569
getPlayer().sendMessage(filterPlaceholders(getCategory().getDeactivateMessage()));
6670

6771
HandlerList.unregisterAll(this);
@@ -74,6 +78,10 @@ public void clear() {
7478
onClear();
7579
}
7680

81+
protected boolean tryEquip() {
82+
return true;
83+
}
84+
7785
@Override
7886
public void run() {
7987
}

core/src/main/java/be/isach/ultracosmetics/cosmetics/emotes/Emote.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package be.isach.ultracosmetics.cosmetics.emotes;
22

33
import be.isach.ultracosmetics.UltraCosmetics;
4+
import be.isach.ultracosmetics.cosmetics.ArmorCosmetic;
45
import be.isach.ultracosmetics.cosmetics.Category;
5-
import be.isach.ultracosmetics.cosmetics.Cosmetic;
6+
import be.isach.ultracosmetics.cosmetics.suits.ArmorSlot;
67
import be.isach.ultracosmetics.cosmetics.type.EmoteType;
78
import be.isach.ultracosmetics.player.UltraPlayer;
89
import org.bukkit.Material;
@@ -17,7 +18,7 @@
1718
* @author iSach
1819
* @since 06-17-2016
1920
*/
20-
public class Emote extends Cosmetic<EmoteType> {
21+
public class Emote extends ArmorCosmetic<EmoteType> {
2122

2223
private EmoteAnimation animation;
2324
private ItemStack itemStack;
@@ -26,19 +27,18 @@ public Emote(UltraPlayer owner, final EmoteType emoteType, UltraCosmetics ultraC
2627
super(ultraCosmetics, Category.EMOTES, owner, emoteType);
2728

2829
this.animation = new EmoteAnimation(getType().getTicksPerFrame(), this);
29-
30-
owner.setCurrentEmote(this);
3130
}
3231

3332
@Override
3433
protected void onEquip() {
3534
animation.start();
35+
getOwner().setCurrentEmote(this);
3636
}
3737

3838
@Override
39-
protected synchronized void onClear() {
39+
protected void onClear() {
4040
animation.stop();
41-
getPlayer().getInventory().setHelmet(null);
41+
getOwner().setCurrentEmote(null);
4242
}
4343

4444
public ItemStack getItemStack() {
@@ -72,4 +72,14 @@ public void onInventoryClick(InventoryCreativeEvent event) {
7272
getPlayer().closeInventory(); // Close the inventory because clicking again results in the event being handled client side
7373
}
7474
}
75+
76+
@Override
77+
protected ArmorSlot getArmorSlot() {
78+
return ArmorSlot.HELMET;
79+
}
80+
81+
@Override
82+
protected String getOccupiedSlotKey() {
83+
return "Emotes.Must-Remove-Helmet";
84+
}
7585
}

core/src/main/java/be/isach/ultracosmetics/cosmetics/hats/Hat.java

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package be.isach.ultracosmetics.cosmetics.hats;
22

33
import be.isach.ultracosmetics.UltraCosmetics;
4-
import be.isach.ultracosmetics.config.MessageManager;
54
import be.isach.ultracosmetics.config.SettingsManager;
5+
import be.isach.ultracosmetics.cosmetics.ArmorCosmetic;
66
import be.isach.ultracosmetics.cosmetics.Category;
7-
import be.isach.ultracosmetics.cosmetics.Cosmetic;
87
import be.isach.ultracosmetics.cosmetics.suits.ArmorSlot;
98
import be.isach.ultracosmetics.cosmetics.type.HatType;
109
import be.isach.ultracosmetics.player.UltraPlayer;
@@ -22,25 +21,14 @@
2221
* @author iSach
2322
* @since 08-23-2016
2423
*/
25-
public class Hat extends Cosmetic<HatType> {
24+
public class Hat extends ArmorCosmetic<HatType> {
2625

2726
public Hat(UltraCosmetics ultraCosmetics, UltraPlayer owner, HatType type) {
2827
super(ultraCosmetics, Category.HATS, owner, type);
2928
}
3029

3130
@Override
3231
protected void onEquip() {
33-
getOwner().removeHat();
34-
getOwner().removeEmote();
35-
getOwner().removeSuit(ArmorSlot.HELMET);
36-
37-
if (getPlayer().getInventory().getHelmet() != null) {
38-
getPlayer().sendMessage(MessageManager.getMessage("Hats.Must-Remove-Hat"));
39-
clear();
40-
return;
41-
}
42-
43-
getPlayer().getInventory().setHelmet(getType().getItemStack());
4432
getOwner().setCurrentHat(this);
4533
}
4634

@@ -81,20 +69,27 @@ && getType().getItemStack() != null
8169
if (event.getAction().name().contains("DROP")
8270
&& SettingsManager.getConfig().getBoolean("Remove-Gadget-With-Drop")) {
8371
clear();
84-
player.closeInventory(); // Close the inventory because clicking again results in the event being handled client side
85-
return;
8672
}
8773
player.closeInventory(); // Close the inventory because clicking again results in the event being handled client side
8874
}
8975
}
9076

9177
@Override
9278
protected void onClear() {
93-
getPlayer().getInventory().setHelmet(null);
9479
getOwner().setCurrentHat(null);
9580
}
9681

9782
public ItemStack getItemStack() {
9883
return getType().getItemStack();
9984
}
85+
86+
@Override
87+
protected ArmorSlot getArmorSlot() {
88+
return ArmorSlot.HELMET;
89+
}
90+
91+
@Override
92+
protected String getOccupiedSlotKey() {
93+
return "Hats.Must-Remove-Hat";
94+
}
10095
}

core/src/main/java/be/isach/ultracosmetics/cosmetics/mounts/Mount.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -69,23 +69,6 @@ public void onEquip() {
6969
getOwner().removeMount();
7070
}
7171

72-
// If the entity is a monster and the world is set to peaceful, we can't spawn it
73-
if ((Monster.class.isAssignableFrom(getType().getEntityType().getEntityClass())
74-
// no idea why Slime doesn't implement Monster but we have to check for it
75-
|| Slime.class.isAssignableFrom(getType().getEntityType().getEntityClass()))
76-
&& getPlayer().getWorld().getDifficulty() == Difficulty.PEACEFUL) {
77-
getOwner().sendMessage(MessageManager.getMessage("Mounts.Cant-Spawn"));
78-
clear();
79-
return;
80-
}
81-
82-
Area area = new Area(getPlayer().getLocation(), 1, 1);
83-
if (!area.isEmpty()) {
84-
getOwner().sendMessage(MessageManager.getMessage("Mounts.Not-Enough-Room"));
85-
clear();
86-
return;
87-
}
88-
8972
EntitySpawningManager.setBypass(true);
9073
entity = spawnEntity();
9174
EntitySpawningManager.setBypass(false);
@@ -111,6 +94,25 @@ && getPlayer().getWorld().getDifficulty() == Difficulty.PEACEFUL) {
11194
mountRegionTask = new MountRegionChecker(getOwner(), getUltraCosmetics()).runTaskTimer(getUltraCosmetics(), 0, 1);
11295
}
11396

97+
@Override
98+
protected boolean tryEquip() {
99+
// If the entity is a monster and the world is set to peaceful, we can't spawn it
100+
if ((Monster.class.isAssignableFrom(getType().getEntityType().getEntityClass())
101+
// no idea why Slime doesn't implement Monster but we have to check for it
102+
|| Slime.class.isAssignableFrom(getType().getEntityType().getEntityClass()))
103+
&& getPlayer().getWorld().getDifficulty() == Difficulty.PEACEFUL) {
104+
getOwner().sendMessage(MessageManager.getMessage("Mounts.Cant-Spawn"));
105+
return false;
106+
}
107+
108+
Area area = new Area(getPlayer().getLocation(), 1, 1);
109+
if (!area.isEmpty()) {
110+
getOwner().sendMessage(MessageManager.getMessage("Mounts.Not-Enough-Room"));
111+
return false;
112+
}
113+
return true;
114+
}
115+
114116
@Override
115117
public void run() {
116118
try {

0 commit comments

Comments
 (0)