Moin,
ich habe für zwei Dungeons Eventflags eingefügt, über welche geprüft wird ob der Dungeon bereits von einer Gruppe belegt wurde.
Die Flags werden in den Quests über game.set_event_flag gesetzt und auch wieder entfernt.
Falls nun aber eine Gruppe während des Serverneustarts in einem Dungeon ist wird dieser Flag nicht wieder zurückgesetzt und der Dungeon ist dann "für immer" belegt.
Um das automatisiert zu lösen habe ich folgenden Code, den ich mit euch teilen möchte.
Beide Varianten sind getestet und funktionieren.
Variante 1: Im Source definierte Flags werden auf 0 gesetzt
common
CommonDefines.h
game/src
config.h
config.cpp
- //search: #include "desc_manager.h"
- //add after:
- #ifdef ENABLE_DUNGEON_RESET
- #include "desc_client.h"
- #endif
- //search: static bool __LoadConnectConfigFile(const char* configName)
- //add before:
- #ifdef ENABLE_DUNGEON_RESET
- void ResetDungeonsOnReboot(const string& name)
- {
- TPacketSetEventFlag p;
- strlcpy(p.szFlagName, name.c_str(), sizeof(p.szFlagName));
- p.lValue = 0; //The value can be given as a parameter if you dont want to set the value to 0
- db_clientdesc->DBPacket(HEADER_GD_SET_EVENT_FLAG, 0, &p, sizeof(TPacketSetEventFlag));
- }
- #endif
main.cpp
- //search: extern void CancelReloadSpamEvent();
- //add before:
- #ifdef ENABLE_DUNGEON_RESET
- //Array of Dungeons
- std::string dungeons[2] = {"BT_group_inside", "d_run_group_inside"}; //replace size of array and elements to your needs
- #endif
- //serach: signal_timer_enable(30); -> function int start(
- //add before:
- #ifdef ENABLE_DUNGEON_RESET
- //Reset Dungeons
- int dungeonCount = sizeof(dungeons)/sizeof(dungeons[0]);
- for(int i = 0; i < dungeonCount; i++) {
- ResetDungeonsOnReboot(dungeons[i]);
- }
- #endif
Falls ihr keine CommonDefines im common Ordner habt könnt ihr auch die service.h nehmen. Diese müssen immer noch mit included werden, wenn noch nicht getan.
Variante 2: Flags und Default-Werte werden über eine Config Datei beim Serverstart geladen
Server
Erstellt in jedem Core einen Symbolic Link zu der erstellten FLAGS Datei. Dieses Script kann helfen, ist aber mit Vorsicht zu genießen da es an meine Infrastruktur angepasst ist.
Nun muss die FLAGS Datei noch mit Leben gefüllt werden.
Der Default-Wert für die Flags kann nur zwischen 0 und 9 liegen. Durch die Umwandlung von char zu int im Source werden Werte wie z.B. "19" wieder zu einer 1 formatiert.
Server-Source
Common
CommonDefines.h
game
utils.h
utils.cpp
config.h
config.cpp
- //search function static bool __LoadDefaultCMDFile(const char* cmdName)
- //add above:
- #ifdef ENABLE_GAMEFLAG_RESET
- bool __ResetGameflags(const char* flagsName)
- {
- FILE* fp;
- char buf[256];
- if ((fp = fopen(flagsName, "r")))
- {
- while (fgets(buf, 256, fp))
- {
- char c_flag[32], c_default[32];
- two_arguments(buf, c_flag, sizeof(c_flag), c_default, sizeof(c_default));
- if (!*c_flag || !*c_default)
- {
- fprintf(stderr, "FLAGS syntax error: <flag> <default>\n");
- return false;
- }
- if (test_server)
- fprintf(stdout, "FLAGS_RESET: [%s] [%s]\n", c_flag, c_default);
- int i_default = char_to_int(c_default);
- TPacketSetEventFlag p;
- strlcpy(p.szFlagName, c_flag, sizeof(p.szFlagName));
- p.lValue = i_default;
- db_clientdesc->DBPacket(HEADER_GD_SET_EVENT_FLAG, 0, &p, sizeof(TPacketSetEventFlag));
- }
- fclose(fp);
- return true;
- }
- return false;
- }
- #endif
main.cpp
- //search: extern void CancelReloadSpamEvent();
- //add after:
- #ifdef ENABLE_GAMEFLAG_RESET
- std::string st_flagFileName("FLAGS");
- #endif
- //search: signal_timer_enable(30);
- //add before:
- #ifdef ENABLE_GAMEFLAG_RESET
- if (!__ResetGameflags(st_flagFileName.c_str()))
- {
- fprintf(stderr, "Could not Load FLAGS Setting file.");
- exit(0);
- }
- #endif