File: playHistoryTracker.cpp

package info (click to toggle)
bzflag 2.4.30-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 26,488 kB
  • sloc: cpp: 150,376; ansic: 3,463; sh: 2,535; makefile: 2,194; perl: 486; python: 260; objc: 246; php: 206
file content (141 lines) | stat: -rw-r--r-- 4,828 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* bzflag
 * Copyright (c) 1993-2025 Tim Riker
 *
 * This package is free software;  you can redistribute it and/or
 * modify it under the terms of the license found in the file
 * named COPYING that should have accompanied this file.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

#include "bzfsAPI.h"
#include <map>

class PlayHistoryTracker : public bz_Plugin
{
public:
    virtual const char* Name ()
    {
        return "Play History Tracker";
    }
    virtual void Init (const char* /* config */)
    {
        // Register our events
        Register(bz_ePlayerDieEvent);
        Register(bz_ePlayerPartEvent);
        Register(bz_ePlayerJoinEvent);
    }

    virtual void Event (bz_EventData *eventData);

protected:
    std::map<int, int> spreeCount;
};

BZ_PLUGIN(PlayHistoryTracker)

void PlayHistoryTracker::Event(bz_EventData *eventData)
{
    switch (eventData->eventType)
    {
    default:
        break;

    case bz_ePlayerDieEvent:
    {
        bz_PlayerDieEventData_V1 *deathRecord = (bz_PlayerDieEventData_V1*)eventData;

        // Create variables to store the callsigns
        std::string victimCallsign = "UNKNOWN";
        std::string killerCallsign = "UNKNOWN";

        // Get player records for victim and killer
        bz_BasePlayerRecord *victimData = bz_getPlayerByIndex(deathRecord->playerID);
        bz_BasePlayerRecord *killerData = bz_getPlayerByIndex(deathRecord->killerID);

        // If we have valid data, update the callsigns
        if (victimData)
            victimCallsign = victimData->callsign.c_str();
        if (killerData)
            killerCallsign = killerData->callsign.c_str();

        // Free the player records
        bz_freePlayerRecord(victimData);
        bz_freePlayerRecord(killerData);

        // Handle the victim
        if (spreeCount.find(deathRecord->playerID) != spreeCount.end())
        {
            // Store a quick reference to their former spree count
            int spreeTotal = spreeCount[deathRecord->playerID];

            std::string message;

            // Generate an appropriate message, if any
            if (spreeTotal >= 5 && spreeTotal < 10)
                message = victimCallsign + std::string("'s rampage was stopped by ") + killerCallsign;
            else if (spreeTotal >= 10 && spreeTotal < 20)
                message = victimCallsign + std::string("'s killing spree was halted by ") + killerCallsign;
            else if (spreeTotal >= 20)
                message = std::string("The unstoppable reign of ") + victimCallsign + std::string(" was ended by ") + killerCallsign;

            // If we have a message to send, then send it
            if (message.size())
                bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, message.c_str());

            // Since they died, release their spree counter
            spreeCount[deathRecord->playerID] = 0;
        }

        // Handle the killer (if it wasn't also the victim)
        if (deathRecord->playerID != deathRecord->killerID && spreeCount.find(deathRecord->killerID) != spreeCount.end())
        {
            // Store a quick reference to their newly incremented spree count
            int spreeTotal = ++spreeCount[deathRecord->killerID];

            std::string message;

            // Generate an appropriate message, if any
            if (spreeTotal == 5)
                message = killerCallsign + std::string(" is on a Rampage!");
            else if (spreeTotal == 10)
                message = killerCallsign + std::string(" is on a Killing Spree!");
            else if (spreeTotal == 20)
                message = killerCallsign + std::string(" is Unstoppable!!");
            else if (spreeTotal > 20 && spreeTotal%5 == 0)
                message = killerCallsign + std::string(" continues to rage on");

            // If we have a message to send, then send it
            if (message.size())
                bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, message.c_str());
        }
    }
    break;

    case  bz_ePlayerJoinEvent:
    {
        // Initialize the spree counter for the player that just joined
        spreeCount[((bz_PlayerJoinPartEventData_V1*)eventData)->playerID] = 0;
    }
    break;

    case  bz_ePlayerPartEvent:
    {
        // Erase the spree counter for the player that just left
        std::map<int, int >::iterator itr = spreeCount.find(((bz_PlayerJoinPartEventData_V1*)eventData)->playerID);
        if (itr != spreeCount.end())
            spreeCount.erase(itr);
    }
    break;
    }
}

// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4