{
  "name": "killEarner",
  "author": "Limon",
  "supportedGames": [
    "all"
  ],
  "takaroVersion": "main",
  "versions": [
    {
      "tag": "0.0.1",
      "description": "Rewards players with currency and messages for PvP kills. Configurable reward amounts, random messages for killer and victim, and option to send messages publicly or as PMs.",
      "configSchema": "{\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"killReward\":{\"type\":\"number\",\"description\":\"Currency reward for killing another player\",\"default\":100,\"minimum\":0},\"enableKillerMessages\":{\"type\":\"boolean\",\"description\":\"Send messages to the killer\",\"default\":true},\"enableVictimMessages\":{\"type\":\"boolean\",\"description\":\"Send messages to the victim\",\"default\":true},\"usePublicMessages\":{\"type\":\"boolean\",\"description\":\"Send messages publicly instead of as PMs\",\"default\":false},\"killerMessages\":{\"type\":\"array\",\"description\":\"Random messages for killers\",\"items\":{\"type\":\"string\"},\"default\":[\"Nice kill!\",\"You're on fire!\",\"Dominating!\",\"Excellent work!\",\"Keep it up!\"]},\"victimMessages\":{\"type\":\"array\",\"description\":\"Random messages for victims\",\"items\":{\"type\":\"string\"},\"default\":[\"Better luck next time!\",\"Ouch!\",\"You'll get them next time!\",\"Don't give up!\",\"Respawn and try again!\"]}},\"additionalProperties\":false}",
      "uiSchema": "{\"killReward\":{\"ui:help\":\"Amount of currency to give to the killer\"},\"killerMessages\":{\"ui:help\":\"List of random messages to send to killers\"},\"victimMessages\":{\"ui:help\":\"List of random messages to send to victims\"},\"usePublicMessages\":{\"ui:help\":\"When enabled, messages are sent to global chat instead of private messages\"}}",
      "commands": [
        {
          "name": "killstats",
          "trigger": "killstats",
          "helpText": "Use /killstats to see your own stats, or /killstats [playername] to see another player's stats",
          "function": "import { takaro, data, TakaroUserError } from '@takaro/helpers';\n\nasync function main() {\n  const { player, gameServerId, module, arguments: args } = data;\n  \n  try {\n    let targetPlayer = player;\n    \n    // If a player argument is provided, use that player\n    if (args && args.player) {\n      // Verify the player exists on this game server\n      const pogResponse = await takaro.playerOnGameserver.playerOnGameServerControllerSearch({\n        filters: {\n          gameServerId: [gameServerId],\n          playerId: [args.player.id]\n        },\n        limit: 1\n      });\n      \n      if (pogResponse.data.data && pogResponse.data.data.length > 0) {\n        targetPlayer = args.player;\n      } else {\n        await player.pm(`Player \"${args.player.name}\" not found on this server.`);\n        return;\n      }\n    } else if (args && args.playerName) {\n      // Fallback for string-based player lookup\n      const playersResponse = await takaro.player.playerControllerSearch({\n        filters: {\n          name: [args.playerName]  // Use filters instead of search\n        },\n        limit: 1\n      });\n      \n      if (!playersResponse.data.data || playersResponse.data.data.length === 0) {\n        await player.pm(`Player \"${args.playerName}\" not found.`);\n        return;\n      }\n      \n      targetPlayer = playersResponse.data.data[0];\n    }\n    \n    // Get kill count\n    const killCountVar = await takaro.variable.variableControllerSearch({\n      filters: {\n        key: ['pvp_kills'],\n        gameServerId: [gameServerId],\n        moduleId: [module.moduleId],\n        playerId: [targetPlayer.id]\n      },\n      limit: 1\n    });\n    \n    const kills = killCountVar.data.data && killCountVar.data.data.length > 0 \n      ? parseInt(killCountVar.data.data[0].value) || 0 \n      : 0;\n    \n    // Get death count\n    const deathCountVar = await takaro.variable.variableControllerSearch({\n      filters: {\n        key: ['pvp_deaths'],\n        gameServerId: [gameServerId],\n        moduleId: [module.moduleId],\n        playerId: [targetPlayer.id]\n      },\n      limit: 1\n    });\n    \n    const deaths = deathCountVar.data.data && deathCountVar.data.data.length > 0 \n      ? parseInt(deathCountVar.data.data[0].value) || 0 \n      : 0;\n    \n    // Calculate K/D ratio\n    const kdRatio = deaths > 0 ? (kills / deaths).toFixed(2) : kills.toString();\n    \n    const statsMessage = targetPlayer.id === player.id \n      ? `🎯 Your PvP Stats:\\n  Kills: ${kills}\\n  Deaths: ${deaths}\\n  K/D Ratio: ${kdRatio}`\n      : `🎯 ${targetPlayer.name}'s PvP Stats:\\n  Kills: ${kills}\\n  Deaths: ${deaths}\\n  K/D Ratio: ${kdRatio}`;\n    \n    await player.pm(statsMessage);\n    \n  } catch (error) {\n    console.error(`Error in showKillStats: ${error.message}`);\n    await player.pm('Error retrieving kill statistics.');\n  }\n}\n\nawait main();",
          "arguments": [
            {
              "name": "player",
              "type": "player",
              "helpText": "The player to view stats for (optional - defaults to yourself)",
              "defaultValue": "",
              "position": 0
            }
          ]
        }
      ],
      "hooks": [
        {
          "name": "PvP Kill Detector",
          "eventType": "player-death",
          "description": "Hook for player-death events",
          "regex": ".*",
          "function": "import { takaro, data, TakaroUserError } from '@takaro/helpers';\n\nasync function main() {\n  const { gameServerId, module, eventData } = data;\n  \n  try {\n    // Extract event data (not eventMeta)\n    if (!eventData || !eventData.victim || !eventData.attacker) {\n      console.log('Missing required event data for PvP detection');\n      return;\n    }\n\n    const victim = eventData.victim;\n    const attacker = eventData.attacker;\n    \n    // Check if this is actually a PvP kill (player killed by another player)\n    if (!attacker.gameId || attacker.gameId === victim.gameId) {\n      console.log('Not a PvP kill - same player or invalid attacker');\n      return;\n    }\n    \n    // Check if attacker is a player (has gameId) and not an NPC\n    if (!attacker.name || attacker.name.includes('zombie') || attacker.name.includes('bot')) {\n      console.log('Attacker appears to be NPC, skipping reward');\n      return;\n    }\n\n    console.log(`PvP Kill detected: ${attacker.name} killed ${victim.name}`);\n    \n    // Get module configuration\n    const config = module.userConfig || {};\n    const killReward = config.killReward || 100;\n    const enableKillerMessages = config.enableKillerMessages !== false;\n    const enableVictimMessages = config.enableVictimMessages !== false;\n    const usePublicMessages = config.usePublicMessages || false;\n    const killerMessages = config.killerMessages || ['Nice kill!', 'You\\'re on fire!', 'Dominating!'];\n    const victimMessages = config.victimMessages || ['Better luck next time!', 'Ouch!', 'You\\'ll get them next time!'];\n\n    // Find the killer player in Takaro system\n    const killersResponse = await takaro.player.playerControllerSearch({\n      filters: {\n        name: [attacker.name]  // Use filters for exact matches\n      },\n      limit: 1\n    });\n    \n    if (!killersResponse.data.data || killersResponse.data.data.length === 0) {\n      console.log(`Could not find killer player: ${attacker.name}`);\n      return;\n    }\n    \n    const killerPlayer = killersResponse.data.data[0];\n    \n    // Find the victim player in Takaro system\n    const victimsResponse = await takaro.player.playerControllerSearch({\n      filters: {\n        name: [victim.name]  // Use filters for exact matches\n      },\n      limit: 1\n    });\n    \n    if (!victimsResponse.data.data || victimsResponse.data.data.length === 0) {\n      console.log(`Could not find victim player: ${victim.name}`);\n      return;\n    }\n    \n    const victimPlayer = victimsResponse.data.data[0];\n\n    // Award currency to killer if reward is configured\n    if (killReward > 0) {\n      // Fixed: Use correct API method name (lowercase 's')\n      await takaro.playerOnGameserver.playerOnGameServerControllerAddCurrency(\n        gameServerId,\n        killerPlayer.id,\n        { currency: killReward }\n      );\n      console.log(`Awarded ${killReward} currency to ${killerPlayer.name}`);\n    }\n\n    // Update kill statistics\n    try {\n      // Get current kill count for killer\n      const killCountVar = await takaro.variable.variableControllerSearch({\n        filters: {\n          key: ['pvp_kills'],\n          gameServerId: [gameServerId],\n          moduleId: [module.moduleId],\n          playerId: [killerPlayer.id]\n        },\n        limit: 1\n      });\n      \n      let currentKills = 0;\n      if (killCountVar.data.data && killCountVar.data.data.length > 0) {\n        currentKills = parseInt(killCountVar.data.data[0].value) || 0;\n        // Update existing variable\n        await takaro.variable.variableControllerUpdate(killCountVar.data.data[0].id, {\n          value: (currentKills + 1).toString()\n        });\n      } else {\n        // Create new variable\n        await takaro.variable.variableControllerCreate({\n          key: 'pvp_kills',\n          value: '1',\n          gameServerId,\n          moduleId: module.moduleId,\n          playerId: killerPlayer.id\n        });\n      }\n      console.log(`Updated kill count for ${killerPlayer.name}: ${currentKills + 1}`);\n      \n      // Update death count for victim\n      const deathCountVar = await takaro.variable.variableControllerSearch({\n        filters: {\n          key: ['pvp_deaths'],\n          gameServerId: [gameServerId],\n          moduleId: [module.moduleId],\n          playerId: [victimPlayer.id]\n        },\n        limit: 1\n      });\n      \n      let currentDeaths = 0;\n      if (deathCountVar.data.data && deathCountVar.data.data.length > 0) {\n        currentDeaths = parseInt(deathCountVar.data.data[0].value) || 0;\n        await takaro.variable.variableControllerUpdate(deathCountVar.data.data[0].id, {\n          value: (currentDeaths + 1).toString()\n        });\n      } else {\n        await takaro.variable.variableControllerCreate({\n          key: 'pvp_deaths',\n          value: '1',\n          gameServerId,\n          moduleId: module.moduleId,\n          playerId: victimPlayer.id\n        });\n      }\n      console.log(`Updated death count for ${victimPlayer.name}: ${currentDeaths + 1}`);\n      \n    } catch (statsError) {\n      console.log(`Error updating statistics: ${statsError.message}`);\n    }\n\n    // Send messages\n    const promises = [];\n    \n    if (enableKillerMessages && killerMessages.length > 0) {\n      const randomKillerMessage = killerMessages[Math.floor(Math.random() * killerMessages.length)];\n      const killerMessage = `${randomKillerMessage} You earned ${killReward} currency for the kill!`;\n      \n      if (usePublicMessages) {\n        promises.push(\n          takaro.gameserver.gameServerControllerSendMessage(gameServerId, {\n            message: `${killerPlayer.name}: ${killerMessage}`\n          })\n        );\n      } else {\n        promises.push(\n          takaro.gameserver.gameServerControllerSendMessage(gameServerId, {\n            message: killerMessage,\n            opts: {\n              recipient: { gameId: attacker.gameId }\n            }\n          })\n        );\n      }\n    }\n    \n    if (enableVictimMessages && victimMessages.length > 0) {\n      const randomVictimMessage = victimMessages[Math.floor(Math.random() * victimMessages.length)];\n      \n      if (usePublicMessages) {\n        promises.push(\n          takaro.gameserver.gameServerControllerSendMessage(gameServerId, {\n            message: `${victimPlayer.name}: ${randomVictimMessage}`\n          })\n        );\n      } else {\n        promises.push(\n          takaro.gameserver.gameServerControllerSendMessage(gameServerId, {\n            message: randomVictimMessage,\n            opts: {\n              recipient: { gameId: victim.gameId }\n            }\n          })\n        );\n      }\n    }\n    \n    // Execute all message sends in parallel\n    if (promises.length > 0) {\n      await Promise.all(promises);\n      console.log('Messages sent successfully');\n    }\n    \n  } catch (error) {\n    console.error(`Error in handlePvPKill: ${error.message}`);\n  }\n}\n\nawait main();"
        }
      ],
      "cronJobs": [],
      "functions": [],
      "permissions": []
    }
  ]
}