{
  "name": "Multi_VIP_Packs",
  "author": "MeeBob",
  "supportedGames": [
    "all"
  ],
  "takaroVersion": "v0.3.3",
  "versions": [
    {
      "tag": "latest",
      "description": "VIP Multi-Tier Kit System\nThe VIP Multi-Tier Kit System is a powerful and flexible Takaro module that revolutionizes how you reward your VIP supporters. This comprehensive system automatically delivers customized item packages based on each player's VIP tier level, creating a seamless and scalable donation reward experience.\n🌟 Key Features\nIntelligent Tier Detection\n\nAutomatically identifies each player's VIP tier level based on their permissions\nPlayers receive the highest tier rewards they qualify for\nNo complex commands - just type /vipkit and get your rewards\n\nUnlimited Scalability\n\nSupport for unlimited VIP tiers (Bronze, Silver, Gold, Platinum, Diamond, etc.)\nEasy to add new tiers without code modifications\nCount-based permission system grows with your community\n\nAnti-Abuse Protection\n\nOne-time redemption per tier per server\nPrevents multiple claims and exploits\nSecure variable tracking system\n\nRich Customization\n\nConfigure unique item packages for each VIP tier\nSet item quantities, qualities, and types per tier\nPersonalized welcome messages with dynamic tier names\nProfessional admin interface for easy management\n\n🚀 How It Works\nFor Administrators:\n\nConfigure VIP Tiers - Set up your tier structure (Level 1 = Bronze, Level 2 = Silver, etc.)\nAssign Permissions - Give players VIP_ACCESS permission with count values matching their tier\nCustomize Items - Configure unique item packages for each tier level\n\n",
      "configSchema": "{\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"required\":[],\"additionalProperties\":false,\"properties\":{\"welcomeMessage\":{\"type\":\"string\",\"title\":\"Welcome Message\",\"description\":\"Message sent when VIP players connect (use {player} for player name, {tier} for VIP tier name)\",\"default\":\"Welcome {player}! Your {tier} status is active.\"},\"vipTiers\":{\"type\":\"array\",\"title\":\"VIP Tiers\",\"description\":\"Configure VIP tiers by tier level (must match permission count values)\",\"minItems\":1,\"items\":{\"type\":\"object\",\"title\":\"VIP Tier\",\"required\":[\"tierLevel\",\"tierName\",\"items\"],\"properties\":{\"tierLevel\":{\"type\":\"number\",\"title\":\"Tier Level\",\"description\":\"Tier level number (must match the count value in VIP_ACCESS permission)\",\"minimum\":1},\"tierName\":{\"type\":\"string\",\"title\":\"Tier Name\",\"description\":\"Display name for this VIP tier (e.g., 'Bronze VIP', 'Gold VIP')\"},\"items\":{\"type\":\"array\",\"title\":\"Items\",\"description\":\"Items given in this VIP tier kit\",\"x-component\":\"item\",\"uniqueItems\":true,\"items\":{\"type\":\"object\",\"title\":\"Item\",\"properties\":{\"item\":{\"type\":\"string\",\"title\":\"Item\"},\"amount\":{\"type\":\"number\",\"title\":\"Amount\",\"minimum\":1},\"quality\":{\"type\":\"string\",\"title\":\"Quality\"}}}}}},\"default\":[{\"tierLevel\":1,\"tierName\":\"Bronze VIP\",\"items\":[]},{\"tierLevel\":2,\"tierName\":\"Silver VIP\",\"items\":[]},{\"tierLevel\":3,\"tierName\":\"Gold VIP\",\"items\":[]}]}}}",
      "uiSchema": "{\"vipTiers\":{\"items\":{\"ui:order\":[\"tierLevel\",\"tierName\",\"items\"],\"items\":{\"items\":{\"item\":{\"ui:widget\":\"item\"}}}}}}",
      "commands": [
        {
          "name": "vipkit",
          "trigger": "vipkit",
          "helpText": "Claim your VIP kit items based on your tier",
          "function": "import { takaro, data, TakaroUserError, checkPermission } from '@takaro/helpers';\n\nasync function main() {\n    const { pog, gameServerId } = data;\n    const { vipTiers } = data.module.userConfig;\n\n    if (!vipTiers || vipTiers.length === 0) {\n        throw new TakaroUserError('No VIP tiers configured. Please ask your server administrator to configure this.');\n    }\n\n    // Check if player has VIP_ACCESS permission\n    const vipPermission = checkPermission(pog, 'VIP_ACCESS');\n\n    if (!vipPermission) {\n        throw new TakaroUserError('You do not have VIP access. This command requires VIP status.');\n    }\n\n    const playerTierLevel = vipPermission.count;\n\n    if (!playerTierLevel || playerTierLevel < 1) {\n        throw new TakaroUserError('Invalid VIP tier level. Please contact an administrator.');\n    }\n\n    // Find the highest tier the player can access (tier level <= player's permission count)\n    const availableTiers = vipTiers\n        .filter(tier => tier.tierLevel <= playerTierLevel)\n        .sort((a, b) => b.tierLevel - a.tierLevel); // Sort highest first\n\n    if (availableTiers.length === 0) {\n        throw new TakaroUserError(`No VIP tier configured for your level (${playerTierLevel}). Please contact an administrator.`);\n    }\n\n    const selectedTier = availableTiers[0]; // Get the highest available tier\n\n    // Check if player already claimed this tier level\n    const lockKey = `vipkit_tier_${selectedTier.tierLevel}_lock`;\n    const existingClaim = await takaro.variable.variableControllerSearch({\n        filters: {\n            key: [lockKey],\n            gameServerId: [gameServerId],\n            playerId: [data.player.id],\n        },\n    });\n\n    if (existingClaim.data.data.length > 0) {\n        throw new TakaroUserError(`You already claimed your ${selectedTier.tierName} kit on this server`);\n    }\n\n    // Validate items exist\n    if (!selectedTier.items || selectedTier.items.length === 0) {\n        throw new TakaroUserError(`No items configured for ${selectedTier.tierName}. Please ask your server administrator to configure this.`);\n    }\n\n    await data.player.pm(`You are about to receive your ${selectedTier.tierName} kit (Tier ${selectedTier.tierLevel})...`);\n\n    // Get item details from Takaro\n    const itemRecords = (await takaro.item.itemControllerSearch({\n        filters: { id: selectedTier.items.map(item => item.item) }\n    })).data.data;\n\n    const fullItems = selectedTier.items.map((item) => {\n        const itemRecord = itemRecords.find((record) => record.id === item.item);\n        if (!itemRecord) {\n            throw new TakaroUserError(`Item with ID ${item.item} not found.`);\n        }\n        return {\n            code: itemRecord.code,\n            quality: item.quality,\n            amount: item.amount,\n        };\n    });\n\n    // Give all items to player\n    await Promise.all(fullItems.map(async (item) => {\n        return takaro.gameserver.gameServerControllerGiveItem(gameServerId, data.player.id, {\n            name: item.code,\n            quality: item.quality ?? '',\n            amount: item.amount,\n        });\n    }));\n\n    // Mark tier as claimed\n    await takaro.variable.variableControllerCreate({\n        key: lockKey,\n        value: JSON.stringify({\n            claimedAt: new Date().toISOString(),\n            tierName: selectedTier.tierName,\n            tierLevel: selectedTier.tierLevel,\n            itemCount: selectedTier.items.length\n        }),\n        gameServerId: gameServerId,\n        playerId: data.player.id,\n    });\n\n    await data.player.pm(`Gave ${selectedTier.items.length} ${selectedTier.tierName} items, enjoy!`);\n}\n\nawait main();",
          "arguments": []
        }
      ],
      "hooks": [
        {
          "name": "welcomeHook",
          "eventType": "log",
          "description": "Hook for log events",
          "regex": "takaro-hook-regex-placeholder",
          "function": "import { takaro, data, checkPermission } from '@takaro/helpers';\n\nasync function main() {\n    const { player, pog } = data;\n    const { welcomeMessage, vipTiers } = data.module.userConfig;\n\n    if (!vipTiers || vipTiers.length === 0 || !welcomeMessage) {\n        return; // Skip if not configured\n    }\n\n    // Check if player has VIP_ACCESS permission\n    const vipPermission = checkPermission(pog, 'VIP_ACCESS');\n\n    if (!vipPermission || !vipPermission.count) {\n        return; // Player doesn't have VIP status\n    }\n\n    const playerTierLevel = vipPermission.count;\n\n    // Find the highest tier the player can access\n    const availableTiers = vipTiers\n        .filter(tier => tier.tierLevel <= playerTierLevel)\n        .sort((a, b) => b.tierLevel - a.tierLevel);\n\n    if (availableTiers.length === 0) {\n        return; // No valid tier found\n    }\n\n    const highestTier = availableTiers[0];\n\n    const message = welcomeMessage\n        .replace('{player}', player.name)\n        .replace('{tier}', highestTier.tierName);\n\n    await takaro.gameserver.gameServerControllerSendMessage(data.gameServerId, {\n        message,\n    });\n}\n\nawait main();"
        }
      ],
      "cronJobs": [],
      "functions": [],
      "permissions": []
    }
  ]
}