2023-11-21 20:17:15 +01:00
import { GuildMember , CommandInteraction , SlashCommandBuilder } from 'discord.js' ;
2023-11-21 21:28:32 +01:00
import { weaponAutocomplete , getItem , getItemQuantity , formatItems , formatItem } from '../lib/rpg/items' ;
2023-11-21 20:17:15 +01:00
import { Command } from '../types/index' ;
2023-11-21 21:28:32 +01:00
import { initHealth , dealDamage , BLOOD_ITEM , BLOOD_ID , resetInvincible , INVINCIBLE_TIMER , getInvincibleMs } from '../lib/rpg/pvp' ;
2023-11-21 20:17:15 +01:00
export default {
data : new SlashCommandBuilder ( )
. setName ( 'attack' )
. setDescription ( 'Attack someone using a weapon you have' )
. addStringOption ( option = >
option
. setName ( 'weapon' )
. setAutocomplete ( true )
. setDescription ( 'The weapon to use' )
. setRequired ( true )
)
. addUserOption ( option = >
option
. setName ( 'user' )
. setRequired ( true )
. setDescription ( 'Who to attack with the weapon' )
)
. setDMPermission ( false ) ,
execute : async ( interaction : CommandInteraction ) = > {
if ( ! interaction . isChatInputCommand ( ) ) return ;
const member = interaction . member ! as GuildMember ;
await initHealth ( member . id ) ;
const weaponID = parseInt ( interaction . options . getString ( 'weapon' , true ) ) ;
const user = interaction . options . getUser ( 'user' , true ) ;
await interaction . deferReply ( { ephemeral : true } ) ;
const weapon = await getItem ( weaponID ) ;
if ( ! weapon ) return interaction . followUp ( 'No such item exists!' ) ;
if ( weapon . type !== 'weapon' ) return interaction . followUp ( 'That is not a weapon!' ) ;
2023-11-22 13:05:18 +01:00
const inv = await getItemQuantity ( member . id , weapon . id ) ;
if ( inv . quantity === 0 ) return interaction . followUp ( 'You do not have this weapon!' ) ;
2023-11-21 21:28:32 +01:00
const invinTimer = await getInvincibleMs ( user . id ) ;
if ( invinTimer > 0 ) return interaction . followUp ( ` You can only attack this user <t: ${ Math . floor ( ( Date . now ( ) + invinTimer ) / 1000 ) } :R> (or if they perform an action first)! ` ) ;
2023-11-21 20:17:15 +01:00
const dmg = weapon . maxStack ;
await dealDamage ( user . id , dmg ) ;
const newHealth = await getItemQuantity ( user . id , BLOOD_ID ) ;
2023-11-21 21:28:32 +01:00
if ( user . id !== member . id ) await resetInvincible ( member . id ) ;
await interaction . followUp ( ` You hit ${ user } with ${ formatItem ( weapon ) } for ${ BLOOD_ITEM . emoji } ** ${ dmg } ** damage! They are now at ${ formatItems ( BLOOD_ITEM , newHealth . quantity ) } . \ nYou can attack them again <t: ${ Math . floor ( ( Date . now ( ) + INVINCIBLE_TIMER ) / 1000 ) } :R> (or if they perform an action first). ` ) ;
2023-11-21 20:17:15 +01:00
} ,
2023-11-22 14:45:55 +01:00
autocomplete : weaponAutocomplete ,
2023-11-21 20:17:15 +01:00
} satisfies Command ;