pc_groups.hpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #ifndef PC_GROUPS_HPP
  4. #define PC_GROUPS_HPP
  5. #include <bitset>
  6. #include <map>
  7. #include <vector>
  8. #include "../common/cbasetypes.hpp"
  9. #include "../common/database.hpp"
  10. // Forward declaration from atcommands.hpp
  11. enum AtCommandType : uint8;
  12. void pc_group_pc_load(struct map_session_data *sd);
  13. void do_init_pc_groups(void);
  14. void do_final_pc_groups(void);
  15. void pc_groups_reload(void);
  16. enum e_pc_permission : uint32 {
  17. PC_PERM_TRADE = 0,
  18. PC_PERM_PARTY,
  19. PC_PERM_ALL_SKILL,
  20. PC_PERM_USE_ALL_EQUIPMENT,
  21. PC_PERM_SKILL_UNCONDITIONAL,
  22. PC_PERM_JOIN_ALL_CHAT,
  23. PC_PERM_NO_CHAT_KICK,
  24. PC_PERM_HIDE_SESSION,
  25. PC_PERM_WHO_DISPLAY_AID,
  26. PC_PERM_RECEIVE_HACK_INFO,
  27. PC_PERM_WARP_ANYWHERE,
  28. PC_PERM_VIEW_HPMETER,
  29. PC_PERM_VIEW_EQUIPMENT,
  30. PC_PERM_USE_CHECK,
  31. PC_PERM_USE_CHANGEMAPTYPE,
  32. PC_PERM_USE_ALL_COMMANDS,
  33. PC_PERM_RECEIVE_REQUESTS,
  34. PC_PERM_SHOW_BOSS,
  35. PC_PERM_DISABLE_PVM,
  36. PC_PERM_DISABLE_PVP,
  37. PC_PERM_DISABLE_CMD_DEAD,
  38. PC_PERM_CHANNEL_ADMIN,
  39. PC_PERM_TRADE_BOUNDED,
  40. PC_PERM_ITEM_UNCONDITIONAL,
  41. PC_PERM_ENABLE_COMMAND,
  42. PC_PERM_BYPASS_STAT_ONCLONE,
  43. PC_PERM_BYPASS_MAX_STAT,
  44. PC_PERM_ATTENDANCE,
  45. //.. add other here
  46. PC_PERM_MAX,
  47. };
  48. static const struct s_pcg_permission_name {
  49. const char *name;
  50. enum e_pc_permission permission;
  51. } pc_g_permission_name[PC_PERM_MAX] = {
  52. { "can_trade", PC_PERM_TRADE },
  53. { "can_party", PC_PERM_PARTY },
  54. { "all_skill", PC_PERM_ALL_SKILL },
  55. { "all_equipment", PC_PERM_USE_ALL_EQUIPMENT },
  56. { "skill_unconditional", PC_PERM_SKILL_UNCONDITIONAL },
  57. { "join_chat", PC_PERM_JOIN_ALL_CHAT },
  58. { "kick_chat", PC_PERM_NO_CHAT_KICK },
  59. { "hide_session", PC_PERM_HIDE_SESSION },
  60. { "who_display_aid", PC_PERM_WHO_DISPLAY_AID },
  61. { "hack_info", PC_PERM_RECEIVE_HACK_INFO },
  62. { "any_warp", PC_PERM_WARP_ANYWHERE },
  63. { "view_hpmeter", PC_PERM_VIEW_HPMETER },
  64. { "view_equipment", PC_PERM_VIEW_EQUIPMENT },
  65. { "use_check", PC_PERM_USE_CHECK },
  66. { "use_changemaptype", PC_PERM_USE_CHANGEMAPTYPE },
  67. { "all_commands", PC_PERM_USE_ALL_COMMANDS },
  68. { "receive_requests", PC_PERM_RECEIVE_REQUESTS },
  69. { "show_bossmobs", PC_PERM_SHOW_BOSS },
  70. { "disable_pvm", PC_PERM_DISABLE_PVM },
  71. { "disable_pvp", PC_PERM_DISABLE_PVP },
  72. { "disable_commands_when_dead", PC_PERM_DISABLE_CMD_DEAD },
  73. { "channel_admin", PC_PERM_CHANNEL_ADMIN },
  74. { "can_trade_bounded", PC_PERM_TRADE_BOUNDED },
  75. { "item_unconditional", PC_PERM_ITEM_UNCONDITIONAL },
  76. { "command_enable",PC_PERM_ENABLE_COMMAND },
  77. { "bypass_stat_onclone",PC_PERM_BYPASS_STAT_ONCLONE },
  78. { "bypass_max_stat",PC_PERM_BYPASS_MAX_STAT },
  79. { "attendance",PC_PERM_ATTENDANCE },
  80. };
  81. struct s_player_group{
  82. uint32 id;
  83. std::string name;
  84. uint32 level;
  85. bool log_commands;
  86. std::vector<std::string> commands;
  87. std::vector<std::string> char_commands;
  88. std::bitset<PC_PERM_MAX> permissions;
  89. uint32 index;
  90. public:
  91. bool can_use_command( const std::string& command, AtCommandType type );
  92. bool has_permission( e_pc_permission permission );
  93. bool should_log_commands();
  94. };
  95. class PlayerGroupDatabase : public TypesafeYamlDatabase<uint32, s_player_group>{
  96. private:
  97. std::map<uint32, std::vector<std::string>> inheritance;
  98. bool parseCommands( const ryml::NodeRef& node, std::vector<std::string>& commands );
  99. public:
  100. PlayerGroupDatabase() : TypesafeYamlDatabase( "PLAYER_GROUP_DB", 1 ){
  101. }
  102. const std::string getDefaultLocation() override;
  103. uint64 parseBodyNode( const ryml::NodeRef& node ) override;
  104. void loadingFinished() override;
  105. };
  106. extern PlayerGroupDatabase player_group_db;
  107. #endif /* PC_GROUPS_HPP */