Skip to content

Hooks

This document describes the hooks available in the Cards module for managing card-related functionality.


CardsCommandUsed

Purpose

Called when the cards command is used by a player.

Parameters

  • client (Player): The player who used the cards command.

Realm

Server.

When Called

This hook is triggered when: - A player executes the cards command - Before the card drawing logic is executed - When the command validation passes

Example Usage

-- Track cards command usage
hook.Add("CardsCommandUsed", "TrackCardsCommandUsage", function(client)
    print(client:Name(), "used the cards command")

    -- Log to server console
    local char = client:getChar()
    if char then
        local cardsCommandUsage = char:getData("cards_command_usage", 0)
        char:setData("cards_command_usage", cardsCommandUsage + 1)
    end
end)

-- Apply custom effects for cards command
hook.Add("CardsCommandUsed", "CardsCommandEffects", function(client)
    -- Play sound effect
    client:EmitSound("buttons/button14.wav", 75, 100)

    -- Apply screen effect
    client:ScreenFade(SCREENFADE.IN, Color(255, 215, 0, 20), 0.5, 0)

    -- Notify player
    client:notify("Cards command used!")
end)

-- Modify cards command behavior
hook.Add("CardsCommandUsed", "ModifyCardsCommandBehavior", function(client)
    local char = client:getChar()
    if char then
        -- Check if player has special card deck
        if char:getData("special_card_deck", false) then
            -- Use special card deck logic
            local specialCards = {"Ace of Spades", "King of Hearts", "Queen of Diamonds", "Jack of Clubs"}
            local card = table.Random(specialCards)
            lia.chat.send(client, "me", "draws a special card: " .. card)
            return true -- Prevent default behavior
        end

        -- Check if player is in a restricted area
        if char:getData("in_card_restricted_area", false) then
            client:notify("You cannot use cards in this area!")
            return false -- Prevent card drawing
        end
    end
end)

-- Log cards command usage
hook.Add("CardsCommandUsed", "LogCardsCommandUsage", function(client)
    -- Log to server console
    print("CARDS COMMAND:", client:Name(), "used cards command at", os.date())

    -- Log to file if needed
    file.Append("cards_log.txt", os.date() .. " - " .. client:Name() .. " - Cards command used\n")
end)

CardDrawn

Purpose

Called when a card is successfully drawn by a player.

Parameters

  • client (Player): The player who drew the card.
  • card (string): The card that was drawn (e.g., "Ace of Spades").

Realm

Server.

When Called

This hook is triggered when: - A card is successfully drawn from the deck - After the card drawing logic completes - When the card result is determined

Example Usage

-- Track card draws
hook.Add("CardDrawn", "TrackCardDraws", function(client, card)
    print(client:Name(), "drew:", card)

    -- Log to server console
    local char = client:getChar()
    if char then
        local cardDraws = char:getData("card_draws", 0)
        char:setData("card_draws", cardDraws + 1)

        -- Track specific cards drawn
        local cardsDrawn = char:getData("cards_drawn", {})
        table.insert(cardsDrawn, {
            card = card,
            timestamp = os.time()
        })
        char:setData("cards_drawn", cardsDrawn)
    end
end)

-- Apply custom effects for card draws
hook.Add("CardDrawn", "CardDrawEffects", function(client, card)
    -- Play sound effect based on card type
    if card:find("Ace") then
        client:EmitSound("buttons/button15.wav", 75, 100)
    elseif card:find("King") or card:find("Queen") then
        client:EmitSound("buttons/button14.wav", 75, 100)
    else
        client:EmitSound("buttons/button13.wav", 75, 100)
    end

    -- Apply screen effect
    client:ScreenFade(SCREENFADE.IN, Color(0, 255, 0, 20), 0.3, 0)

    -- Notify player
    client:notify("Card drawn: " .. card)
end)

-- Modify card draw behavior
hook.Add("CardDrawn", "ModifyCardDrawBehavior", function(client, card)
    local char = client:getChar()
    if char then
        -- Check for special card combinations
        local cardsDrawn = char:getData("cards_drawn", {})
        if #cardsDrawn >= 3 then
            -- Check for three of a kind
            local lastThree = {}
            for i = #cardsDrawn - 2, #cardsDrawn do
                if cardsDrawn[i] then
                    local rank = cardsDrawn[i].card:match("(%w+)")
                    table.insert(lastThree, rank)
                end
            end

            if lastThree[1] == lastThree[2] and lastThree[2] == lastThree[3] then
                client:notify("Three of a kind! Bonus points!")
                char:setData("bonus_points", (char:getData("bonus_points", 0) + 100))
            end
        end

        -- Check for royal flush
        if card:find("Ace") or card:find("King") or card:find("Queen") or card:find("Jack") then
            client:notify("Royal card drawn! Special effect!")
            -- Apply special effect
            client:ScreenFade(SCREENFADE.IN, Color(255, 215, 0, 50), 1, 0)
        end
    end
end)

-- Track card statistics
hook.Add("CardDrawn", "TrackCardStatistics", function(client, card)
    local char = client:getChar()
    if char then
        -- Track card frequency
        local cardFrequency = char:getData("card_frequency", {})
        cardFrequency[card] = (cardFrequency[card] or 0) + 1
        char:setData("card_frequency", cardFrequency)

        -- Track suit frequency
        local suit = card:match("(%w+)$")
        if suit then
            local suitFrequency = char:getData("suit_frequency", {})
            suitFrequency[suit] = (suitFrequency[suit] or 0) + 1
            char:setData("suit_frequency", suitFrequency)
        end

        -- Track rank frequency
        local rank = card:match("(%w+)")
        if rank then
            local rankFrequency = char:getData("rank_frequency", {})
            rankFrequency[rank] = (rankFrequency[rank] or 0) + 1
            char:setData("rank_frequency", rankFrequency)
        end
    end
end)

-- Log card draws
hook.Add("CardDrawn", "LogCardDraws", function(client, card)
    -- Log to server console
    print("CARD DRAWN:", client:Name(), "drew", card, "at", os.date())

    -- Log to file if needed
    file.Append("cards_log.txt", os.date() .. " - " .. client:Name() .. " - Drew: " .. card .. "\n")
end)

Usage Examples

Complete Card System

-- Track all card-related activity
hook.Add("CardsCommandUsed", "TrackAllCardActivity", function(client)
    local char = client:getChar()
    if char then
        local totalActivity = char:getData("total_card_activity", 0)
        char:setData("total_card_activity", totalActivity + 1)
    end
end)

hook.Add("CardDrawn", "TrackAllCardActivity", function(client, card)
    local char = client:getChar()
    if char then
        local totalActivity = char:getData("total_card_activity", 0)
        char:setData("total_card_activity", totalActivity + 1)
    end
end)

Card-Based Rewards System

-- Reward system based on cards drawn
hook.Add("CardDrawn", "CardRewardSystem", function(client, card)
    local char = client:getChar()
    if char then
        local rewards = {
            ["Ace of Spades"] = 100,
            ["King of Hearts"] = 50,
            ["Queen of Diamonds"] = 25,
            ["Jack of Clubs"] = 10
        }

        local reward = rewards[card]
        if reward then
            char:setData("card_rewards", (char:getData("card_rewards", 0) + reward))
            client:notify("Card reward: " .. reward .. " points!")
        end
    end
end)

Card Statistics Tracking

-- Comprehensive card statistics
hook.Add("CardDrawn", "ComprehensiveCardStats", function(client, card)
    local char = client:getChar()
    if char then
        local stats = char:getData("card_stats", {
            total_draws = 0,
            aces_drawn = 0,
            face_cards_drawn = 0,
            spades_drawn = 0,
            hearts_drawn = 0,
            diamonds_drawn = 0,
            clubs_drawn = 0
        })

        stats.total_draws = stats.total_draws + 1

        if card:find("Ace") then
            stats.aces_drawn = stats.aces_drawn + 1
        end

        if card:find("King") or card:find("Queen") or card:find("Jack") then
            stats.face_cards_drawn = stats.face_cards_drawn + 1
        end

        if card:find("Spades") then
            stats.spades_drawn = stats.spades_drawn + 1
        elseif card:find("Hearts") then
            stats.hearts_drawn = stats.hearts_drawn + 1
        elseif card:find("Diamonds") then
            stats.diamonds_drawn = stats.diamonds_drawn + 1
        elseif card:find("Clubs") then
            stats.clubs_drawn = stats.clubs_drawn + 1
        end

        char:setData("card_stats", stats)
    end
end)