Experimental build for client interaction/weapon damage - Needs testing and thread safety, pushed due to time constraints. #368

This commit is contained in:
libraryaddict 2019-06-22 22:06:59 +12:00
parent 7591e3537f
commit a46178b04c
3 changed files with 78 additions and 37 deletions

View File

@ -1826,6 +1826,47 @@ public class DisguiseUtilities {
}
}
public static Disguise getDisguise(Player observer, int entityId) {
// If the entity ID is the same as self disguises id, then it needs to be set to the observers id
if (entityId == DisguiseAPI.getSelfDisguiseId()) {
entityId = observer.getEntityId();
}
// TODO Needs to be thread safe, not thread safe atm due to testing
if (getFutureDisguises().containsKey(entityId)) {
HashSet<TargetedDisguise> hashSet = getFutureDisguises().get(entityId);
for (TargetedDisguise dis : hashSet) {
if (!dis.canSee(observer) || !dis.isDisguiseInUse()) {
continue;
}
return dis;
}
}
for (HashSet<TargetedDisguise> disguises : getDisguises().values()) {
for (TargetedDisguise dis : disguises) {
if (dis.getEntity() == null || !dis.isDisguiseInUse()) {
continue;
}
if (dis.getEntity().getEntityId() != entityId) {
continue;
}
if (!dis.canSee(observer)) {
continue;
}
return dis;
}
}
return null;
}
public static Entity getEntity(World world, int entityId) {
for (Entity e : world.getEntities()) {
if (e.getEntityId() != entityId) {

View File

@ -41,47 +41,54 @@ public class PacketListenerClientInteract extends PacketAdapter {
PacketContainer packet = event.getPacket();
Entity entity = DisguiseUtilities.getEntity(observer.getWorld(), packet.getIntegers().read(0));
final Disguise disguise = DisguiseUtilities.getDisguise(event.getPlayer(), packet.getIntegers().read(0));
if (entity == null) {
if (disguise == null) {
return;
}
if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow ||
entity == observer) {
event.setCancelled(true);
} else if (packet.getIntegers().read(0) == DisguiseAPI.getSelfDisguiseId()) {
if (disguise.getEntity() == observer) {
// If it's a self-interact
event.setCancelled(true);
Disguise disguise = DisguiseAPI.getDisguise(observer, observer);
// The type of interact, we don't care the difference with "Interact_At" however as it's not
// useful
// for self disguises
EnumWrappers.EntityUseAction interactType = packet.getEntityUseActions().read(0);
final EquipmentSlot handUsed;
if (disguise != null) {
// The type of interact, we don't care the difference with "Interact_At" however as it's not useful
// for self disguises
EnumWrappers.EntityUseAction interactType = packet.getEntityUseActions().read(0);
EquipmentSlot handUsed = EquipmentSlot.HAND;
// Attack has a null hand, which throws an error if you attempt to fetch
// If the hand used wasn't their main hand
if (interactType != EnumWrappers.EntityUseAction.ATTACK &&
packet.getHands().read(0) == EnumWrappers.Hand.OFF_HAND) {
handUsed = EquipmentSlot.OFF_HAND;
} else {
handUsed = EquipmentSlot.HAND;
}
// Attack has a null hand, which throws an error if you attempt to fetch
if (interactType != EnumWrappers.EntityUseAction.ATTACK) {
// If the hand used wasn't their main hand
if (packet.getHands().read(0) == EnumWrappers.Hand.OFF_HAND) {
handUsed = EquipmentSlot.OFF_HAND;
}
new BukkitRunnable() {
@Override
public void run() {
// Fire self interact event
DisguiseInteractEvent selfEvent = new DisguiseInteractEvent((TargetedDisguise) disguise, handUsed,
interactType == EnumWrappers.EntityUseAction.ATTACK);
Bukkit.getPluginManager().callEvent(selfEvent);
}
}.runTask(LibsDisguises.getInstance());
} else {
Entity entity = disguise.getEntity();
DisguiseInteractEvent selfEvent = new DisguiseInteractEvent((TargetedDisguise) disguise, handUsed,
interactType == EnumWrappers.EntityUseAction.ATTACK);
new BukkitRunnable() {
@Override
public void run() {
Bukkit.getPluginManager().callEvent(selfEvent);
}
}.runTask(LibsDisguises.getInstance());
if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow) {
event.setCancelled(true);
}
}
if (disguise.getType() != DisguiseType.SHEEP && disguise.getType() != DisguiseType.WOLF) {
return;
}
// If this is something the player can dye the disguise with
for (ItemStack item : new ItemStack[]{observer.getInventory().getItemInMainHand(),
observer.getInventory().getItemInOffHand()}) {
if (item == null) {
@ -94,13 +101,6 @@ public class PacketListenerClientInteract extends PacketAdapter {
continue;
}
Disguise disguise = DisguiseAPI.getDisguise(observer, entity);
if (disguise == null ||
(disguise.getType() != DisguiseType.SHEEP && disguise.getType() != DisguiseType.WOLF)) {
continue;
}
if (disguise.getType() == DisguiseType.SHEEP) {
SheepWatcher watcher = (SheepWatcher) disguise.getWatcher();

View File

@ -249,13 +249,13 @@ public class PacketListenerSounds extends PacketAdapter {
}
// It made a damage animation
Entity entity = DisguiseUtilities.getEntity(observer.getWorld(), event.getPacket().getIntegers().read(0));
Disguise disguise = DisguiseUtilities.getDisguise(observer, event.getPacket().getIntegers().read(0));
if (entity == null) {
if (disguise == null) {
return;
}
Disguise disguise = DisguiseAPI.getDisguise(observer, entity);
Entity entity = disguise.getEntity();
if (disguise != null && !disguise.getType().isPlayer() &&
(disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) {