Search in sources :

Example 16 with ICPlayer

use of com.loohp.interactivechat.objectholders.ICPlayer in project InteractiveChat by LOOHP.

the class BungeeMessageListener method onPluginMessageReceived.

@SuppressWarnings("deprecation")
@Override
public void onPluginMessageReceived(String channel, Player pluginMessagingPlayer, byte[] bytes) {
    if (!channel.equals("interchat:main")) {
        return;
    }
    ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
    int packetNumber = in.readInt();
    int packetId = in.readShort();
    boolean isEnding = in.readBoolean();
    byte[] data = new byte[bytes.length - 7];
    in.readFully(data);
    byte[] chain = incoming.remove(packetNumber);
    if (chain != null) {
        ByteBuffer buff = ByteBuffer.allocate(chain.length + data.length);
        buff.put(chain);
        buff.put(data);
        data = buff.array();
    }
    if (!isEnding) {
        incoming.put(packetNumber, data);
        return;
    }
    try {
        ByteArrayDataInput input = ByteStreams.newDataInput(data);
        switch(packetId) {
            case 0x00:
                int playerAmount = input.readInt();
                Set<UUID> localUUID = Bukkit.getOnlinePlayers().stream().map(each -> each.getUniqueId()).collect(Collectors.toSet());
                Set<UUID> current = new HashSet<>(ICPlayerFactory.getRemoteUUIDs());
                Set<UUID> newSet = new HashSet<>();
                for (int i = 0; i < playerAmount; i++) {
                    String server = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                    UUID uuid = DataTypeIO.readUUID(input);
                    String name = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                    ICPlayer player = ICPlayerFactory.getICPlayer(uuid);
                    if (player != null) {
                        if (!player.getRemoteServer().equals(server)) {
                            player.setRemoteServer(server);
                        }
                    }
                    if (!localUUID.contains(uuid) && !ICPlayerFactory.getRemoteUUIDs().contains(uuid)) {
                        ICPlayerFactory.createOrUpdateRemoteICPlayer(server, name, uuid, true, 0, 0, Bukkit.createInventory(null, 45), Bukkit.createInventory(null, 36));
                    }
                    newSet.add(uuid);
                }
                current.removeAll(newSet);
                for (UUID uuid : current) {
                    ICPlayerFactory.removeRemoteICPlayer(uuid);
                }
                for (UUID uuid : localUUID) {
                    ICPlayerFactory.removeRemoteICPlayer(uuid);
                }
                break;
            case 0x01:
                int delay = input.readInt();
                short itemStackScheme = input.readShort();
                short inventoryScheme = input.readShort();
                InteractiveChat.remoteDelay = delay;
                BungeeMessageSender.itemStackScheme = itemStackScheme;
                BungeeMessageSender.inventoryScheme = inventoryScheme;
                break;
            case 0x02:
                UUID sender = DataTypeIO.readUUID(input);
                UUID receiver = DataTypeIO.readUUID(input);
                InteractiveChat.mentionPair.add(new MentionPair(sender, receiver));
                break;
            case 0x03:
                UUID uuid = DataTypeIO.readUUID(input);
                ICPlayer player = ICPlayerFactory.getICPlayer(uuid);
                if (player == null) {
                    break;
                }
                boolean rightHanded = input.readBoolean();
                player.setRemoteRightHanded(rightHanded);
                int selectedSlot = input.readByte();
                player.setRemoteSelectedSlot(selectedSlot);
                int level = input.readInt();
                player.setRemoteExperienceLevel(level);
                int size = input.readByte();
                ItemStack[] equipment = new ItemStack[size];
                for (int i = 0; i < equipment.length; i++) {
                    equipment[i] = DataTypeIO.readItemStack(input, StandardCharsets.UTF_8);
                }
                player.getEquipment().setHelmet(equipment[0]);
                player.getEquipment().setChestplate(equipment[1]);
                player.getEquipment().setLeggings(equipment[2]);
                player.getEquipment().setBoots(equipment[3]);
                if (InteractiveChat.version.isOld()) {
                    player.getEquipment().setItemInHand(equipment[4]);
                } else {
                    player.getEquipment().setItemInMainHand(equipment[4]);
                    player.getEquipment().setItemInOffHand(equipment[5]);
                }
                break;
            case 0x04:
                UUID uuid1 = DataTypeIO.readUUID(input);
                ICPlayer player1 = ICPlayerFactory.getICPlayer(uuid1);
                if (player1 == null) {
                    break;
                }
                boolean rightHanded1 = input.readBoolean();
                player1.setRemoteRightHanded(rightHanded1);
                int selectedSlot1 = input.readByte();
                player1.setRemoteSelectedSlot(selectedSlot1);
                int level1 = input.readInt();
                player1.setRemoteExperienceLevel(level1);
                int type = input.readByte();
                if (type == 0) {
                    player1.setRemoteInventory(DataTypeIO.readInventory(input, StandardCharsets.UTF_8));
                } else {
                    player1.setRemoteEnderChest(DataTypeIO.readInventory(input, StandardCharsets.UTF_8));
                }
                break;
            case 0x05:
                UUID uuid2 = DataTypeIO.readUUID(input);
                ICPlayer player2 = ICPlayerFactory.getICPlayer(uuid2);
                if (player2 == null) {
                    break;
                }
                int size1 = input.readInt();
                for (int i = 0; i < size1; i++) {
                    String placeholder = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                    String text = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                    player2.getRemotePlaceholdersMapping().put(placeholder, text);
                }
                break;
            case 0x06:
                String message = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                UUID uuid3 = DataTypeIO.readUUID(input);
                ICPlayer player3 = ICPlayerFactory.getICPlayer(uuid3);
                if (player3 == null) {
                    break;
                }
                InteractiveChat.messages.put(message, uuid3);
                Bukkit.getScheduler().runTaskLater(InteractiveChat.plugin, () -> InteractiveChat.messages.remove(message), 60);
                break;
            case 0x07:
                int cooldownType = input.readByte();
                switch(cooldownType) {
                    case 0:
                        UUID uuid4 = DataTypeIO.readUUID(input);
                        long time = input.readLong();
                        InteractiveChat.placeholderCooldownManager.setPlayerUniversalLastTimestampRaw(uuid4, time);
                        break;
                    case 1:
                        uuid4 = DataTypeIO.readUUID(input);
                        UUID internalId = DataTypeIO.readUUID(input);
                        time = input.readLong();
                        Optional<ICPlaceholder> optPlaceholder = InteractiveChat.placeholderList.values().stream().filter(each -> each.getInternalId().equals(internalId)).findFirst();
                        if (optPlaceholder.isPresent()) {
                            InteractiveChat.placeholderCooldownManager.setPlayerPlaceholderLastTimestampRaw(uuid4, optPlaceholder.get(), time);
                        }
                        break;
                }
                break;
            case 0x08:
                UUID messageId = DataTypeIO.readUUID(input);
                UUID uuid5 = DataTypeIO.readUUID(input);
                Player bukkitplayer1 = Bukkit.getPlayer(uuid5);
                if (bukkitplayer1 == null) {
                    break;
                }
                String component = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                Bukkit.getScheduler().runTaskAsynchronously(InteractiveChat.plugin, () -> {
                    try {
                        String processed = ProcessExternalMessage.processAndRespond(bukkitplayer1, component);
                        BungeeMessageSender.respondProcessedMessage(System.currentTimeMillis(), processed, messageId);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
                break;
            case 0x09:
                String server = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                int size2 = input.readInt();
                List<ICPlaceholder> list = new ArrayList<>(size2);
                for (int i = 0; i < size2; i++) {
                    boolean isBulitIn = input.readBoolean();
                    if (isBulitIn) {
                        String keyword = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        String name = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        String description = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        String permission = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        long cooldown = input.readLong();
                        list.add(new BuiltInPlaceholder(Pattern.compile(keyword), name, description, permission, cooldown));
                    } else {
                        int customNo = input.readInt();
                        ParsePlayer parseplayer = ParsePlayer.fromOrder(input.readByte());
                        String placeholder = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        boolean parseKeyword = input.readBoolean();
                        long cooldown = input.readLong();
                        boolean hoverEnabled = input.readBoolean();
                        String hoverText = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        boolean clickEnabled = input.readBoolean();
                        String clickAction = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        String clickValue = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        boolean replaceEnabled = input.readBoolean();
                        String replaceText = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        String name = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        String description = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                        list.add(new CustomPlaceholder(customNo, parseplayer, Pattern.compile(placeholder), parseKeyword, cooldown, new CustomPlaceholderHoverEvent(hoverEnabled, hoverText), new CustomPlaceholderClickEvent(clickEnabled, clickEnabled ? ClickEventAction.valueOf(clickAction) : null, clickValue), new CustomPlaceholderReplaceText(replaceEnabled, replaceText), name, description));
                    }
                }
                InteractiveChat.remotePlaceholderList.put(server, list);
                break;
            case 0x0A:
                BungeeMessageSender.resetAndForwardPlaceholderList(System.currentTimeMillis(), InteractiveChat.placeholderList.values());
                break;
            case 0x0B:
                int id = input.readInt();
                UUID playerUUID = DataTypeIO.readUUID(input);
                String permission = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                Player player5 = Bukkit.getPlayer(playerUUID);
                BungeeMessageSender.permissionCheckResponse(System.currentTimeMillis(), id, player5 != null && player5.hasPermission(permission));
                break;
            case 0x0D:
                UUID playerUUID1 = DataTypeIO.readUUID(input);
                PlayerData pd = InteractiveChat.playerDataManager.getPlayerData(playerUUID1);
                if (pd != null) {
                    pd.reload();
                }
                break;
            case 0x0E:
                SharedType sharedType = SharedType.fromValue(input.readByte());
                String sha1 = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                Inventory inventory = DataTypeIO.readInventory(input, StandardCharsets.UTF_8);
                InteractiveChatAPI.addInventoryToItemShareList(sharedType, sha1, inventory);
                break;
            case 0x0F:
                int requestType = input.readByte();
                UUID playerUUID2 = DataTypeIO.readUUID(input);
                Player player6 = Bukkit.getPlayer(playerUUID2);
                if (player6 != null) {
                    ICPlayer player7 = ICPlayerFactory.getICPlayer(player6);
                    switch(requestType) {
                        case 0:
                            BungeeMessageSender.forwardInventory(System.currentTimeMillis(), player7.getUniqueId(), player7.isRightHanded(), player7.getSelectedSlot(), player7.getExperienceLevel(), null, player7.getInventory());
                            break;
                        case 1:
                            BungeeMessageSender.forwardEnderchest(System.currentTimeMillis(), player7.getUniqueId(), player7.isRightHanded(), player7.getSelectedSlot(), player7.getExperienceLevel(), null, player7.getEnderChest());
                            break;
                    }
                }
                break;
            case 0x10:
                UUID requestUUID = DataTypeIO.readUUID(input);
                int requestType2 = input.readByte();
                // noinspection SwitchStatementWithTooFewBranches
                switch(requestType2) {
                    case 0:
                        List<ValueTrios<UUID, String, Integer>> playerlist = new ArrayList<>();
                        int playerListSize = input.readInt();
                        for (int i = 0; i < playerListSize; i++) {
                            playerlist.add(new ValueTrios<>(DataTypeIO.readUUID(input), DataTypeIO.readString(input, StandardCharsets.UTF_8), input.readInt()));
                        }
                        @SuppressWarnings("unchecked") CompletableFuture<List<ValueTrios<UUID, String, Integer>>> future = (CompletableFuture<List<ValueTrios<UUID, String, Integer>>>) toComplete.remove(requestUUID);
                        if (future != null) {
                            future.complete(playerlist);
                        }
                        break;
                    default:
                        break;
                }
                break;
            case 0x11:
                UUID playerUUID3 = DataTypeIO.readUUID(input);
                int nicknameSize = input.readInt();
                Set<String> remoteNicknames = new HashSet<>();
                for (int i = 0; i < nicknameSize; i++) {
                    remoteNicknames.add(DataTypeIO.readString(input, StandardCharsets.UTF_8));
                }
                ICPlayer icPlayer = ICPlayerFactory.getICPlayer(playerUUID3);
                if (icPlayer != null) {
                    icPlayer.setRemoteNicknames(remoteNicknames);
                }
                break;
            case 0x12:
                UUID playerUUID4 = DataTypeIO.readUUID(input);
                String placeholders = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                ICPlayer icPlayer1 = ICPlayerFactory.getICPlayer(playerUUID4);
                if (icPlayer1 != null && icPlayer1.isLocal()) {
                    PlaceholderParser.parse(icPlayer1, placeholders);
                }
                break;
            case 0xFF:
                String customChannel = DataTypeIO.readString(input, StandardCharsets.UTF_8);
                int dataLength = input.readInt();
                byte[] customData = new byte[dataLength];
                input.readFully(customData);
                ProxyCustomDataRecievedEvent dataEvent = new ProxyCustomDataRecievedEvent(customChannel, customData);
                Bukkit.getPluginManager().callEvent(dataEvent);
                break;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Also used : CustomPlaceholder(com.loohp.interactivechat.objectholders.CustomPlaceholder) InteractiveChatAPI(com.loohp.interactivechat.api.InteractiveChatAPI) PlayerData(com.loohp.interactivechat.data.PlayerDataManager.PlayerData) DataTypeIO(com.loohp.interactivechat.utils.DataTypeIO) TimeoutException(java.util.concurrent.TimeoutException) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) BuiltInPlaceholder(com.loohp.interactivechat.objectholders.BuiltInPlaceholder) Player(org.bukkit.entity.Player) ParsePlayer(com.loohp.interactivechat.objectholders.CustomPlaceholder.ParsePlayer) Inventory(org.bukkit.inventory.Inventory) ByteBuffer(java.nio.ByteBuffer) CustomPlaceholderReplaceText(com.loohp.interactivechat.objectholders.CustomPlaceholder.CustomPlaceholderReplaceText) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) PluginMessageListener(org.bukkit.plugin.messaging.PluginMessageListener) ProcessExternalMessage(com.loohp.interactivechat.modules.ProcessExternalMessage) Map(java.util.Map) ByteArrayDataInput(com.google.common.io.ByteArrayDataInput) MentionPair(com.loohp.interactivechat.objectholders.MentionPair) SharedType(com.loohp.interactivechat.api.InteractiveChatAPI.SharedType) ICPlaceholder(com.loohp.interactivechat.objectholders.ICPlaceholder) Bukkit(org.bukkit.Bukkit) ProxyCustomDataRecievedEvent(com.loohp.interactivechat.api.events.ProxyCustomDataRecievedEvent) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) UUID(java.util.UUID) Collectors(java.util.stream.Collectors) StandardCharsets(java.nio.charset.StandardCharsets) ItemStack(org.bukkit.inventory.ItemStack) InteractiveChat(com.loohp.interactivechat.InteractiveChat) List(java.util.List) ValueTrios(com.loohp.interactivechat.objectholders.ValueTrios) ClickEventAction(com.loohp.interactivechat.objectholders.CustomPlaceholder.ClickEventAction) CustomPlaceholderHoverEvent(com.loohp.interactivechat.objectholders.CustomPlaceholder.CustomPlaceholderHoverEvent) ICPlayerFactory(com.loohp.interactivechat.objectholders.ICPlayerFactory) ByteStreams(com.google.common.io.ByteStreams) Optional(java.util.Optional) Pattern(java.util.regex.Pattern) CustomPlaceholderClickEvent(com.loohp.interactivechat.objectholders.CustomPlaceholder.CustomPlaceholderClickEvent) PlaceholderParser(com.loohp.interactivechat.utils.PlaceholderParser) ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) CustomPlaceholderHoverEvent(com.loohp.interactivechat.objectholders.CustomPlaceholder.CustomPlaceholderHoverEvent) ArrayList(java.util.ArrayList) CustomPlaceholderReplaceText(com.loohp.interactivechat.objectholders.CustomPlaceholder.CustomPlaceholderReplaceText) CompletableFuture(java.util.concurrent.CompletableFuture) ICPlaceholder(com.loohp.interactivechat.objectholders.ICPlaceholder) CustomPlaceholder(com.loohp.interactivechat.objectholders.CustomPlaceholder) ArrayList(java.util.ArrayList) List(java.util.List) UUID(java.util.UUID) HashSet(java.util.HashSet) Player(org.bukkit.entity.Player) ParsePlayer(com.loohp.interactivechat.objectholders.CustomPlaceholder.ParsePlayer) ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) ProxyCustomDataRecievedEvent(com.loohp.interactivechat.api.events.ProxyCustomDataRecievedEvent) SharedType(com.loohp.interactivechat.api.InteractiveChatAPI.SharedType) CustomPlaceholderClickEvent(com.loohp.interactivechat.objectholders.CustomPlaceholder.CustomPlaceholderClickEvent) ByteArrayDataInput(com.google.common.io.ByteArrayDataInput) ByteBuffer(java.nio.ByteBuffer) TimeoutException(java.util.concurrent.TimeoutException) ParsePlayer(com.loohp.interactivechat.objectholders.CustomPlaceholder.ParsePlayer) BuiltInPlaceholder(com.loohp.interactivechat.objectholders.BuiltInPlaceholder) MentionPair(com.loohp.interactivechat.objectholders.MentionPair) ItemStack(org.bukkit.inventory.ItemStack) PlayerData(com.loohp.interactivechat.data.PlayerDataManager.PlayerData) Inventory(org.bukkit.inventory.Inventory) ValueTrios(com.loohp.interactivechat.objectholders.ValueTrios)

Example 17 with ICPlayer

use of com.loohp.interactivechat.objectholders.ICPlayer in project InteractiveChat-DiscordSRV-Addon by LOOHP.

the class ImageGeneration method getFullBodyImage.

private static BufferedImage getFullBodyImage(OfflineICPlayer player, ItemStack helmet, ItemStack chestplate, ItemStack leggings, ItemStack boots) throws IOException {
    InteractiveChatDiscordSrvAddon.plugin.imageCounter.incrementAndGet();
    Debug.debug("ImageGeneration creating puppet image of " + player.getName());
    BufferedImage skin = null;
    boolean slim = false;
    BufferedImage cape;
    try {
        JSONObject json;
        ICPlayer icPlayer = player.getPlayer();
        if (icPlayer != null && icPlayer.isLocal()) {
            json = (JSONObject) new JSONParser().parse(SkinUtils.getSkinJsonFromProfile(((ICPlayer) player).getLocalPlayer()));
        } else {
            json = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(((JSONObject) ((JSONArray) HTTPRequestUtils.getJSONResponse(PLAYER_INFO_URL.replace("%s", player.getUniqueId().toString())).get("properties")).get(0)).get("value").toString())));
        }
        if (json == null) {
            cape = null;
        } else {
            try {
                if (((JSONObject) json.get("textures")).containsKey("CAPE")) {
                    String url = (String) ((JSONObject) ((JSONObject) json.get("textures")).get("CAPE")).get("url");
                    Cache<?> cache = Cache.getCache(player.getUniqueId().toString() + url + PLAYER_CAPE_CACHE_KEY);
                    if (cache == null) {
                        cape = ImageUtils.downloadImage(url);
                        Cache.putCache(player.getUniqueId().toString() + url + PLAYER_CAPE_CACHE_KEY, cape, InteractiveChatDiscordSrvAddon.plugin.cacheTimeout);
                    } else {
                        cape = (BufferedImage) cache.getObject();
                    }
                } else {
                    String url = OPTIFINE_CAPE_URL.replaceAll("%s", CustomStringUtils.escapeReplaceAllMetaCharacters(player.getName()));
                    Cache<?> cache = Cache.getCache(player.getUniqueId().toString() + url + PLAYER_CAPE_CACHE_KEY);
                    if (cache == null) {
                        try {
                            cape = ImageUtils.downloadImage(url);
                            Cache.putCache(player.getUniqueId().toString() + url + PLAYER_CAPE_CACHE_KEY, cape, InteractiveChatDiscordSrvAddon.plugin.cacheTimeout);
                        } catch (Throwable ignore) {
                            cape = null;
                        }
                    } else {
                        cape = (BufferedImage) cache.getObject();
                    }
                }
            } catch (Throwable e) {
                cape = null;
            }
            try {
                String value = (String) ((JSONObject) ((JSONObject) json.get("textures")).get("SKIN")).get("url");
                if (((JSONObject) ((JSONObject) json.get("textures")).get("SKIN")).containsKey("metadata")) {
                    slim = ((JSONObject) ((JSONObject) ((JSONObject) json.get("textures")).get("SKIN")).get("metadata")).get("model").toString().equals("slim");
                }
                Cache<?> cache = Cache.getCache(player.getUniqueId().toString() + value + PLAYER_SKIN_CACHE_KEY);
                if (cache == null) {
                    skin = ImageUtils.downloadImage(value);
                    Cache.putCache(player.getUniqueId().toString() + value + PLAYER_SKIN_CACHE_KEY, skin, InteractiveChatDiscordSrvAddon.plugin.cacheTimeout);
                } else {
                    skin = (BufferedImage) cache.getObject();
                }
                skin = ImageUtils.copyImage(skin);
            } catch (Throwable e1) {
            }
        }
    } catch (Exception e) {
        cape = null;
    }
    if (skin == null) {
        if (slim) {
            skin = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ENTITY_TEXTURE_LOCATION + "alex").getTexture();
        } else {
            skin = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ENTITY_TEXTURE_LOCATION + "steve").getTexture();
        }
    }
    BufferedImage elytraImage = null;
    BufferedImage image = new BufferedImage(556, 748, BufferedImage.TYPE_INT_ARGB);
    Map<String, TextureResource> providedTextures = new HashMap<>();
    Map<PlayerModelItemPosition, PlayerModelItem> modelItems = new HashMap<>();
    providedTextures.put(ResourceRegistry.SKIN_FULL_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(ModelUtils.convertToModernSkinTexture(skin)));
    if (ItemStackUtils.isWearable(leggings)) {
        XMaterial type = XMaterialUtils.matchXMaterial(leggings);
        BufferedImage leggingsImage = null;
        switch(type) {
            case LEATHER_LEGGINGS:
                leggingsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_2").getTexture();
                LeatherArmorMeta meta = (LeatherArmorMeta) leggings.getItemMeta();
                Color color = new Color(meta.getColor().asRGB());
                BufferedImage armorOverlay = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_2_overlay").getTexture();
                BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(leggingsImage), color);
                leggingsImage = ImageUtils.multiply(leggingsImage, colorOverlay);
                Graphics2D g2 = leggingsImage.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
                g2.drawImage(armorOverlay, 0, 0, null);
                g2.dispose();
                break;
            case CHAINMAIL_LEGGINGS:
                leggingsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "chainmail_layer_2").getTexture();
                break;
            case GOLDEN_LEGGINGS:
                leggingsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "gold_layer_2").getTexture();
                break;
            case IRON_LEGGINGS:
                leggingsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "iron_layer_2").getTexture();
                break;
            case DIAMOND_LEGGINGS:
                leggingsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "diamond_layer_2").getTexture();
                break;
            case NETHERITE_LEGGINGS:
                leggingsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "netherite_layer_2").getTexture();
                break;
            default:
                break;
        }
        if (leggingsImage != null) {
            if (leggings.getEnchantments().size() > 0) {
                leggingsImage = getEnchantedImage(leggingsImage);
            }
            providedTextures.put(ResourceRegistry.LEGGINGS_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(leggingsImage));
        }
    }
    if (ItemStackUtils.isWearable(boots)) {
        XMaterial type = XMaterialUtils.matchXMaterial(boots);
        BufferedImage bootsImage = null;
        switch(type) {
            case LEATHER_BOOTS:
                bootsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_1").getTexture();
                LeatherArmorMeta meta = (LeatherArmorMeta) boots.getItemMeta();
                Color color = new Color(meta.getColor().asRGB());
                BufferedImage armorOverlay = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_1_overlay").getTexture();
                BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(bootsImage), color);
                bootsImage = ImageUtils.multiply(bootsImage, colorOverlay);
                Graphics2D g2 = bootsImage.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
                g2.drawImage(armorOverlay, 0, 0, null);
                g2.dispose();
                break;
            case CHAINMAIL_BOOTS:
                bootsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "chainmail_layer_1").getTexture();
                break;
            case GOLDEN_BOOTS:
                bootsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "gold_layer_1").getTexture();
                break;
            case IRON_BOOTS:
                bootsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "iron_layer_1").getTexture();
                break;
            case DIAMOND_BOOTS:
                bootsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "diamond_layer_1").getTexture();
                break;
            case NETHERITE_BOOTS:
                bootsImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "netherite_layer_1").getTexture();
                break;
            default:
                break;
        }
        if (bootsImage != null) {
            if (boots.getEnchantments().size() > 0) {
                bootsImage = getEnchantedImage(bootsImage);
            }
            providedTextures.put(ResourceRegistry.BOOTS_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(bootsImage));
        }
    }
    if (ItemStackUtils.isWearable(chestplate)) {
        XMaterial type = XMaterialUtils.matchXMaterial(chestplate);
        BufferedImage chestplateImage = null;
        boolean isArmor = true;
        switch(type) {
            case LEATHER_CHESTPLATE:
                chestplateImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_1").getTexture();
                LeatherArmorMeta meta = (LeatherArmorMeta) chestplate.getItemMeta();
                Color color = new Color(meta.getColor().asRGB());
                BufferedImage armorOverlay = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_1_overlay").getTexture();
                BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(chestplateImage), color);
                chestplateImage = ImageUtils.multiply(chestplateImage, colorOverlay);
                Graphics2D g2 = chestplateImage.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
                g2.drawImage(armorOverlay, 0, 0, null);
                g2.dispose();
                break;
            case CHAINMAIL_CHESTPLATE:
                chestplateImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "chainmail_layer_1").getTexture();
                break;
            case GOLDEN_CHESTPLATE:
                chestplateImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "gold_layer_1").getTexture();
                break;
            case IRON_CHESTPLATE:
                chestplateImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "iron_layer_1").getTexture();
                break;
            case DIAMOND_CHESTPLATE:
                chestplateImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "diamond_layer_1").getTexture();
                break;
            case NETHERITE_CHESTPLATE:
                chestplateImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "netherite_layer_1").getTexture();
                break;
            case ELYTRA:
                isArmor = false;
                chestplateImage = new BufferedImage(150, 150, BufferedImage.TYPE_INT_ARGB);
                BufferedImage wing = cape == null ? resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ENTITY_TEXTURE_LOCATION + "elytra").getTexture() : cape;
                if (wing.getWidth() % 64 != 0 || wing.getHeight() % 32 != 0) {
                    int w = 0;
                    int h = 0;
                    while (w < wing.getWidth()) {
                        w += 64;
                        h += 32;
                    }
                    BufferedImage resize = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
                    Graphics2D g3 = resize.createGraphics();
                    g3.drawImage(wing, 0, 0, null);
                    g3.dispose();
                    wing = resize;
                }
                int scale = wing.getWidth() / 64;
                wing = ImageUtils.copyAndGetSubImage(wing, 34 * scale, 2 * scale, 12 * scale, 20 * scale);
                wing = ImageUtils.multiply(ImageUtils.resizeImage(wing, Math.pow(scale, -1) * 3.75), 0.7);
                BufferedImage leftWing = ImageUtils.rotateImageByDegrees(wing, 23.41);
                Graphics2D g3 = chestplateImage.createGraphics();
                g3.drawImage(leftWing, 0, 0, null);
                wing = ImageUtils.flipHorizontal(wing);
                BufferedImage rightWing = ImageUtils.rotateImageByDegrees(wing, 360.0 - 23.41);
                g3.drawImage(rightWing, 26, 0, null);
                g3.dispose();
                if (chestplate.getEnchantments().size() > 0) {
                    chestplateImage = getEnchantedImage(chestplateImage);
                }
                elytraImage = chestplateImage;
            default:
                break;
        }
        if (isArmor && chestplateImage != null) {
            if (chestplate.getEnchantments().size() > 0) {
                chestplateImage = getEnchantedImage(chestplateImage);
            }
            providedTextures.put(ResourceRegistry.CHESTPLATE_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(chestplateImage));
        }
    }
    if (helmet != null && !helmet.getType().equals(Material.AIR)) {
        XMaterial type = XMaterialUtils.matchXMaterial(helmet);
        BufferedImage helmetImage = null;
        boolean isArmor = true;
        switch(type) {
            case LEATHER_HELMET:
                helmetImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_1").getTexture();
                LeatherArmorMeta meta = (LeatherArmorMeta) helmet.getItemMeta();
                Color color = new Color(meta.getColor().asRGB());
                BufferedImage armorOverlay = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "leather_layer_1_overlay").getTexture();
                BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(helmetImage), color);
                helmetImage = ImageUtils.multiply(helmetImage, colorOverlay);
                Graphics2D g2 = helmetImage.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
                g2.drawImage(armorOverlay, 0, 0, null);
                g2.dispose();
                break;
            case CHAINMAIL_HELMET:
                helmetImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "chainmail_layer_1").getTexture();
                break;
            case GOLDEN_HELMET:
                helmetImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "gold_layer_1").getTexture();
                break;
            case IRON_HELMET:
                helmetImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "iron_layer_1").getTexture();
                break;
            case DIAMOND_HELMET:
                helmetImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "diamond_layer_1").getTexture();
                break;
            case NETHERITE_HELMET:
                helmetImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "netherite_layer_1").getTexture();
                break;
            case TURTLE_HELMET:
                helmetImage = resourceManager.get().getTextureManager().getTexture(ResourceRegistry.ARMOR_TEXTURE_LOCATION + "turtle_layer_1").getTexture();
                break;
            default:
                isArmor = false;
                String key = ModelUtils.getItemModelKey(type);
                ItemStackProcessResult itemProcessResult = ItemRenderUtils.processItemForRendering(player, helmet);
                boolean enchanted = itemProcessResult.requiresEnchantmentGlint();
                Map<ModelOverrideType, Float> predicate = itemProcessResult.getPredicates();
                String modelKey = itemProcessResult.getDirectLocation() == null ? ResourceRegistry.ITEM_MODEL_LOCATION + key : itemProcessResult.getDirectLocation();
                Map<String, TextureResource> itemProvidedTextures = itemProcessResult.getProvidedTextures();
                TintIndexData tintIndexData = itemProcessResult.getTintIndexData();
                modelItems.put(PlayerModelItemPosition.HELMET, new PlayerModelItem(PlayerModelItemPosition.HELMET, modelKey, predicate, enchanted, itemProvidedTextures, tintIndexData));
                break;
        }
        if (isArmor) {
            if (helmet.getEnchantments().size() > 0) {
                helmetImage = getEnchantedImage(helmetImage);
            }
            providedTextures.put(ResourceRegistry.HELMET_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(helmetImage));
        }
    }
    if (InteractiveChatDiscordSrvAddon.plugin.renderHandHeldItems) {
        ItemStack rightHand = player.isRightHanded() ? player.getMainHandItem() : player.getOffHandItem();
        if (rightHand != null) {
            String key = ModelUtils.getItemModelKey(XMaterialUtils.matchXMaterial(rightHand));
            ItemStackProcessResult itemProcessResult = ItemRenderUtils.processItemForRendering(player, rightHand);
            boolean enchanted = itemProcessResult.requiresEnchantmentGlint();
            Map<ModelOverrideType, Float> predicate = itemProcessResult.getPredicates();
            String modelKey = itemProcessResult.getDirectLocation() == null ? ResourceRegistry.ITEM_MODEL_LOCATION + key : itemProcessResult.getDirectLocation();
            Map<String, TextureResource> itemProvidedTextures = itemProcessResult.getProvidedTextures();
            TintIndexData tintIndexData = itemProcessResult.getTintIndexData();
            modelItems.put(PlayerModelItemPosition.RIGHT_HAND, new PlayerModelItem(PlayerModelItemPosition.RIGHT_HAND, modelKey, predicate, enchanted, itemProvidedTextures, tintIndexData));
        }
        ItemStack leftHand = player.isRightHanded() ? player.getOffHandItem() : player.getMainHandItem();
        if (leftHand != null) {
            String key = ModelUtils.getItemModelKey(XMaterialUtils.matchXMaterial(leftHand));
            ItemStackProcessResult itemProcessResult = ItemRenderUtils.processItemForRendering(player, leftHand);
            boolean enchanted = itemProcessResult.requiresEnchantmentGlint();
            Map<ModelOverrideType, Float> predicate = itemProcessResult.getPredicates();
            String modelKey = itemProcessResult.getDirectLocation() == null ? ResourceRegistry.ITEM_MODEL_LOCATION + key : itemProcessResult.getDirectLocation();
            Map<String, TextureResource> itemProvidedTextures = itemProcessResult.getProvidedTextures();
            TintIndexData tintIndexData = itemProcessResult.getTintIndexData();
            modelItems.put(PlayerModelItemPosition.LEFT_HAND, new PlayerModelItem(PlayerModelItemPosition.LEFT_HAND, modelKey, predicate, enchanted, itemProvidedTextures, tintIndexData));
        }
    }
    boolean upsideDown = ModelUtils.isRenderedUpsideDown(player.getName(), cape != null);
    RenderResult renderResult = InteractiveChatDiscordSrvAddon.plugin.modelRenderer.renderPlayer(image.getWidth(), image.getHeight(), resourceManager.get(), version.get().isOld(), slim, providedTextures, TintIndexData.EMPTY_INSTANCE, modelItems);
    Graphics2D g = image.createGraphics();
    BufferedImage resizedImage = ImageUtils.resizeImageAbs(renderResult.getImage(), 117, 159);
    if (upsideDown) {
        resizedImage = ImageUtils.rotateImageByDegrees(resizedImage, 180);
    }
    g.drawImage(resizedImage, -1, 12, null);
    g.dispose();
    if (elytraImage != null) {
        BufferedImage resizedElytraImage = ImageUtils.resizeImage(elytraImage, 0.9);
        if (upsideDown) {
            resizedElytraImage = ImageUtils.rotateImageByDegrees(resizedElytraImage, 180);
        }
        ImageUtils.drawTransparent(image, resizedElytraImage, 14, 75);
    }
    return image;
}
Also used : TextureResource(com.loohp.interactivechatdiscordsrvaddon.resources.textures.TextureResource) GeneratedTextureResource(com.loohp.interactivechatdiscordsrvaddon.resources.textures.GeneratedTextureResource) ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) OfflineICPlayer(com.loohp.interactivechat.objectholders.OfflineICPlayer) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ItemStackProcessResult(com.loohp.interactivechatdiscordsrvaddon.utils.ItemRenderUtils.ItemStackProcessResult) RenderResult(com.loohp.interactivechatdiscordsrvaddon.resources.ModelRenderer.RenderResult) BufferedImage(java.awt.image.BufferedImage) PlayerModelItemPosition(com.loohp.interactivechatdiscordsrvaddon.resources.ModelRenderer.PlayerModelItemPosition) PlayerModelItem(com.loohp.interactivechatdiscordsrvaddon.resources.ModelRenderer.PlayerModelItem) ModelOverrideType(com.loohp.interactivechatdiscordsrvaddon.resources.models.ModelOverride.ModelOverrideType) Color(java.awt.Color) TextColor(com.loohp.interactivechat.libs.net.kyori.adventure.text.format.TextColor) NamedTextColor(com.loohp.interactivechat.libs.net.kyori.adventure.text.format.NamedTextColor) GeneratedTextureResource(com.loohp.interactivechatdiscordsrvaddon.resources.textures.GeneratedTextureResource) XMaterial(com.loohp.interactivechat.libs.com.cryptomorin.xseries.XMaterial) IOException(java.io.IOException) TintIndexData(com.loohp.interactivechatdiscordsrvaddon.utils.TintUtils.TintIndexData) Graphics2D(java.awt.Graphics2D) JSONObject(com.loohp.interactivechat.libs.org.json.simple.JSONObject) LeatherArmorMeta(org.bukkit.inventory.meta.LeatherArmorMeta) JSONParser(com.loohp.interactivechat.libs.org.json.simple.parser.JSONParser) ItemStack(org.bukkit.inventory.ItemStack)

Example 18 with ICPlayer

use of com.loohp.interactivechat.objectholders.ICPlayer in project InteractiveChat-DiscordSRV-Addon by LOOHP.

the class ItemRenderUtils method processItemForRendering.

public static ItemStackProcessResult processItemForRendering(OfflineICPlayer player, ItemStack item) throws IOException {
    boolean requiresEnchantmentGlint = false;
    XMaterial xMaterial = XMaterialUtils.matchXMaterial(item);
    String directLocation = null;
    if (xMaterial.equals(XMaterial.DEBUG_STICK)) {
        requiresEnchantmentGlint = true;
    } else if (xMaterial.equals(XMaterial.ENCHANTED_GOLDEN_APPLE)) {
        requiresEnchantmentGlint = true;
    } else if (xMaterial.equals(XMaterial.WRITTEN_BOOK)) {
        requiresEnchantmentGlint = true;
    } else if (xMaterial.equals(XMaterial.ENCHANTED_BOOK)) {
        requiresEnchantmentGlint = true;
    } else if (item.getEnchantments().size() > 0) {
        requiresEnchantmentGlint = true;
    }
    TintIndexData tintIndexData = TintUtils.getTintData(xMaterial);
    Map<ModelOverrideType, Float> predicates = new EnumMap<>(ModelOverrideType.class);
    Map<String, TextureResource> providedTextures = new HashMap<>();
    if (NBTEditor.contains(item, "CustomModelData")) {
        int customModelData = NBTEditor.getInt(item, "CustomModelData");
        predicates.put(ModelOverrideType.CUSTOM_MODEL_DATA, (float) customModelData);
    }
    if (xMaterial.equals(XMaterial.CHEST) || xMaterial.equals(XMaterial.TRAPPED_CHEST)) {
        LocalDate time = LocalDate.now();
        if (time.getMonth().equals(Month.DECEMBER) && (time.getDayOfMonth() == 24 || time.getDayOfMonth() == 25 || time.getDayOfMonth() == 26)) {
            directLocation = ResourceRegistry.BUILTIN_ENTITY_MODEL_LOCATION + "christmas_chest";
        }
    } else if (xMaterial.isOneOf(Arrays.asList("CONTAINS:banner"))) {
        BannerAssetResult bannerAsset = BannerGraphics.generateBannerAssets(item);
        providedTextures.put(ResourceRegistry.BANNER_BASE_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(bannerAsset.getBase()));
        providedTextures.put(ResourceRegistry.BANNER_PATTERNS_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(bannerAsset.getPatterns()));
    } else if (xMaterial.equals(XMaterial.SHIELD)) {
        BannerAssetResult shieldAsset = BannerGraphics.generateShieldAssets(item);
        providedTextures.put(ResourceRegistry.SHIELD_BASE_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(shieldAsset.getBase()));
        providedTextures.put(ResourceRegistry.SHIELD_PATTERNS_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(shieldAsset.getPatterns()));
    } else if (xMaterial.equals(XMaterial.PLAYER_HEAD)) {
        BufferedImage skinImage = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ENTITY_TEXTURE_LOCATION + "steve").getTexture();
        try {
            String base64 = SkinUtils.getSkinValue(item.getItemMeta());
            if (base64 != null) {
                JSONObject json = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(base64)));
                String value = (String) ((JSONObject) ((JSONObject) json.get("textures")).get("SKIN")).get("url");
                skinImage = ImageUtils.downloadImage(value);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        providedTextures.put(ResourceRegistry.SKIN_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(ModelUtils.convertToModernSkinTexture(skinImage)));
    } else if (xMaterial.equals(XMaterial.ELYTRA)) {
        int durability = item.getType().getMaxDurability() - (InteractiveChat.version.isLegacy() ? item.getDurability() : ((Damageable) item.getItemMeta()).getDamage());
        if (durability <= 1) {
            predicates.put(ModelOverrideType.BROKEN, 1F);
        }
    } else if (xMaterial.equals(XMaterial.CROSSBOW)) {
        CrossbowMeta meta = (CrossbowMeta) item.getItemMeta();
        List<ItemStack> charged = meta.getChargedProjectiles();
        if (charged != null && !charged.isEmpty()) {
            predicates.put(ModelOverrideType.CHARGED, 1F);
            ItemStack charge = charged.get(0);
            XMaterial chargeType = XMaterialUtils.matchXMaterial(charge);
            if (chargeType.equals(XMaterial.FIREWORK_ROCKET)) {
                predicates.put(ModelOverrideType.FIREWORK, 1F);
            }
        }
    } else if (xMaterial.equals(XMaterial.CLOCK)) {
        ICPlayer onlinePlayer = player.getPlayer();
        long time = ((onlinePlayer != null && onlinePlayer.isLocal() ? ((ICPlayer) player).getLocalPlayer().getPlayerTime() : Bukkit.getWorlds().get(0).getTime()) % 24000) - 6000;
        if (time < 0) {
            time += 24000;
        }
        double timePhase = (double) time / 24000;
        predicates.put(ModelOverrideType.TIME, (float) (timePhase - 0.0078125));
    } else if (xMaterial.equals(XMaterial.COMPASS)) {
        double angle;
        ICPlayer icplayer = player.getPlayer();
        if (icplayer != null && icplayer.isLocal()) {
            if (InteractiveChat.version.isNewerOrEqualTo(MCVersion.V1_16)) {
                CompassMeta meta = (CompassMeta) item.getItemMeta();
                Location target;
                if (meta.hasLodestone()) {
                    Location lodestone = meta.getLodestone();
                    target = new Location(lodestone.getWorld(), lodestone.getBlockX() + 0.5, lodestone.getBlockY(), lodestone.getBlockZ() + 0.5, lodestone.getYaw(), lodestone.getPitch());
                    requiresEnchantmentGlint = true;
                } else if (icplayer.getLocalPlayer().getWorld().getEnvironment().equals(Environment.NORMAL)) {
                    Location spawn = icplayer.getLocalPlayer().getWorld().getSpawnLocation();
                    target = new Location(spawn.getWorld(), spawn.getBlockX() + 0.5, spawn.getBlockY(), spawn.getBlockZ() + 0.5, spawn.getYaw(), spawn.getPitch());
                } else {
                    target = null;
                }
                if (target != null && target.getWorld().equals(icplayer.getLocalPlayer().getWorld())) {
                    Location playerLocation = icplayer.getLocalPlayer().getEyeLocation();
                    playerLocation.setPitch(0);
                    Vector looking = playerLocation.getDirection();
                    Vector pointing = target.toVector().subtract(playerLocation.toVector());
                    pointing.setY(0);
                    double degree = VectorUtils.getBearing(looking, pointing);
                    if (degree < 0) {
                        degree += 360;
                    }
                    angle = degree / 360;
                } else {
                    angle = RANDOM.nextDouble();
                }
            } else {
                if (icplayer.getLocalPlayer().getWorld().getEnvironment().equals(Environment.NORMAL)) {
                    Location spawn = icplayer.getLocalPlayer().getWorld().getSpawnLocation();
                    Location target = new Location(spawn.getWorld(), spawn.getBlockX() + 0.5, spawn.getBlockY(), spawn.getBlockZ() + 0.5, spawn.getYaw(), spawn.getPitch());
                    Location playerLocation = icplayer.getLocalPlayer().getEyeLocation();
                    playerLocation.setPitch(0);
                    Vector looking = playerLocation.getDirection();
                    Vector pointing = target.toVector().subtract(playerLocation.toVector());
                    pointing.setY(0);
                    double degree = VectorUtils.getBearing(looking, pointing);
                    if (degree < 0) {
                        degree += 360;
                    }
                    angle = degree / 360;
                } else {
                    angle = RANDOM.nextDouble();
                }
            }
        } else {
            if (InteractiveChat.version.isNewerOrEqualTo(MCVersion.V1_16)) {
                CompassMeta meta = (CompassMeta) item.getItemMeta();
                if (meta.hasLodestone()) {
                    requiresEnchantmentGlint = true;
                }
            }
            angle = 0;
        }
        predicates.put(ModelOverrideType.ANGLE, (float) (angle - 0.015625));
    } else if (xMaterial.equals(XMaterial.LIGHT)) {
        int level = 15;
        Object blockStateObj = item.getItemMeta().serialize().get("BlockStateTag");
        if (blockStateObj != null && blockStateObj instanceof Map) {
            Object levelObj = ((Map<?, Object>) blockStateObj).get("level");
            if (levelObj != null) {
                try {
                    level = Integer.parseInt(levelObj.toString().replace("i", ""));
                } catch (NumberFormatException e) {
                }
            }
        }
        predicates.put(ModelOverrideType.LEVEL, (float) level / 16F);
    } else if (item.getItemMeta() instanceof LeatherArmorMeta) {
        LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
        Color color = new Color(meta.getColor().asRGB());
        if (xMaterial.equals(XMaterial.LEATHER_HORSE_ARMOR)) {
            BufferedImage itemImage = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ITEM_TEXTURE_LOCATION + xMaterial.name().toLowerCase()).getTexture(32, 32);
            BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(itemImage), color);
            itemImage = ImageUtils.multiply(itemImage, colorOverlay);
            providedTextures.put(ResourceRegistry.LEATHER_HORSE_ARMOR_PLACEHOLDER, new GeneratedTextureResource(itemImage));
        } else {
            BufferedImage itemImage = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ITEM_TEXTURE_LOCATION + xMaterial.name().toLowerCase()).getTexture(32, 32);
            BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(itemImage), color);
            itemImage = ImageUtils.multiply(itemImage, colorOverlay);
            if (xMaterial.name().contains("HELMET")) {
                providedTextures.put(ResourceRegistry.LEATHER_HELMET_PLACEHOLDER, new GeneratedTextureResource(itemImage));
            } else if (xMaterial.name().contains("CHESTPLATE")) {
                providedTextures.put(ResourceRegistry.LEATHER_CHESTPLATE_PLACEHOLDER, new GeneratedTextureResource(itemImage));
            } else if (xMaterial.name().contains("LEGGINGS")) {
                providedTextures.put(ResourceRegistry.LEATHER_LEGGINGS_PLACEHOLDER, new GeneratedTextureResource(itemImage));
            } else if (xMaterial.name().contains("BOOTS")) {
                providedTextures.put(ResourceRegistry.LEATHER_BOOTS_PLACEHOLDER, new GeneratedTextureResource(itemImage));
            }
        }
    } else if (item.getItemMeta() instanceof PotionMeta) {
        if (xMaterial.equals(XMaterial.TIPPED_ARROW)) {
            PotionMeta meta = (PotionMeta) item.getItemMeta();
            PotionType potiontype = InteractiveChat.version.isOld() ? Potion.fromItemStack(item).getType() : meta.getBasePotionData().getType();
            BufferedImage tippedArrowHead = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ITEM_TEXTURE_LOCATION + "tipped_arrow_head").getTexture(32, 32);
            int color;
            try {
                if (meta.hasColor()) {
                    color = meta.getColor().asRGB();
                } else {
                    color = PotionUtils.getPotionBaseColor(potiontype);
                }
            } catch (Throwable e) {
                color = PotionUtils.getPotionBaseColor(PotionType.WATER);
            }
            BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(tippedArrowHead), color);
            tippedArrowHead = ImageUtils.multiply(tippedArrowHead, colorOverlay);
            providedTextures.put(ResourceRegistry.TIPPED_ARROW_HEAD_PLACEHOLDER, new GeneratedTextureResource(tippedArrowHead));
        } else {
            PotionMeta meta = (PotionMeta) item.getItemMeta();
            PotionType potiontype = InteractiveChat.version.isOld() ? Potion.fromItemStack(item).getType() : meta.getBasePotionData().getType();
            BufferedImage potionOverlay = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ITEM_TEXTURE_LOCATION + "potion_overlay").getTexture(32, 32);
            int color;
            try {
                if (meta.hasColor()) {
                    color = meta.getColor().asRGB();
                } else {
                    color = PotionUtils.getPotionBaseColor(potiontype);
                }
            } catch (Throwable e) {
                color = PotionUtils.getPotionBaseColor(PotionType.WATER);
            }
            BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(potionOverlay), color);
            potionOverlay = ImageUtils.multiply(potionOverlay, colorOverlay);
            providedTextures.put(ResourceRegistry.POTION_OVERLAY_PLACEHOLDER, new GeneratedTextureResource(potionOverlay));
            if (potiontype != null) {
                if (!(potiontype.name().equals("WATER") || potiontype.name().equals("AWKWARD") || potiontype.name().equals("MUNDANE") || potiontype.name().equals("THICK") || potiontype.name().equals("UNCRAFTABLE"))) {
                    requiresEnchantmentGlint = true;
                }
            }
        }
    } else if (xMaterial.isOneOf(Arrays.asList("CONTAINS:spawn_egg"))) {
        SpawnEggTintData tintData = TintUtils.getSpawnEggTint(xMaterial);
        if (tintData != null) {
            BufferedImage baseImage = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ITEM_TEXTURE_LOCATION + "spawn_egg").getTexture();
            BufferedImage overlayImage = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ITEM_TEXTURE_LOCATION + "spawn_egg_overlay").getTexture(baseImage.getWidth(), baseImage.getHeight());
            BufferedImage colorBase = ImageUtils.changeColorTo(ImageUtils.copyImage(baseImage), tintData.getBase());
            BufferedImage colorOverlay = ImageUtils.changeColorTo(ImageUtils.copyImage(overlayImage), tintData.getOverlay());
            baseImage = ImageUtils.multiply(baseImage, colorBase);
            overlayImage = ImageUtils.multiply(overlayImage, colorOverlay);
            providedTextures.put(ResourceRegistry.SPAWN_EGG_PLACEHOLDER, new GeneratedTextureResource(baseImage));
            providedTextures.put(ResourceRegistry.SPAWN_EGG_OVERLAY_PLACEHOLDER, new GeneratedTextureResource(overlayImage));
        }
    } else if (InteractiveChat.version.isLegacy() && xMaterial.isOneOf(Arrays.asList("CONTAINS:bed"))) {
        String colorName = xMaterial.name().replace("_BED", "").toLowerCase();
        BufferedImage bedTexture = InteractiveChatDiscordSrvAddon.plugin.resourceManager.getTextureManager().getTexture(ResourceRegistry.ENTITY_TEXTURE_LOCATION + "bed/" + colorName).getTexture();
        providedTextures.put(ResourceRegistry.LEGACY_BED_TEXTURE_PLACEHOLDER, new GeneratedTextureResource(bedTexture));
    }
    return new ItemStackProcessResult(requiresEnchantmentGlint, predicates, providedTextures, tintIndexData, directLocation);
}
Also used : GeneratedTextureResource(com.loohp.interactivechatdiscordsrvaddon.resources.textures.GeneratedTextureResource) TextureResource(com.loohp.interactivechatdiscordsrvaddon.resources.textures.TextureResource) ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) OfflineICPlayer(com.loohp.interactivechat.objectholders.OfflineICPlayer) HashMap(java.util.HashMap) LocalDate(java.time.LocalDate) BufferedImage(java.awt.image.BufferedImage) BannerAssetResult(com.loohp.interactivechatdiscordsrvaddon.graphics.BannerGraphics.BannerAssetResult) List(java.util.List) CompassMeta(org.bukkit.inventory.meta.CompassMeta) ModelOverrideType(com.loohp.interactivechatdiscordsrvaddon.resources.models.ModelOverride.ModelOverrideType) EnumMap(java.util.EnumMap) Vector(org.bukkit.util.Vector) SpawnEggTintData(com.loohp.interactivechatdiscordsrvaddon.utils.TintUtils.SpawnEggTintData) CrossbowMeta(org.bukkit.inventory.meta.CrossbowMeta) Color(java.awt.Color) GeneratedTextureResource(com.loohp.interactivechatdiscordsrvaddon.resources.textures.GeneratedTextureResource) PotionMeta(org.bukkit.inventory.meta.PotionMeta) XMaterial(com.loohp.interactivechat.libs.com.cryptomorin.xseries.XMaterial) TintIndexData(com.loohp.interactivechatdiscordsrvaddon.utils.TintUtils.TintIndexData) JSONObject(com.loohp.interactivechat.libs.org.json.simple.JSONObject) LeatherArmorMeta(org.bukkit.inventory.meta.LeatherArmorMeta) JSONParser(com.loohp.interactivechat.libs.org.json.simple.parser.JSONParser) JSONObject(com.loohp.interactivechat.libs.org.json.simple.JSONObject) ParseException(com.loohp.interactivechat.libs.org.json.simple.parser.ParseException) PotionType(org.bukkit.potion.PotionType) ItemStack(org.bukkit.inventory.ItemStack) HashMap(java.util.HashMap) Map(java.util.Map) EnumMap(java.util.EnumMap) Location(org.bukkit.Location)

Example 19 with ICPlayer

use of com.loohp.interactivechat.objectholders.ICPlayer in project InteractiveChat-DiscordSRV-Addon by LOOHP.

the class OutboundToDiscordEvents method onGameToDiscord.

@Subscribe(priority = ListenerPriority.HIGHEST)
public void onGameToDiscord(GameChatMessagePreProcessEvent event) {
    Debug.debug("Triggering onGameToDiscord");
    InteractiveChatDiscordSrvAddon.plugin.messagesCounter.incrementAndGet();
    Player sender = event.getPlayer();
    ICPlayer icSender = ICPlayerFactory.getICPlayer(sender);
    Component message = ComponentStringUtils.toRegularComponent(event.getMessageComponent());
    message = processGameMessage(icSender, message);
    event.setMessageComponent(ComponentStringUtils.toDiscordSRVComponent(message));
}
Also used : ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) Player(org.bukkit.entity.Player) MineverseChatPlayer(mineverse.Aust1n46.chat.api.MineverseChatPlayer) Component(com.loohp.interactivechat.libs.net.kyori.adventure.text.Component) Subscribe(github.scarsz.discordsrv.api.Subscribe)

Example 20 with ICPlayer

use of com.loohp.interactivechat.objectholders.ICPlayer in project InteractiveChat-DiscordSRV-Addon by LOOHP.

the class OutboundToDiscordEvents method discordMessageSent.

// =====
@Subscribe(priority = ListenerPriority.HIGHEST)
public void discordMessageSent(DiscordGuildMessageSentEvent event) {
    Debug.debug("Triggered discordMessageSent");
    Message message = event.getMessage();
    String textOriginal = message.getContentRaw();
    TextChannel channel = event.getChannel();
    if (!InteractiveChatDiscordSrvAddon.plugin.isEnabled()) {
        return;
    }
    Bukkit.getScheduler().runTaskAsynchronously(InteractiveChatDiscordSrvAddon.plugin, () -> {
        String text = textOriginal;
        if (!text.contains("<ICD=")) {
            return;
        }
        Set<Integer> matches = new LinkedHashSet<>();
        synchronized (DATA) {
            for (int key : DATA.keySet()) {
                if (text.contains("<ICD=" + key + ">")) {
                    text = text.replace("<ICD=" + key + ">", "");
                    matches.add(key);
                }
            }
        }
        if (matches.isEmpty()) {
            Debug.debug("discordMessageSent keys empty");
            return;
        }
        message.editMessage(text + " ...").queue();
        ICPlayer player = DATA.get(matches.iterator().next()).getPlayer();
        List<DiscordDisplayData> dataList = new ArrayList<>();
        for (int key : matches) {
            DiscordDisplayData data = DATA.remove(key);
            if (data != null) {
                dataList.add(data);
            }
        }
        dataList.sort(DISPLAY_DATA_COMPARATOR);
        Debug.debug("discordMessageSent creating contents");
        List<DiscordMessageContent> contents = createContents(dataList, player.isLocal() ? player.getLocalPlayer() : (Bukkit.getOnlinePlayers().isEmpty() ? null : Bukkit.getOnlinePlayers().iterator().next()));
        DiscordImageEvent discordImageEvent = new DiscordImageEvent(channel, textOriginal, text, contents, false, true);
        Bukkit.getPluginManager().callEvent(discordImageEvent);
        Debug.debug("discordMessageSent sending to discord, Cancelled: " + discordImageEvent.isCancelled());
        if (discordImageEvent.isCancelled()) {
            message.editMessage(discordImageEvent.getOriginalMessage()).queue();
        } else {
            text = discordImageEvent.getNewMessage();
            MessageAction action = message.editMessage(text);
            List<MessageEmbed> embeds = new ArrayList<>();
            for (DiscordMessageContent content : contents) {
                embeds.addAll(content.toJDAMessageEmbeds());
                for (Entry<String, byte[]> attachment : content.getAttachments().entrySet()) {
                    action = action.addFile(attachment.getValue(), attachment.getKey());
                }
            }
            action.setEmbeds(embeds).queue();
        }
    });
}
Also used : LinkedHashSet(java.util.LinkedHashSet) ICPlayer(com.loohp.interactivechat.objectholders.ICPlayer) MessageEmbed(github.scarsz.discordsrv.dependencies.jda.api.entities.MessageEmbed) Message(github.scarsz.discordsrv.dependencies.jda.api.entities.Message) DiscordImageEvent(com.loohp.interactivechatdiscordsrvaddon.api.events.DiscordImageEvent) DiscordDisplayData(com.loohp.interactivechatdiscordsrvaddon.objectholders.DiscordDisplayData) DiscordMessageContent(com.loohp.interactivechatdiscordsrvaddon.objectholders.DiscordMessageContent) ArrayList(java.util.ArrayList) TextChannel(github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel) MessageAction(github.scarsz.discordsrv.dependencies.jda.api.requests.restaction.MessageAction) Subscribe(github.scarsz.discordsrv.api.Subscribe)

Aggregations

ICPlayer (com.loohp.interactivechat.objectholders.ICPlayer)22 Player (org.bukkit.entity.Player)11 UUID (java.util.UUID)10 Component (net.kyori.adventure.text.Component)10 InteractiveChat (com.loohp.interactivechat.InteractiveChat)9 ICPlayerFactory (com.loohp.interactivechat.objectholders.ICPlayerFactory)9 ArrayList (java.util.ArrayList)9 List (java.util.List)9 Bukkit (org.bukkit.Bukkit)9 ICPlaceholder (com.loohp.interactivechat.objectholders.ICPlaceholder)7 ChatColorUtils (com.loohp.interactivechat.utils.ChatColorUtils)7 ComponentReplacing (com.loohp.interactivechat.utils.ComponentReplacing)7 InteractiveChatComponentSerializer (com.loohp.interactivechat.utils.InteractiveChatComponentSerializer)7 PlaceholderParser (com.loohp.interactivechat.utils.PlaceholderParser)7 HashMap (java.util.HashMap)7 Optional (java.util.Optional)7 ItemStack (org.bukkit.inventory.ItemStack)7 InteractiveChatAPI (com.loohp.interactivechat.api.InteractiveChatAPI)6 CustomStringUtils (com.loohp.interactivechat.utils.CustomStringUtils)6 IOException (java.io.IOException)6