Close #38
Implement making a fox sleep with shift right click with an empty hand
This commit is contained in:
parent
b026691586
commit
90f1c58670
|
@ -17,6 +17,7 @@ Features:
|
||||||
* Foxes follow owner
|
* Foxes follow owner
|
||||||
* You can shift + right-click to let the fox hold items
|
* You can shift + right-click to let the fox hold items
|
||||||
* Right-click to make the fox sit
|
* Right-click to make the fox sit
|
||||||
|
* Shift Right-click with an empty hand to make the fox sleep
|
||||||
* If the fox is holding a totem of undying, the fox will consume it and be reborn.
|
* If the fox is holding a totem of undying, the fox will consume it and be reborn.
|
||||||
* Foxes attack the owner's target
|
* Foxes attack the owner's target
|
||||||
* Foxes attack the thing that attacked the owner.
|
* Foxes attack the thing that attacked the owner.
|
||||||
|
|
5
pom.xml
5
pom.xml
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<groupId>net.seanomik</groupId>
|
<groupId>net.seanomik</groupId>
|
||||||
<artifactId>tamablefoxes</artifactId>
|
<artifactId>tamablefoxes</artifactId>
|
||||||
<version>1.9.1-SNAPSHOT</version>
|
<version>1.9.2-SNAPSHOT</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>Tamablefoxes</name>
|
<name>Tamablefoxes</name>
|
||||||
|
@ -47,8 +47,9 @@
|
||||||
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.2_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.2_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
||||||
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.3_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.3_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
||||||
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.4_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.4_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
||||||
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.5_\plugins\TamableFoxes_v${project.version}.jar</outputFile>
|
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.16.5_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
||||||
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.4_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
<!--<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.4_\plugins\TamableFoxes_v${project.version}.jar</outputFile>-->
|
||||||
|
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_PAPER_1.16.5_\plugins\TamableFoxes_v${project.version}.jar</outputFile>
|
||||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
|
|
@ -6,48 +6,22 @@ import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.lang.invoke.MethodType;
|
//import java.lang.invoke.VarHandle;
|
||||||
import java.lang.invoke.VarHandle;
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
|
|
||||||
public final class FieldHelper {
|
public final class FieldHelper {
|
||||||
|
|
||||||
private static final VarHandle MODIFIERS;
|
|
||||||
|
|
||||||
static {
|
|
||||||
String version = System.getProperty("java.version");
|
|
||||||
if (!version.startsWith("1.8")) {
|
|
||||||
try {
|
|
||||||
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(Field.class, MethodHandles.lookup());
|
|
||||||
MODIFIERS = lookup.findVarHandle(Field.class, "modifiers", int.class);
|
|
||||||
} catch (IllegalAccessException | NoSuchFieldException ex) {
|
|
||||||
throw new RuntimeException(ex);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
MODIFIERS = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void makeNonFinal(Field field) {
|
public static void makeNonFinal(Field field) {
|
||||||
// Check if we're running a supported java version for this new method.
|
try {
|
||||||
if (MODIFIERS == null) {
|
if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) {
|
||||||
try {
|
Field fieldMutable = field.getClass().getDeclaredField("modifiers");
|
||||||
if ((field.getModifiers() & Modifier.FINAL) == Modifier.FINAL) {
|
fieldMutable.setAccessible(true);
|
||||||
Field fieldMutable = field.getClass().getDeclaredField("modifiers");
|
fieldMutable.set(field, fieldMutable.getInt(field) & ~Modifier.FINAL);
|
||||||
fieldMutable.setAccessible(true);
|
fieldMutable.setAccessible(false);
|
||||||
fieldMutable.set(field, fieldMutable.getInt(field) & ~Modifier.FINAL);
|
|
||||||
fieldMutable.setAccessible(false);
|
|
||||||
}
|
|
||||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
|
||||||
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int mods = field.getModifiers();
|
|
||||||
if (Modifier.isFinal(mods)) {
|
|
||||||
MODIFIERS.set(field, mods & ~Modifier.FINAL);
|
|
||||||
}
|
}
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
Bukkit.getServer().getConsoleSender().sendMessage(Utils.getPrefix() + ChatColor.RED + LanguageConfig.getFailureReplace());
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -274,6 +274,7 @@ public class EntityTamableFox extends EntityFox {
|
||||||
|
|
||||||
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
||||||
if (!entityhuman.isSneaking() && (!flag || this.isBaby())) {
|
if (!entityhuman.isSneaking() && (!flag || this.isBaby())) {
|
||||||
|
this.setSleeping(false);
|
||||||
this.goalSit.setSitting(!this.isSitting());
|
this.goalSit.setSitting(!this.isSitting());
|
||||||
return flag;
|
return flag;
|
||||||
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
||||||
|
@ -300,6 +301,11 @@ public class EntityTamableFox extends EntityFox {
|
||||||
|
|
||||||
this.setSlot(EnumItemSlot.MAINHAND, c);
|
this.setSlot(EnumItemSlot.MAINHAND, c);
|
||||||
}
|
}
|
||||||
|
// If the player doesn't have anything in their hand, make the fox sleep or wakeup.
|
||||||
|
else {
|
||||||
|
this.goalSit.setSitting(false);
|
||||||
|
this.setSleeping(!this.isSleeping());
|
||||||
|
}
|
||||||
}, (long) 0.1);
|
}, (long) 0.1);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -273,6 +273,7 @@ public class EntityTamableFox extends EntityFox {
|
||||||
|
|
||||||
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
||||||
if (!entityhuman.isSneaking() && (!flag || this.isBaby())) {
|
if (!entityhuman.isSneaking() && (!flag || this.isBaby())) {
|
||||||
|
this.setSleeping(false);
|
||||||
this.goalSit.setSitting(!this.isSitting());
|
this.goalSit.setSitting(!this.isSitting());
|
||||||
return flag;
|
return flag;
|
||||||
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
||||||
|
@ -299,6 +300,11 @@ public class EntityTamableFox extends EntityFox {
|
||||||
|
|
||||||
this.setSlot(EnumItemSlot.MAINHAND, c);
|
this.setSlot(EnumItemSlot.MAINHAND, c);
|
||||||
}
|
}
|
||||||
|
// If the player doesn't have anything in their hand, make the fox sleep or wakeup.
|
||||||
|
else {
|
||||||
|
this.goalSit.setSitting(false);
|
||||||
|
this.setSleeping(!this.isSleeping());
|
||||||
|
}
|
||||||
}, (long) 0.1);
|
}, (long) 0.1);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -273,6 +273,7 @@ public class EntityTamableFox extends EntityFox {
|
||||||
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
||||||
// @TODO: Do I need to use this.eQ() instead of flag != EnumInteractionResult.SUCCESS?
|
// @TODO: Do I need to use this.eQ() instead of flag != EnumInteractionResult.SUCCESS?
|
||||||
if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.SUCCESS || this.isBaby())) {
|
if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.SUCCESS || this.isBaby())) {
|
||||||
|
this.setSleeping(false);
|
||||||
this.goalSit.setSitting(!this.isSitting());
|
this.goalSit.setSitting(!this.isSitting());
|
||||||
return flag;
|
return flag;
|
||||||
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
||||||
|
@ -301,6 +302,11 @@ public class EntityTamableFox extends EntityFox {
|
||||||
|
|
||||||
this.setSlot(EnumItemSlot.MAINHAND, c);
|
this.setSlot(EnumItemSlot.MAINHAND, c);
|
||||||
}
|
}
|
||||||
|
// If the player doesn't have anything in their hand, make the fox sleep or wakeup.
|
||||||
|
else {
|
||||||
|
this.goalSit.setSitting(false);
|
||||||
|
this.setSleeping(!this.isSleeping());
|
||||||
|
}
|
||||||
}, (long) 0.1);
|
}, (long) 0.1);
|
||||||
|
|
||||||
return EnumInteractionResult.SUCCESS;
|
return EnumInteractionResult.SUCCESS;
|
||||||
|
|
|
@ -270,6 +270,7 @@ public class EntityTamableFox extends EntityFox {
|
||||||
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
||||||
// @TODO: Do I need to use this.eQ() instead of flag != EnumInteractionResult.SUCCESS?
|
// @TODO: Do I need to use this.eQ() instead of flag != EnumInteractionResult.SUCCESS?
|
||||||
if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.SUCCESS || this.isBaby())) {
|
if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.SUCCESS || this.isBaby())) {
|
||||||
|
this.setSleeping(false);
|
||||||
this.goalSit.setSitting(!this.isSitting());
|
this.goalSit.setSitting(!this.isSitting());
|
||||||
return flag;
|
return flag;
|
||||||
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
} else if (entityhuman.isSneaking()) { // Swap/Put/Take item from fox.
|
||||||
|
@ -298,6 +299,11 @@ public class EntityTamableFox extends EntityFox {
|
||||||
|
|
||||||
this.setSlot(EnumItemSlot.MAINHAND, c);
|
this.setSlot(EnumItemSlot.MAINHAND, c);
|
||||||
}
|
}
|
||||||
|
// If the player doesn't have anything in their hand, make the fox sleep or wakeup.
|
||||||
|
else {
|
||||||
|
this.goalSit.setSitting(false);
|
||||||
|
this.setSleeping(!this.isSleeping());
|
||||||
|
}
|
||||||
}, (long) 0.1);
|
}, (long) 0.1);
|
||||||
|
|
||||||
return EnumInteractionResult.SUCCESS;
|
return EnumInteractionResult.SUCCESS;
|
||||||
|
|
|
@ -270,6 +270,7 @@ public class EntityTamableFox extends EntityFox {
|
||||||
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
// If the player is not sneaking and the fox cannot breed, then make the fox sit.
|
||||||
// @TODO: Do I need to use this.eQ() instead of flag != EnumInteractionResult.SUCCESS?
|
// @TODO: Do I need to use this.eQ() instead of flag != EnumInteractionResult.SUCCESS?
|
||||||
if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.SUCCESS || this.isBaby())) {
|
if (!entityhuman.isSneaking() && (flag != EnumInteractionResult.SUCCESS || this.isBaby())) {
|
||||||
|
this.setSleeping(false);
|
||||||
this.goalSit.setSitting(!this.isSitting());
|
this.goalSit.setSitting(!this.isSitting());
|
||||||
return flag;
|
return flag;
|
||||||
} else if (entityhuman.isSneaking() && enumhand == EnumHand.MAIN_HAND) { // Swap/Put/Take item from fox.
|
} else if (entityhuman.isSneaking() && enumhand == EnumHand.MAIN_HAND) { // Swap/Put/Take item from fox.
|
||||||
|
@ -278,6 +279,7 @@ public class EntityTamableFox extends EntityFox {
|
||||||
return EnumInteractionResult.PASS;
|
return EnumInteractionResult.PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if the player has something in their main hand.
|
||||||
if (!this.getEquipment(EnumItemSlot.MAINHAND).isEmpty()) {
|
if (!this.getEquipment(EnumItemSlot.MAINHAND).isEmpty()) {
|
||||||
getBukkitEntity().getWorld().dropItem(getBukkitEntity().getLocation(), CraftItemStack.asBukkitCopy(this.getEquipment(EnumItemSlot.MAINHAND)));
|
getBukkitEntity().getWorld().dropItem(getBukkitEntity().getLocation(), CraftItemStack.asBukkitCopy(this.getEquipment(EnumItemSlot.MAINHAND)));
|
||||||
this.setSlot(EnumItemSlot.MAINHAND, new ItemStack(Items.AIR));
|
this.setSlot(EnumItemSlot.MAINHAND, new ItemStack(Items.AIR));
|
||||||
|
@ -298,6 +300,11 @@ public class EntityTamableFox extends EntityFox {
|
||||||
|
|
||||||
this.setSlot(EnumItemSlot.MAINHAND, c);
|
this.setSlot(EnumItemSlot.MAINHAND, c);
|
||||||
}
|
}
|
||||||
|
// If the player doesn't have anything in their hand, make the fox sleep or wakeup.
|
||||||
|
else {
|
||||||
|
this.goalSit.setSitting(false);
|
||||||
|
this.setSleeping(!this.isSleeping());
|
||||||
|
}
|
||||||
}, (long) 0.1);
|
}, (long) 0.1);
|
||||||
|
|
||||||
return EnumInteractionResult.SUCCESS;
|
return EnumInteractionResult.SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue