mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-11-25 20:25:19 +01:00
Rename /npc pose --save to /npc pose --mirror and add /npc pose --save to save the current NPC pose
This commit is contained in:
parent
3bd2f7db8c
commit
324d94a21f
@ -1671,8 +1671,8 @@ public class NPCCommands {
|
|||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
aliases = { "npc" },
|
aliases = { "npc" },
|
||||||
usage = "pose (--save [name] (-d)|--assume [name]|--remove [name]|--default [name]) (-a)",
|
usage = "pose (--save [name] (-d) | --mirror [name] (-d) | --assume [name] | --remove [name] | --default [name]) (-a)",
|
||||||
desc = "Changes/Saves/Lists NPC's head pose(s)",
|
desc = "Manage NPC poses",
|
||||||
flags = "ad",
|
flags = "ad",
|
||||||
modifiers = { "pose" },
|
modifiers = { "pose" },
|
||||||
min = 1,
|
min = 1,
|
||||||
@ -1687,14 +1687,28 @@ public class NPCCommands {
|
|||||||
if (args.getSenderLocation() == null)
|
if (args.getSenderLocation() == null)
|
||||||
throw new ServerCommandException();
|
throw new ServerCommandException();
|
||||||
|
|
||||||
if (trait.addPose(args.getFlag("save"), args.getSenderLocation(), args.hasFlag('d'))) {
|
if (trait.addPose(args.getFlag("save"), npc.getStoredLocation(), args.hasFlag('d'))) {
|
||||||
Messaging.sendTr(sender, Messages.POSE_ADDED);
|
Messaging.sendTr(sender, Messages.POSE_ADDED);
|
||||||
} else
|
} else {
|
||||||
throw new CommandException(Messages.POSE_ALREADY_EXISTS, args.getFlag("save"));
|
throw new CommandException(Messages.POSE_ALREADY_EXISTS, args.getFlag("save"));
|
||||||
|
}
|
||||||
|
} else if (args.hasValueFlag("mirror")) {
|
||||||
|
if (args.getFlag("mirror").isEmpty())
|
||||||
|
throw new CommandException(Messages.INVALID_POSE_NAME);
|
||||||
|
|
||||||
|
if (args.getSenderLocation() == null)
|
||||||
|
throw new ServerCommandException();
|
||||||
|
|
||||||
|
if (trait.addPose(args.getFlag("mirror"), npc.getStoredLocation(), args.hasFlag('d'))) {
|
||||||
|
Messaging.sendTr(sender, Messages.POSE_ADDED);
|
||||||
|
} else {
|
||||||
|
throw new CommandException(Messages.POSE_ALREADY_EXISTS, args.getFlag("mirror"));
|
||||||
|
}
|
||||||
} else if (args.hasValueFlag("default")) {
|
} else if (args.hasValueFlag("default")) {
|
||||||
String pose = args.getFlag("default");
|
String pose = args.getFlag("default");
|
||||||
if (!trait.hasPose(pose))
|
if (!trait.hasPose(pose))
|
||||||
throw new CommandException(Messages.POSE_MISSING, pose);
|
throw new CommandException(Messages.POSE_MISSING, pose);
|
||||||
|
|
||||||
trait.setDefaultPose(pose);
|
trait.setDefaultPose(pose);
|
||||||
Messaging.sendTr(sender, Messages.DEFAULT_POSE_SET, pose);
|
Messaging.sendTr(sender, Messages.DEFAULT_POSE_SET, pose);
|
||||||
} else if (args.hasValueFlag("assume")) {
|
} else if (args.hasValueFlag("assume")) {
|
||||||
@ -1704,6 +1718,7 @@ public class NPCCommands {
|
|||||||
|
|
||||||
if (!trait.hasPose(pose))
|
if (!trait.hasPose(pose))
|
||||||
throw new CommandException(Messages.POSE_MISSING, pose);
|
throw new CommandException(Messages.POSE_MISSING, pose);
|
||||||
|
|
||||||
trait.assumePose(pose);
|
trait.assumePose(pose);
|
||||||
} else if (args.hasValueFlag("remove")) {
|
} else if (args.hasValueFlag("remove")) {
|
||||||
if (args.getFlag("remove").isEmpty())
|
if (args.getFlag("remove").isEmpty())
|
||||||
@ -1720,8 +1735,7 @@ public class NPCCommands {
|
|||||||
return;
|
return;
|
||||||
if (args.getSenderLocation() == null)
|
if (args.getSenderLocation() == null)
|
||||||
throw new ServerCommandException();
|
throw new ServerCommandException();
|
||||||
Location location = args.getSenderLocation();
|
trait.assumePose(args.getSenderLocation());
|
||||||
trait.assumePose(location);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
|
@ -102,6 +102,7 @@ public class LookClose extends Trait implements Toggleable, CommandConfigurable
|
|||||||
min = dist;
|
min = dist;
|
||||||
lookingAt = player;
|
lookingAt = player;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old != lookingAt) {
|
if (old != lookingAt) {
|
||||||
NPCLookCloseChangeTargetEvent event = new NPCLookCloseChangeTargetEvent(npc, old, lookingAt);
|
NPCLookCloseChangeTargetEvent event = new NPCLookCloseChangeTargetEvent(npc, old, lookingAt);
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
@ -132,6 +133,10 @@ public class LookClose extends Trait implements Toggleable, CommandConfigurable
|
|||||||
return lookingAt;
|
return lookingAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isInvisible(Player player) {
|
private boolean isInvisible(Player player) {
|
||||||
return player.getGameMode() == GameMode.SPECTATOR || player.hasPotionEffect(PotionEffectType.INVISIBILITY)
|
return player.getGameMode() == GameMode.SPECTATOR || player.hasPotionEffect(PotionEffectType.INVISIBILITY)
|
||||||
|| isPluginVanished(player) || !canSee(player);
|
|| isPluginVanished(player) || !canSee(player);
|
||||||
@ -218,6 +223,7 @@ public class LookClose extends Trait implements Toggleable, CommandConfigurable
|
|||||||
|
|
||||||
if (lookingAt == null)
|
if (lookingAt == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Util.faceEntity(npc.getEntity(), lookingAt);
|
Util.faceEntity(npc.getEntity(), lookingAt);
|
||||||
if (npc.getEntity().getType().name().equals("SHULKER")) {
|
if (npc.getEntity().getType().name().equals("SHULKER")) {
|
||||||
boolean wasSilent = npc.getEntity().isSilent();
|
boolean wasSilent = npc.getEntity().isSilent();
|
||||||
|
@ -62,7 +62,7 @@ public class Poses extends Trait {
|
|||||||
|
|
||||||
private void assumePose(float yaw, float pitch) {
|
private void assumePose(float yaw, float pitch) {
|
||||||
if (!npc.isSpawned()) {
|
if (!npc.isSpawned()) {
|
||||||
npc.spawn(npc.getOrAddTrait(CurrentLocation.class).getLocation(), SpawnReason.COMMAND);
|
npc.spawn(npc.getStoredLocation(), SpawnReason.COMMAND);
|
||||||
}
|
}
|
||||||
Util.setRotation(npc.getEntity(), yaw, pitch);
|
Util.setRotation(npc.getEntity(), yaw, pitch);
|
||||||
}
|
}
|
||||||
@ -127,12 +127,14 @@ public class Poses extends Trait {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (!hasPose(defaultPose))
|
if (!hasPose(defaultPose) || npc.getNavigator().isNavigating())
|
||||||
|
return;
|
||||||
|
if (npc.hasTrait(LookClose.class)) {
|
||||||
|
LookClose trait = npc.getOrAddTrait(LookClose.class);
|
||||||
|
if (trait.isEnabled() && trait.canSeeTarget())
|
||||||
return;
|
return;
|
||||||
if (!npc.getNavigator().isNavigating()
|
|
||||||
&& (!npc.hasTrait(LookClose.class) || !npc.getOrAddTrait(LookClose.class).canSeeTarget())) {
|
|
||||||
assumePose(defaultPose);
|
|
||||||
}
|
}
|
||||||
|
assumePose(defaultPose);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
95
main/src/main/java/net/citizensnpcs/trait/RotationTrait.java
Normal file
95
main/src/main/java/net/citizensnpcs/trait/RotationTrait.java
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
package net.citizensnpcs.trait;
|
||||||
|
|
||||||
|
import net.citizensnpcs.api.trait.Trait;
|
||||||
|
import net.citizensnpcs.api.trait.TraitName;
|
||||||
|
import net.citizensnpcs.util.NMS;
|
||||||
|
import net.citizensnpcs.util.Util;
|
||||||
|
|
||||||
|
@TraitName("rotationtrait")
|
||||||
|
public class RotationTrait extends Trait {
|
||||||
|
protected boolean rotating;
|
||||||
|
protected double tx;
|
||||||
|
protected double ty;
|
||||||
|
protected double tz;
|
||||||
|
protected float xMaxRotAngle = 10;
|
||||||
|
protected float yMaxRotSpeed = 40;
|
||||||
|
|
||||||
|
public RotationTrait() {
|
||||||
|
super("rotationtrait");
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getEyeY() {
|
||||||
|
return NMS.getHeight(npc.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getX() {
|
||||||
|
return npc.getStoredLocation().getX();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected float getTargetPitchDifference() {
|
||||||
|
double dx = tx - getX();
|
||||||
|
double dy = ty - (getY() + getEyeY());
|
||||||
|
double dz = tz - getZ();
|
||||||
|
double diag = Math.sqrt((float) (dx * dx + dz * dz));
|
||||||
|
return (float) -Math.toDegrees(Math.atan2(dy, diag));
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getY() {
|
||||||
|
return npc.getStoredLocation().getY();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected float getTargetYawDifference() {
|
||||||
|
return (float) Math.toDegrees(Math.atan2(tz - getZ(), tx - getX())) - 90.0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getZ() {
|
||||||
|
return npc.getStoredLocation().getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected float rotateTowards(float target, float current, float maxRotPerTick) {
|
||||||
|
float diff = Util.clamp(current - target);
|
||||||
|
return target + clamp(diff, -maxRotPerTick, maxRotPerTick);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (!npc.isSpawned() || npc.getNavigator().isNavigating()) {
|
||||||
|
// npc.yHeadRot = Mth.rotateIfNecessary(npc.yHeadRot, npc.yBodyRot, 75);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (true) {
|
||||||
|
// npc.setXRot(0.0F);
|
||||||
|
}
|
||||||
|
if (this.rotating) {
|
||||||
|
this.rotating = false;
|
||||||
|
NMS.setHeadYaw(npc.getEntity(),
|
||||||
|
Util.clamp(rotateTowards(NMS.getHeadYaw(npc.getEntity()), getTargetYawDifference(), this.yMaxRotSpeed)));
|
||||||
|
float d = Util.clamp(NMS.getHeadYaw(npc.getEntity()) - 40);
|
||||||
|
if (d > NMS.getYaw(npc.getEntity())) {
|
||||||
|
NMS.setBodyYaw(npc.getEntity(), d);
|
||||||
|
}
|
||||||
|
if (d != NMS.getYaw(npc.getEntity())) {
|
||||||
|
d = NMS.getHeadYaw(npc.getEntity()) + 40;
|
||||||
|
while (d >= 180F) {
|
||||||
|
d -= 360F;
|
||||||
|
}
|
||||||
|
while (d < -180F) {
|
||||||
|
d += 360F;
|
||||||
|
}
|
||||||
|
if (d < NMS.getYaw(npc.getEntity())) {
|
||||||
|
NMS.setBodyYaw(npc.getEntity(), d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NMS.setPitch(npc.getEntity(),
|
||||||
|
rotateTowards(npc.getStoredLocation().getPitch(), getTargetPitchDifference(), this.xMaxRotAngle));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float clamp(float var0, float var1, float var2) {
|
||||||
|
if (var0 < var1) {
|
||||||
|
return var1;
|
||||||
|
} else {
|
||||||
|
return var0 > var2 ? var2 : var0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -553,6 +553,10 @@ public class NMS {
|
|||||||
BRIDGE.setPeekShulker(entity, peek);
|
BRIDGE.setPeekShulker(entity, peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setPitch(Entity entity, float pitch) {
|
||||||
|
BRIDGE.setPitch(entity, pitch);
|
||||||
|
}
|
||||||
|
|
||||||
public static void setPolarBearRearing(Entity entity, boolean rearing) {
|
public static void setPolarBearRearing(Entity entity, boolean rearing) {
|
||||||
BRIDGE.setPolarBearRearing(entity, rearing);
|
BRIDGE.setPolarBearRearing(entity, rearing);
|
||||||
}
|
}
|
||||||
|
@ -155,6 +155,8 @@ public interface NMSBridge {
|
|||||||
|
|
||||||
public void setPeekShulker(Entity entity, int peek);
|
public void setPeekShulker(Entity entity, int peek);
|
||||||
|
|
||||||
|
public void setPitch(Entity entity, float pitch);
|
||||||
|
|
||||||
public void setPolarBearRearing(Entity entity, boolean rearing);
|
public void setPolarBearRearing(Entity entity, boolean rearing);
|
||||||
|
|
||||||
public void setProfile(SkullMeta meta, GameProfile profile);
|
public void setProfile(SkullMeta meta, GameProfile profile);
|
||||||
|
@ -1000,6 +1000,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((EntityPolarBear) getHandle(entity)).p(rearing);
|
((EntityPolarBear) getHandle(entity)).p(rearing);
|
||||||
|
@ -1057,6 +1057,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((EntityPolarBear) getHandle(entity)).p(rearing);
|
((EntityPolarBear) getHandle(entity)).p(rearing);
|
||||||
|
@ -1065,6 +1065,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((EntityPolarBear) getHandle(entity)).p(rearing);
|
((EntityPolarBear) getHandle(entity)).p(rearing);
|
||||||
|
@ -1101,6 +1101,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((EntityPolarBear) getHandle(entity)).s(rearing);
|
((EntityPolarBear) getHandle(entity)).s(rearing);
|
||||||
|
@ -1161,6 +1161,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((EntityPolarBear) getHandle(entity)).r(rearing);
|
((EntityPolarBear) getHandle(entity)).r(rearing);
|
||||||
|
@ -1194,6 +1194,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
((EntityShulker) getHandle(shulker)).a((byte) peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((EntityPolarBear) getHandle(entity)).r(rearing);
|
((EntityPolarBear) getHandle(entity)).r(rearing);
|
||||||
|
@ -1226,6 +1226,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((EntityShulker) getHandle(shulker)).a(peek);
|
((EntityShulker) getHandle(shulker)).a(peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((EntityPolarBear) getHandle(entity)).t(rearing);
|
((EntityPolarBear) getHandle(entity)).t(rearing);
|
||||||
|
@ -1225,6 +1225,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((Shulker) getHandle(shulker)).setRawPeekAmount(peek);
|
((Shulker) getHandle(shulker)).setRawPeekAmount(peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).setXRot(pitch);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((PolarBear) getHandle(entity)).setStanding(rearing);
|
((PolarBear) getHandle(entity)).setStanding(rearing);
|
||||||
|
@ -1232,6 +1232,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
((Shulker) getHandle(shulker)).setRawPeekAmount(peek);
|
((Shulker) getHandle(shulker)).setRawPeekAmount(peek);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).setXRot(pitch);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
((PolarBear) getHandle(entity)).setStanding(rearing);
|
((PolarBear) getHandle(entity)).setStanding(rearing);
|
||||||
|
@ -23,7 +23,6 @@ public class PlayerBodyControl {
|
|||||||
}
|
}
|
||||||
if (e())
|
if (e())
|
||||||
if (Math.abs(this.mob.yHeadRot - this.lastStableYHeadRot) > 15.0F) {
|
if (Math.abs(this.mob.yHeadRot - this.lastStableYHeadRot) > 15.0F) {
|
||||||
System.out.println("BIG DX");
|
|
||||||
this.lastStableYHeadRot = 0;
|
this.lastStableYHeadRot = 0;
|
||||||
this.lastStableYHeadRot = this.mob.yHeadRot;
|
this.lastStableYHeadRot = this.mob.yHeadRot;
|
||||||
rotateBodyIfNecessary();
|
rotateBodyIfNecessary();
|
||||||
|
@ -944,6 +944,11 @@ public class NMSImpl implements NMSBridge {
|
|||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPitch(org.bukkit.entity.Entity entity, float pitch) {
|
||||||
|
getHandle(entity).pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
public void setPolarBearRearing(org.bukkit.entity.Entity entity, boolean rearing) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
Loading…
Reference in New Issue
Block a user