Multi_VIP_Packs

  • community
  • community-management
  • by MeeBob
  • Takaro v0.3.3
  • all
Version
View export JSON

VIP Multi-Tier Kit System
The 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.
🌟 Key Features
Intelligent Tier Detection

Automatically identifies each player's VIP tier level based on their permissions
Players receive the highest tier rewards they qualify for
No complex commands - just type /vipkit and get your rewards

Unlimited Scalability

Support for unlimited VIP tiers (Bronze, Silver, Gold, Platinum, Diamond, etc.)
Easy to add new tiers without code modifications
Count-based permission system grows with your community

Anti-Abuse Protection

One-time redemption per tier per server
Prevents multiple claims and exploits
Secure variable tracking system

Rich Customization

Configure unique item packages for each VIP tier
Set item quantities, qualities, and types per tier
Personalized welcome messages with dynamic tier names
Professional admin interface for easy management

🚀 How It Works
For Administrators:

Configure VIP Tiers - Set up your tier structure (Level 1 = Bronze, Level 2 = Silver, etc.)
Assign Permissions - Give players VIP_ACCESS permission with count values matching their tier
Customize Items - Configure unique item packages for each tier level

Configuration 2

Settings you fill in when installing the module on a server.

SettingTypeDefaultDescription
welcomeMessage Welcome Message string "Welcome {player}! Your {tier} status is active." Message sent when VIP players connect (use {player} for player name, {tier} for VIP tier name)
vipTiers VIP Tiers array [{"tierLevel":1,"tierName":"Bronze VIP","items":[]},{"tierLevel":2,"tierName":"Silver VIP","items":[]},{"tierLevel":3,"tierName":"Gold VIP","items":[]}] Configure VIP tiers by tier level (must match permission count values)
Raw config schema
{
  "$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": []
        }
      ]
    }
  }
}
Raw UI schema
{
  "vipTiers": {
    "items": {
      "ui:order": [
        "tierLevel",
        "tierName",
        "items"
      ],
      "items": {
        "items": {
          "item": {
            "ui:widget": "item"
          }
        }
      }
    }
  }
}

Commands 1

Chat commands players trigger in game.

  • vipkit

    Claim your VIP kit items based on your tier

    Command source
    import { takaro, data, TakaroUserError, checkPermission } from '@takaro/helpers';
    
    async function main() {
        const { pog, gameServerId } = data;
        const { vipTiers } = data.module.userConfig;
    
        if (!vipTiers || vipTiers.length === 0) {
            throw new TakaroUserError('No VIP tiers configured. Please ask your server administrator to configure this.');
        }
    
        // Check if player has VIP_ACCESS permission
        const vipPermission = checkPermission(pog, 'VIP_ACCESS');
    
        if (!vipPermission) {
            throw new TakaroUserError('You do not have VIP access. This command requires VIP status.');
        }
    
        const playerTierLevel = vipPermission.count;
    
        if (!playerTierLevel || playerTierLevel < 1) {
            throw new TakaroUserError('Invalid VIP tier level. Please contact an administrator.');
        }
    
        // Find the highest tier the player can access (tier level <= player's permission count)
        const availableTiers = vipTiers
            .filter(tier => tier.tierLevel <= playerTierLevel)
            .sort((a, b) => b.tierLevel - a.tierLevel); // Sort highest first
    
        if (availableTiers.length === 0) {
            throw new TakaroUserError(`No VIP tier configured for your level (${playerTierLevel}). Please contact an administrator.`);
        }
    
        const selectedTier = availableTiers[0]; // Get the highest available tier
    
        // Check if player already claimed this tier level
        const lockKey = `vipkit_tier_${selectedTier.tierLevel}_lock`;
        const existingClaim = await takaro.variable.variableControllerSearch({
            filters: {
                key: [lockKey],
                gameServerId: [gameServerId],
                playerId: [data.player.id],
            },
        });
    
        if (existingClaim.data.data.length > 0) {
            throw new TakaroUserError(`You already claimed your ${selectedTier.tierName} kit on this server`);
        }
    
        // Validate items exist
        if (!selectedTier.items || selectedTier.items.length === 0) {
            throw new TakaroUserError(`No items configured for ${selectedTier.tierName}. Please ask your server administrator to configure this.`);
        }
    
        await data.player.pm(`You are about to receive your ${selectedTier.tierName} kit (Tier ${selectedTier.tierLevel})...`);
    
        // Get item details from Takaro
        const itemRecords = (await takaro.item.itemControllerSearch({
            filters: { id: selectedTier.items.map(item => item.item) }
        })).data.data;
    
        const fullItems = selectedTier.items.map((item) => {
            const itemRecord = itemRecords.find((record) => record.id === item.item);
            if (!itemRecord) {
                throw new TakaroUserError(`Item with ID ${item.item} not found.`);
            }
            return {
                code: itemRecord.code,
                quality: item.quality,
                amount: item.amount,
            };
        });
    
        // Give all items to player
        await Promise.all(fullItems.map(async (item) => {
            return takaro.gameserver.gameServerControllerGiveItem(gameServerId, data.player.id, {
                name: item.code,
                quality: item.quality ?? '',
                amount: item.amount,
            });
        }));
    
        // Mark tier as claimed
        await takaro.variable.variableControllerCreate({
            key: lockKey,
            value: JSON.stringify({
                claimedAt: new Date().toISOString(),
                tierName: selectedTier.tierName,
                tierLevel: selectedTier.tierLevel,
                itemCount: selectedTier.items.length
            }),
            gameServerId: gameServerId,
            playerId: data.player.id,
        });
    
        await data.player.pm(`Gave ${selectedTier.items.length} ${selectedTier.tierName} items, enjoy!`);
    }
    
    await main();

Hooks 1

Code that runs in reaction to a game or Takaro event.

  • welcomeHook

    Hook for log events

    Hook source
    import { takaro, data, checkPermission } from '@takaro/helpers';
    
    async function main() {
        const { player, pog } = data;
        const { welcomeMessage, vipTiers } = data.module.userConfig;
    
        if (!vipTiers || vipTiers.length === 0 || !welcomeMessage) {
            return; // Skip if not configured
        }
    
        // Check if player has VIP_ACCESS permission
        const vipPermission = checkPermission(pog, 'VIP_ACCESS');
    
        if (!vipPermission || !vipPermission.count) {
            return; // Player doesn't have VIP status
        }
    
        const playerTierLevel = vipPermission.count;
    
        // Find the highest tier the player can access
        const availableTiers = vipTiers
            .filter(tier => tier.tierLevel <= playerTierLevel)
            .sort((a, b) => b.tierLevel - a.tierLevel);
    
        if (availableTiers.length === 0) {
            return; // No valid tier found
        }
    
        const highestTier = availableTiers[0];
    
        const message = welcomeMessage
            .replace('{player}', player.name)
            .replace('{tier}', highestTier.tierName);
    
        await takaro.gameserver.gameServerControllerSendMessage(data.gameServerId, {
            message,
        });
    }
    
    await main();