aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Realm/Realm.h
blob: e44ff308c4f2d813f6339b8b13cdd2e9539ce70e (plain)
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef Realm_h__
#define Realm_h__

#include "AsioHacksFwd.h"
#include "Common.h"
#include "EnumFlag.h"
#include <compare>
#include <vector>

enum class RealmFlags : uint8
{
    None                    = 0x00,
    VersionMismatch         = 0x01,
    Hidden                  = 0x02,
    Tournament              = 0x04,
    VersionBelow            = 0x08,
    VersionAbove            = 0x10,
    MobileVersionMismatch   = 0x20,
    MobileVersionBelow      = 0x40,
    MobileVersionAbove      = 0x80
};

DEFINE_ENUM_FLAG(RealmFlags);

enum class RealmPopulationState : uint8
{
    Offline     = 0,
    Low         = 1,
    Medium      = 2,
    High        = 3,
    New         = 4,
    Recommended = 5,
    Full        = 6,
    Locked      = 7
};

namespace Trinity::Legacy
{
enum RealmFlags : uint8
{
    REALM_FLAG_NONE             = 0x00,
    REALM_FLAG_VERSION_MISMATCH = 0x01,
    REALM_FLAG_OFFLINE          = 0x02,
    REALM_FLAG_SPECIFYBUILD     = 0x04,
    REALM_FLAG_UNK1             = 0x08,
    REALM_FLAG_UNK2             = 0x10,
    REALM_FLAG_RECOMMENDED      = 0x20,
    REALM_FLAG_NEW              = 0x40,
    REALM_FLAG_FULL             = 0x80
};

inline constexpr uint8 format_as(RealmFlags e) { return uint8(e); }

inline constexpr ::RealmFlags ConvertLegacyRealmFlags(RealmFlags legacyRealmFlags)
{
    ::RealmFlags realmFlags = ::RealmFlags::None;
    if (legacyRealmFlags & REALM_FLAG_VERSION_MISMATCH)
        realmFlags |= ::RealmFlags::VersionMismatch;
    return realmFlags;
}

inline constexpr RealmPopulationState ConvertLegacyPopulationState(RealmFlags legacyRealmFlags, float population)
{
    if (legacyRealmFlags & REALM_FLAG_OFFLINE)
        return RealmPopulationState::Offline;
    if (legacyRealmFlags & REALM_FLAG_RECOMMENDED)
        return RealmPopulationState::Recommended;
    if (legacyRealmFlags & REALM_FLAG_NEW)
        return RealmPopulationState::New;
    if (legacyRealmFlags & REALM_FLAG_FULL || population > 0.95f)
        return RealmPopulationState::Full;
    if (population > 0.66f)
        return RealmPopulationState::High;
    if (population > 0.33f)
        return RealmPopulationState::Medium;
    return RealmPopulationState::Low;
}
}

namespace Battlenet
{
    struct TC_SHARED_API RealmHandle
    {
        RealmHandle() : Region(0), Site(0), Realm(0) { }
        RealmHandle(uint8 region, uint8 battlegroup, uint32 index)
            : Region(region), Site(battlegroup), Realm(index) { }
        RealmHandle(uint32 realmAddress) : Region((realmAddress >> 24) & 0xFF), Site((realmAddress >> 16) & 0xFF), Realm(realmAddress & 0xFFFF) { }

        uint8 Region;
        uint8 Site;
        uint32 Realm;   // primary key in `realmlist` table

        bool operator==(RealmHandle const& r) const { return Realm == r.Realm; }

        std::strong_ordering operator<=>(RealmHandle const& r) const { return Realm <=> r.Realm; }

        uint32 GetAddress() const { return (Region << 24) | (Site << 16) | uint16(Realm); }
        std::string GetAddressString() const;
        std::string GetSubRegionAddress() const;
    };
}

/// Type of server, this is values from second column of Cfg_Configs.dbc
enum RealmType
{
    REALM_TYPE_NORMAL       = 0,
    REALM_TYPE_PVP          = 1,
    REALM_TYPE_NORMAL2      = 4,
    REALM_TYPE_RP           = 6,
    REALM_TYPE_RPPVP        = 8,

    MAX_CLIENT_REALM_TYPE   = 14,

    REALM_TYPE_FFA_PVP      = 16                            // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries
                                                            // replaced by REALM_PVP in realm list
};

inline constexpr uint32 HARDCODED_DEVELOPMENT_REALM_CATEGORY_ID = 1;

// Storage object for a realm
struct TC_SHARED_API Realm
{
    Battlenet::RealmHandle Id;
    uint32 Build;
    std::vector<boost::asio::ip::address> Addresses;
    uint16 Port;
    std::string Name;
    std::string NormalizedName;
    uint8 Type;
    RealmFlags Flags;
    uint8 Timezone;
    AccountTypes AllowedSecurityLevel;
    RealmPopulationState PopulationLevel;

    void SetName(std::string name);

    boost::asio::ip::address GetAddressForClient(boost::asio::ip::address const& clientAddr) const;
    uint32 GetConfigId() const;

    static uint32 const ConfigIdByType[MAX_CLIENT_REALM_TYPE];
};

#endif // Realm_h__