Experimental build for client interaction/weapon damage - Needs testing and thread safety, pushed due to time constraints. #368
This commit is contained in:
parent
7591e3537f
commit
a46178b04c
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
if (disguise != null) {
|
||||
// The type of interact, we don't care the difference with "Interact_At" however as it's not useful
|
||||
// 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;
|
||||
final EquipmentSlot handUsed;
|
||||
|
||||
// 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) {
|
||||
if (interactType != EnumWrappers.EntityUseAction.ATTACK &&
|
||||
packet.getHands().read(0) == EnumWrappers.Hand.OFF_HAND) {
|
||||
handUsed = EquipmentSlot.OFF_HAND;
|
||||
} else {
|
||||
handUsed = EquipmentSlot.HAND;
|
||||
}
|
||||
}
|
||||
|
||||
DisguiseInteractEvent selfEvent = new DisguiseInteractEvent((TargetedDisguise) disguise, handUsed,
|
||||
interactType == EnumWrappers.EntityUseAction.ATTACK);
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
|
@ -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())) {
|
||||
|
Loading…
Reference in New Issue
Block a user