Core/Packets: Add structure for CMSG_GM_TICKET_GET_CASE_STATUS, SMSG_GM_TICKET_CASE_STATUS, CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY and SMSG_GM_TICKET_RESPONSE_ERROR

Implement CMSG_GM_TICKET_GET_TICKET and SMSG_GM_TICKET_GET_TICKET_RESPONSE
Update SMSG_FEATURE_SYSTEM_STATUS to support customizable ticket system and add config options
This commit is contained in:
Carbenium
2015-02-03 18:11:38 +01:00
parent 72fe4890b6
commit 0f84c7c7b1
11 changed files with 257 additions and 60 deletions

View File

@@ -868,23 +868,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
SendPacket(accountDataTimes.Write());
/// Send FeatureSystemStatus
{
WorldPackets::System::FeatureSystemStatus features;
/// START OF DUMMY VALUES
features.ComplaintStatus = 2;
features.ScrollOfResurrectionRequestsRemaining = 1;
features.ScrollOfResurrectionMaxRequestsPerDay = 1;
features.CfgRealmID = 2;
features.CfgRealmRecID = 0;
features.VoiceEnabled = false;
/// END OF DUMMY VALUES
features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED);
features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED);
SendPacket(features.Write());
}
SendFeatureSystemStatus();
// Send MOTD
{
@@ -1091,6 +1075,35 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
delete holder;
}
void WorldSession::SendFeatureSystemStatus()
{
WorldPackets::System::FeatureSystemStatus features;
/// START OF DUMMY VALUES
features.ComplaintStatus = 2;
features.ScrollOfResurrectionRequestsRemaining = 1;
features.ScrollOfResurrectionMaxRequestsPerDay = 1;
features.CfgRealmID = 2;
features.CfgRealmRecID = 0;
features.VoiceEnabled = false;
features.BrowserEnabled = false; // Has to be false, otherwise client will crash if "Customer Support" is opened
features.EuropaTicketSystemStatus.HasValue = true;
features.EuropaTicketSystemStatus.Value.ThrottleState.MaxTries = 5;
features.EuropaTicketSystemStatus.Value.ThrottleState.PerMilliseconds = 5;
features.EuropaTicketSystemStatus.Value.ThrottleState.TryCount = 0;
features.EuropaTicketSystemStatus.Value.ThrottleState.LastResetTimeBeforeNow = time(nullptr) - 5000;
/// END OF DUMMY VALUES
features.EuropaTicketSystemStatus.Value.SubmitBugEnabled = sWorld->getBoolConfig(CONFIG_TICKET_SUBMIT_BUG);
features.EuropaTicketSystemStatus.Value.TicketSystemEnabled = sWorld->getBoolConfig(CONFIG_TICKET_SUBMIT_TICKET);
features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED);
features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED);
SendPacket(features.Write());
TC_LOG_DEBUG("misc", "SMSG_FEATURE_SYSTEM_STATUS [%s]", GetPlayerInfo().c_str());
}
void WorldSession::HandleSetFactionAtWar(WorldPacket& recvData)
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_SET_FACTION_AT_WAR");

View File

@@ -157,13 +157,21 @@ void WorldSession::HandleGMTicketDeleteOpcode(WorldPacket & /*recvData*/)
}
}
void WorldSession::HandleGMTicketGetTicketOpcode(WorldPacket & /*recvData*/)
void WorldSession::HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTicketGetCaseStatus& /*packet*/)
{
//TODO: Implement GmCase and handle this packet correctly
TC_LOG_DEBUG("misc", "CMSG_GM_TICKET_GET_CASE_STATUS [%s]", GetPlayerInfo().c_str());
}
void WorldSession::HandleGMTicketGetTicketOpcode(WorldPackets::Ticket::GMTicketGetTicket& /*packet*/)
{
TC_LOG_DEBUG("misc", "CMSG_GM_TICKET_GET_TICKET [%s]", GetPlayerInfo().c_str());
SendQueryTimeResponse();
if (GmTicket* ticket = sTicketMgr->GetTicketByPlayer(GetPlayer()->GetGUID()))
{
if (ticket->IsCompleted())
//TODO: Update SMSG_GM_TICKET_RESPONSE
ticket->SendResponse(this);
else
sTicketMgr->SendTicket(this, ticket);
@@ -174,10 +182,13 @@ void WorldSession::HandleGMTicketGetTicketOpcode(WorldPacket & /*recvData*/)
void WorldSession::HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTicketGetSystemStatus& /*packet*/)
{
TC_LOG_DEBUG("misc", "CMSG_GM_TICKET_GET_SYSTEM_STATUS [%s]", GetPlayerInfo().c_str());
// Note: This only disables the ticket UI at client side and is not fully reliable
// Note: This disables the whole customer support UI after trying to send a ticket in disabled state (MessageBox: "GM Help Tickets are currently unavaiable."). UI remains disabled until the character relogs.
WorldPackets::Ticket::GMTicketSystemStatus response;
response.Status = sTicketMgr->GetStatus() ? GMTICKET_QUEUE_STATUS_ENABLED : GMTICKET_QUEUE_STATUS_DISABLED;
SendPacket(response.Write());
TC_LOG_DEBUG("misc", "SMSG_GM_TICKET_SYSTEM_STATUS [%s]", GetPlayerInfo().c_str());
}
void WorldSession::HandleGMSurveySubmit(WorldPacket& recvData)

View File

@@ -23,3 +23,59 @@ WorldPacket const* WorldPackets::Ticket::GMTicketSystemStatus::Write()
return &_worldPacket;
}
WorldPacket const* WorldPackets::Ticket::GMTicketCaseStatus::Write()
{
_worldPacket.AppendPackedTime(OldestTicketTime);
_worldPacket.AppendPackedTime(UpdateTime);
_worldPacket << int32(Cases.size());
for (auto const& c : Cases)
{
_worldPacket << int32(c.CaseID);
_worldPacket << int32(c.CaseOpened);
_worldPacket << int32(c.CaseStatus);
_worldPacket << int16(c.CfgRealmID);
_worldPacket << int64(c.CharacterID);
_worldPacket << int32(c.WaitTimeOverrideMinutes);
_worldPacket.WriteBits(c.Url.size(), 11);
_worldPacket.WriteBits(c.WaitTimeOverrideMessage.size(), 10);
}
_worldPacket.FlushBits();
return &_worldPacket;
}
void WorldPackets::Ticket::GMTicketAcknowledgeSurvey::Read()
{
_worldPacket >> CaseID;
}
WorldPacket const* WorldPackets::Ticket::GMTicketGetTicketResponse::Write()
{
_worldPacket << Result;
_worldPacket.WriteBit(Info.HasValue);
if (Info.HasValue)
{
_worldPacket << int32(Info.Value.TicketID);
_worldPacket << uint8(Info.Value.Category);
_worldPacket.AppendPackedTime(Info.Value.TicketOpenTime);
_worldPacket.AppendPackedTime(Info.Value.OldestTicketTime);
_worldPacket.AppendPackedTime(Info.Value.UpdateTime);
_worldPacket << uint8(Info.Value.AssignedToGM);
_worldPacket << uint8(Info.Value.OpenedByGM);
_worldPacket << int32(Info.Value.WaitTimeOverrideMinutes);
_worldPacket.WriteBits(Info.Value.TicketDescription.size(), 11);
_worldPacket.WriteBits(Info.Value.WaitTimeOverrideMessage.size(), 10);
_worldPacket.WriteString(Info.Value.TicketDescription);
_worldPacket.WriteString(Info.Value.WaitTimeOverrideMessage);
}
return &_worldPacket;
}

View File

@@ -41,6 +41,95 @@ namespace WorldPackets
int32 Status = 0;
};
class GMTicketGetCaseStatus final : public ClientPacket
{
public:
GMTicketGetCaseStatus(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_GET_CASE_STATUS, std::move(packet)) { }
void Read() override { };
};
class GMTicketCaseStatus final : public ServerPacket
{
public:
struct GMTicketCase
{
int32 CaseID = 0;
int32 CaseOpened = 0;
int32 CaseStatus = 0;
int16 CfgRealmID = 0;
int64 CharacterID = 0;
int32 WaitTimeOverrideMinutes = 0;
std::string Url;
std::string WaitTimeOverrideMessage;
bool operator<(GMTicketCase const& right) const
{
return CaseID < right.CaseID;
}
};
GMTicketCaseStatus() : ServerPacket(SMSG_GM_TICKET_CASE_STATUS) { }
WorldPacket const* Write() override;
time_t OldestTicketTime = 0;
time_t UpdateTime = 0;
std::set<GMTicketCase> Cases;
};
class GMTicketGetTicket final : public ClientPacket
{
public:
GMTicketGetTicket(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_GET_TICKET, std::move(packet)) { }
void Read() override { };
};
class GMTicketGetTicketResponse final : public ServerPacket
{
public:
struct GMTicketInfo
{
int32 TicketID = 0;
std::string TicketDescription;
uint8 Category = 0;
time_t TicketOpenTime = 0;
time_t OldestTicketTime = 0;
time_t UpdateTime = 0;
uint8 AssignedToGM = 0;
uint8 OpenedByGM = 0;
std::string WaitTimeOverrideMessage;
int32 WaitTimeOverrideMinutes = 0;
};
GMTicketGetTicketResponse() : ServerPacket(SMSG_GM_TICKET_GET_TICKET_RESPONSE) { }
WorldPacket const* Write() override;
int32 Result = 0;
Optional<GMTicketInfo> Info;
};
class GMTicketAcknowledgeSurvey final : public ClientPacket
{
public:
GMTicketAcknowledgeSurvey(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, std::move(packet)) { }
void Read() override;
int32 CaseID;
};
class GMTicketResponseError final : public ServerPacket
{
public:
GMTicketResponseError() : ServerPacket(SMSG_GM_TICKET_RESPONSE_ERROR, 0) { }
WorldPacket const* Write() { return &_worldPacket; }
};
}
}

View File

@@ -388,11 +388,13 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_SET_SECURITY_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_SURVEY_SUBMIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMSurveySubmit );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_HANDLER(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketAcknowledgeSurvey, &WorldSession::HandleGMTicketAcknowledgeSurveyOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_CREATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketCreateOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_DELETE_TICKET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketDeleteOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode)
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_GET_TICKET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketGetTicketOpcode );
//DEFINE_HANDLER(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetCaseStatus, &WorldSession::HandleGMTicketGetCaseStatusOpcode);
DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode);
DEFINE_HANDLER(CMSG_GM_TICKET_GET_TICKET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetTicket, &WorldSession::HandleGMTicketGetTicketOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_RESPONSE_RESOLVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMResponseResolve );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_UPDATE_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketUpdateOpcode );
DEFINE_HANDLER(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode);
@@ -1277,8 +1279,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_MESSAGECHAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_REQUEST_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_GET_TICKET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_GET_TICKET_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESOLVE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);

View File

@@ -269,6 +269,9 @@ namespace WorldPackets
namespace Ticket
{
class GMTicketGetSystemStatus;
class GMTicketGetCaseStatus;
class GMTicketGetTicket;
class GMTicketAcknowledgeSurvey;
}
namespace Trade
@@ -514,6 +517,7 @@ class WorldSession
void SendAuthWaitQue(uint32 position);
void SendSetTimeZoneInformation();
void SendFeatureSystemStatus();
void SendFeatureSystemStatusGlueScreen();
void SendNameQueryOpcode(ObjectGuid guid);
@@ -740,7 +744,8 @@ class WorldSession
void HandleGMTicketCreateOpcode(WorldPacket& recvPacket);
void HandleGMTicketUpdateOpcode(WorldPacket& recvPacket);
void HandleGMTicketDeleteOpcode(WorldPacket& recvPacket);
void HandleGMTicketGetTicketOpcode(WorldPacket& recvPacket);
void HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTicketGetCaseStatus& packet);
void HandleGMTicketGetTicketOpcode(WorldPackets::Ticket::GMTicketGetTicket& packet);
void HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTicketGetSystemStatus& packet);
void HandleGMSurveySubmit(WorldPacket& recvPacket);
void HandleReportLag(WorldPacket& recvPacket);

View File

@@ -18,6 +18,7 @@
#include "Common.h"
#include "TicketMgr.h"
#include "TicketPackets.h"
#include "DatabaseEnv.h"
#include "Log.h"
#include "Language.h"
@@ -28,7 +29,7 @@
#include "Player.h"
#include "Opcodes.h"
inline float GetAge(uint64 t) { return float(time(NULL) - t) / DAY; }
inline time_t GetAge(uint64 t) { return (time(NULL) - t) / DAY; }
///////////////////////////////////////////////////////////////////////////////////////////////////
// GM ticket
@@ -113,30 +114,6 @@ void GmTicket::DeleteFromDB()
CharacterDatabase.Execute(stmt);
}
void GmTicket::WritePacket(WorldPacket& data) const
{
data << uint32(GMTICKET_STATUS_HASTEXT);
data << uint32(_id);
data << _message;
data << uint8(_needMoreHelp);
data << GetAge(_lastModifiedTime);
if (GmTicket* ticket = sTicketMgr->GetOldestOpenTicket())
data << GetAge(ticket->GetLastModifiedTime());
else
data << float(0);
// I am not sure how blizzlike this is, and we don't really have a way to find out
data << GetAge(sTicketMgr->GetLastChange());
data << uint8(std::min(_escalatedStatus, TICKET_IN_ESCALATION_QUEUE)); // escalated data
data << uint8(_viewed ? GMTICKET_OPENEDBYGM_STATUS_OPENED : GMTICKET_OPENEDBYGM_STATUS_NOT_OPENED); // whether or not it has been viewed
// TODO: implement these
std::string waitTimeOverrideMessage = "";
data << waitTimeOverrideMessage;
data << uint32(0); // waitTimeOverrideMinutes
}
void GmTicket::SendResponse(WorldSession* session) const
{
WorldPacket data(SMSG_GM_TICKET_RESPONSE);
@@ -267,7 +244,7 @@ TicketMgr::~TicketMgr()
void TicketMgr::Initialize()
{
SetStatus(sWorld->getBoolConfig(CONFIG_ALLOW_TICKETS));
SetStatus(sWorld->getBoolConfig(CONFIG_TICKET_SYSTEM_STATUS));
}
void TicketMgr::ResetTickets()
@@ -408,12 +385,27 @@ void TicketMgr::ShowEscalatedList(ChatHandler& handler) const
void TicketMgr::SendTicket(WorldSession* session, GmTicket* ticket) const
{
WorldPacket data(SMSG_GM_TICKET_GET_TICKET_RESPONSE, (ticket ? (4 + 4 + 1 + 4 + 4 + 4 + 1 + 1) : 4));
WorldPackets::Ticket::GMTicketGetTicketResponse response;
if (ticket)
ticket->WritePacket(data);
else
data << uint32(GMTICKET_STATUS_DEFAULT);
{
response.Result = GMTICKET_STATUS_HASTEXT;
response.Info.HasValue = true;
session->SendPacket(&data);
response.Info.Value.TicketID = ticket->GetId();
response.Info.Value.TicketDescription = ticket->GetMessage();
response.Info.Value.Category = ticket->GetNeedMoreHelp();
response.Info.Value.TicketOpenTime = GetAge(ticket->GetLastModifiedTime());
response.Info.Value.OldestTicketTime = sTicketMgr->GetOldestOpenTicket() ? GetAge(sTicketMgr->GetOldestOpenTicket()->GetLastModifiedTime()) : float(0);
response.Info.Value.UpdateTime = GetAge(sTicketMgr->GetLastChange());
response.Info.Value.AssignedToGM = ticket->IsAssigned();
response.Info.Value.OpenedByGM = ticket->IsViewed();
response.Info.Value.WaitTimeOverrideMessage = "";
response.Info.Value.WaitTimeOverrideMinutes = 0;
}
else
response.Result = GMTICKET_STATUS_DEFAULT;
session->SendPacket(response.Write());
TC_LOG_DEBUG("misc", "SMSG_GM_GET_TICKET_RESPONSE [%s]", session->GetPlayerInfo().c_str());
}

View File

@@ -90,11 +90,13 @@ public:
bool IsAssigned() const { return !_assignedTo.IsEmpty(); }
bool IsAssignedTo(ObjectGuid guid) const { return guid == _assignedTo; }
bool IsAssignedNotTo(ObjectGuid guid) const { return IsAssigned() && !IsAssignedTo(guid); }
bool IsViewed() const { return _viewed; }
uint32 GetId() const { return _id; }
Player* GetPlayer() const { return ObjectAccessor::FindPlayer(_playerGuid); }
std::string const& GetPlayerName() const { return _playerName; }
std::string const& GetMessage() const { return _message; }
bool const GetNeedMoreHelp() const { return _needMoreHelp; }
Player* GetAssignedPlayer() const { return ObjectAccessor::FindPlayer(_assignedTo); }
ObjectGuid GetAssignedToGUID() const { return _assignedTo; }
std::string GetAssignedToName() const

View File

@@ -278,6 +278,7 @@ void World::AddSession_(WorldSession* s)
s->SendAuthResponse(AUTH_OK, false);
s->SendSetTimeZoneInformation();
s->SendFeatureSystemStatus();
s->SendFeatureSystemStatusGlueScreen();
s->SendAddonsInfo();
@@ -377,6 +378,7 @@ bool World::RemoveQueuedPlayer(WorldSession* sess)
pop_sess->SendAuthWaitQue(0);
pop_sess->SendSetTimeZoneInformation();
pop_sess->SendFeatureSystemStatus();
pop_sess->SendFeatureSystemStatusGlueScreen();
pop_sess->SendAddonsInfo();
@@ -428,7 +430,11 @@ void World::LoadConfigSettings(bool reload)
SetMotd(sConfigMgr->GetStringDefault("Motd", "Welcome to a Trinity Core Server."));
///- Read ticket system setting from the config file
m_bool_configs[CONFIG_ALLOW_TICKETS] = sConfigMgr->GetBoolDefault("AllowTickets", true);
m_bool_configs[CONFIG_TICKET_SYSTEM_STATUS] = sConfigMgr->GetBoolDefault("Ticket.SystemStatus", true);
if (reload)
sTicketMgr->SetStatus(m_bool_configs[CONFIG_TICKET_SYSTEM_STATUS]);
m_bool_configs[CONFIG_TICKET_SUBMIT_TICKET] = sConfigMgr->GetBoolDefault("Ticket.SubmitTicket", false);
m_bool_configs[CONFIG_TICKET_SUBMIT_BUG] = sConfigMgr->GetBoolDefault("Ticket.SubmitBug", false);
///- Get string for new logins (newly created characters)
SetNewCharString(sConfigMgr->GetStringDefault("PlayerStart.String", ""));

View File

@@ -151,7 +151,9 @@ enum WorldBoolConfigs
CONFIG_SHOW_MUTE_IN_WORLD,
CONFIG_SHOW_BAN_IN_WORLD,
CONFIG_AUTOBROADCAST,
CONFIG_ALLOW_TICKETS,
CONFIG_TICKET_SYSTEM_STATUS,
CONFIG_TICKET_SUBMIT_TICKET,
CONFIG_TICKET_SUBMIT_BUG,
CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES,
CONFIG_PRESERVE_CUSTOM_CHANNELS,
CONFIG_PDUMP_NO_PATHS,

View File

@@ -1060,12 +1060,31 @@ Server.LoginInfo = 0
Command.LookupMaxResults = 0
#
# AllowTickets
# Description: Allow/disallow sending new tickets.
# Ticket.SystemStatus
# Description: Enable/disable the ticket system. This disables the whole customer
# support UI after trying to send a ticket in disabled state
# (MessageBox: "GM Help Tickets are currently unavaiable.").
# UI remains disabled until the character relogs.
# Default: 1 - (Enabled)
# 0 - (Disabled)
# 0 - (Disabled) 0 - (Disabled)
AllowTickets = 1
Ticket.SystemStatus = 1
#
# Ticket.SubmitTicket
# Description: Allow/disallow opening new tickets.
# Default: 0 - (Disabled)
# 1 - (Enabled, Experimental)
Ticket.SubmitTicket = 0
#
# Ticket.SubmitBug
# Description: Allow/disallow opening new bug reports.
# Default: 0 - (Disabled)
# 1 - (Enabled, Experimental)
Ticket.SubmitBug = 0
#
# DungeonFinder.OptionsMask