Remove public watcher constructor and construct it internally
This commit is contained in:
parent
0ae9a0a77a
commit
18d97c0077
@ -38,6 +38,28 @@ public class Disguise {
|
|||||||
protected Disguise(DisguiseType newType, boolean doSounds) {
|
protected Disguise(DisguiseType newType, boolean doSounds) {
|
||||||
disguiseType = newType;
|
disguiseType = newType;
|
||||||
replaceSounds = doSounds;
|
replaceSounds = doSounds;
|
||||||
|
try {
|
||||||
|
setWatcher((FlagWatcher) getType().getWatcherClass().getConstructor(Disguise.class).newInstance(this));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (this instanceof MobDisguise && !((MobDisguise) this).isAdult()) {
|
||||||
|
if (getWatcher() instanceof AgeableWatcher)
|
||||||
|
getWatcher().setValue(12, -24000);
|
||||||
|
else if (getWatcher() instanceof ZombieWatcher)
|
||||||
|
getWatcher().setValue(12, (byte) 1);
|
||||||
|
}
|
||||||
|
if (getType() == DisguiseType.WITHER_SKELETON)
|
||||||
|
getWatcher().setValue(13, (byte) 1);
|
||||||
|
else if (getType() == DisguiseType.ZOMBIE_VILLAGER)
|
||||||
|
getWatcher().setValue(13, (byte) 1);
|
||||||
|
else
|
||||||
|
try {
|
||||||
|
Variant horseType = Variant.valueOf(getType().name());
|
||||||
|
getWatcher().setValue(19, (byte) horseType.ordinal());
|
||||||
|
} catch (Exception ex) {
|
||||||
|
// Ok.. So it aint a horse
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Disguise clone() {
|
public Disguise clone() {
|
||||||
@ -45,32 +67,16 @@ public class Disguise {
|
|||||||
return disguise;
|
return disguise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Deprecated No longer does anything. Watcher is constructed at the same time as disguise.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public void constructWatcher(Class<? extends org.bukkit.entity.Entity> entityClass) {
|
public void constructWatcher(Class<? extends org.bukkit.entity.Entity> entityClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupWatcher(Class<? extends org.bukkit.entity.Entity> entityClass) {
|
||||||
if (getWatcher() != null)
|
if (getWatcher() != null)
|
||||||
throw new RuntimeException("The watcher has already been constructed! Try .clone()");
|
throw new RuntimeException("The watcher has already been constructed! Try .clone()");
|
||||||
FlagWatcher tempWatcher = null;
|
|
||||||
try {
|
|
||||||
tempWatcher = (FlagWatcher) getType().getWatcherClass().getConstructor(Disguise.class).newInstance(this);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
if (this instanceof MobDisguise && !((MobDisguise) this).isAdult()) {
|
|
||||||
if (tempWatcher instanceof AgeableWatcher)
|
|
||||||
tempWatcher.setValue(12, -24000);
|
|
||||||
else if (tempWatcher instanceof ZombieWatcher)
|
|
||||||
tempWatcher.setValue(12, (byte) 1);
|
|
||||||
}
|
|
||||||
if (getType() == DisguiseType.WITHER_SKELETON)
|
|
||||||
tempWatcher.setValue(13, (byte) 1);
|
|
||||||
else if (getType() == DisguiseType.ZOMBIE_VILLAGER)
|
|
||||||
tempWatcher.setValue(13, (byte) 1);
|
|
||||||
else
|
|
||||||
try {
|
|
||||||
Variant horseType = Variant.valueOf(getType().name());
|
|
||||||
tempWatcher.setValue(19, (byte) horseType.ordinal());
|
|
||||||
} catch (Exception ex) {
|
|
||||||
// Ok.. So it aint a horse
|
|
||||||
}
|
|
||||||
Class disguiseClass = Values.getEntityClass(getType());
|
Class disguiseClass = Values.getEntityClass(getType());
|
||||||
HashMap<Integer, Object> disguiseValues = Values.getMetaValues(getType());
|
HashMap<Integer, Object> disguiseValues = Values.getMetaValues(getType());
|
||||||
EntityType entityType = null;
|
EntityType entityType = null;
|
||||||
@ -84,10 +90,10 @@ public class Disguise {
|
|||||||
// Start from 2 as they ALL share 0 and 1
|
// Start from 2 as they ALL share 0 and 1
|
||||||
for (int dataNo = 2; dataNo <= 31; dataNo++) {
|
for (int dataNo = 2; dataNo <= 31; dataNo++) {
|
||||||
// If the watcher already set a metadata on this
|
// If the watcher already set a metadata on this
|
||||||
if (tempWatcher.getValue(dataNo, null) != null) {
|
if (getWatcher().getValue(dataNo, null) != null) {
|
||||||
// Better check that the value is stable.
|
// Better check that the value is stable.
|
||||||
if (disguiseValues.containsKey(dataNo)
|
if (disguiseValues.containsKey(dataNo)
|
||||||
&& tempWatcher.getValue(dataNo, null).getClass() == disguiseValues.get(dataNo).getClass()) {
|
&& getWatcher().getValue(dataNo, null).getClass() == disguiseValues.get(dataNo).getClass()) {
|
||||||
// The classes are the same. The client "shouldn't" crash.
|
// The classes are the same. The client "shouldn't" crash.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -97,19 +103,19 @@ public class Disguise {
|
|||||||
continue;
|
continue;
|
||||||
// If the disguise has this, but not the entity. Then better set it!
|
// If the disguise has this, but not the entity. Then better set it!
|
||||||
if (!entityValues.containsKey(dataNo) && disguiseValues.containsKey(dataNo)) {
|
if (!entityValues.containsKey(dataNo) && disguiseValues.containsKey(dataNo)) {
|
||||||
tempWatcher.setValue(dataNo, disguiseValues.get(dataNo));
|
getWatcher().setValue(dataNo, disguiseValues.get(dataNo));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Else if the disguise doesn't have it. But the entity does. Better remove it!
|
// Else if the disguise doesn't have it. But the entity does. Better remove it!
|
||||||
if (entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) {
|
if (entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) {
|
||||||
tempWatcher.setValue(dataNo, null);
|
getWatcher().setValue(dataNo, null);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Hmm. They both have the datavalue. Time to check if they have different default values!
|
// Hmm. They both have the datavalue. Time to check if they have different default values!
|
||||||
if (entityValues.get(dataNo) != disguiseValues.get(dataNo)
|
if (entityValues.get(dataNo) != disguiseValues.get(dataNo)
|
||||||
|| !entityValues.get(dataNo).equals(disguiseValues.get(dataNo))) {
|
|| !entityValues.get(dataNo).equals(disguiseValues.get(dataNo))) {
|
||||||
// They do! Set the default value!
|
// They do! Set the default value!
|
||||||
tempWatcher.setValue(dataNo, disguiseValues.get(dataNo));
|
getWatcher().setValue(dataNo, disguiseValues.get(dataNo));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Hmm. They both now have data values which are exactly the same. I need to do more intensive background checks.
|
// Hmm. They both now have data values which are exactly the same. I need to do more intensive background checks.
|
||||||
@ -150,9 +156,8 @@ public class Disguise {
|
|||||||
continue;
|
continue;
|
||||||
// Well I can't find a reason I should leave it alone. They will probably conflict.
|
// Well I can't find a reason I should leave it alone. They will probably conflict.
|
||||||
// Time to set the value to the disguises value so no conflicts!
|
// Time to set the value to the disguises value so no conflicts!
|
||||||
tempWatcher.setValue(dataNo, disguiseValues.get(dataNo));
|
getWatcher().setValue(dataNo, disguiseValues.get(dataNo));
|
||||||
}
|
}
|
||||||
watcher = tempWatcher;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean equals(Disguise disguise) {
|
public boolean equals(Disguise disguise) {
|
||||||
@ -211,10 +216,9 @@ public class Disguise {
|
|||||||
if (this.entity != null)
|
if (this.entity != null)
|
||||||
throw new RuntimeException("This disguise is already in use! Try .clone()");
|
throw new RuntimeException("This disguise is already in use! Try .clone()");
|
||||||
if (getWatcher() == null)
|
if (getWatcher() == null)
|
||||||
constructWatcher(entity.getClass());
|
setupWatcher(entity.getClass());
|
||||||
this.entity = entity;
|
this.entity = entity;
|
||||||
double fallSpeed = 0.0050;
|
double fallSpeed = 0.0050;
|
||||||
boolean doesntMove = false;
|
|
||||||
boolean movement = false;
|
boolean movement = false;
|
||||||
switch (getType()) {
|
switch (getType()) {
|
||||||
case ARROW:
|
case ARROW:
|
||||||
@ -233,7 +237,7 @@ public class Disguise {
|
|||||||
case PAINTING:
|
case PAINTING:
|
||||||
case PLAYER:
|
case PLAYER:
|
||||||
case SQUID:
|
case SQUID:
|
||||||
doesntMove = true;
|
fallSpeed = 0;
|
||||||
break;
|
break;
|
||||||
case DROPPED_ITEM:
|
case DROPPED_ITEM:
|
||||||
case EXPERIENCE_ORB:
|
case EXPERIENCE_ORB:
|
||||||
@ -268,7 +272,6 @@ public class Disguise {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
final boolean sendMovementPacket = movement;
|
final boolean sendMovementPacket = movement;
|
||||||
final boolean sendVector = !doesntMove;
|
|
||||||
final double vectorY = fallSpeed;
|
final double vectorY = fallSpeed;
|
||||||
// A scheduler to clean up any unused disguises.
|
// A scheduler to clean up any unused disguises.
|
||||||
runnable = new BukkitRunnable() {
|
runnable = new BukkitRunnable() {
|
||||||
@ -287,7 +290,7 @@ public class Disguise {
|
|||||||
ProtocolLibrary.getProtocolManager().updateEntity(getEntity(), players);
|
ProtocolLibrary.getProtocolManager().updateEntity(getEntity(), players);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sendVector && DisguiseAPI.isVelocitySent() && !entity.isOnGround()) {
|
if (vectorY != 0 && DisguiseAPI.isVelocitySent() && !entity.isOnGround()) {
|
||||||
Vector vector = entity.getVelocity();
|
Vector vector = entity.getVelocity();
|
||||||
if (vector.getY() != 0)
|
if (vector.getY() != 0)
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user