Skip to content

Commit 9e93306

Browse files
committed
Release 1.0.0
2 parents d39dacc + f0bafae commit 9e93306

File tree

13 files changed

+150
-96
lines changed

13 files changed

+150
-96
lines changed

build.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
PLUGIN_NAME="class-manager"
44

5-
spcomp scripting/$PLUGIN_NAME.sp scripting/modules/*.sp -i scripting/include -o plugins/$PLUGIN_NAME.smx
5+
cd scripting
6+
spcomp $PLUGIN_NAME.sp -i include -o ../plugins/$PLUGIN_NAME.smx

scripting/class-manager.sp

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,47 +5,39 @@
55
#pragma semicolon 1
66
#pragma newdecls required
77

8-
#include "class"
9-
#include "team"
10-
#include "message"
11-
#include "menu"
8+
#include "cm/class"
9+
#include "cm/menu"
10+
#include "cm/message"
11+
#include "cm/team"
12+
13+
#include "modules/class.sp"
14+
#include "modules/console-variable.sp"
15+
#include "modules/menu.sp"
16+
#include "modules/message.sp"
17+
#include "modules/player.sp"
18+
#include "modules/team.sp"
19+
#include "modules/use-case.sp"
1220

1321
public Plugin myinfo = {
1422
name = "Class manager",
1523
author = "Dron-elektron",
1624
description = "Allows you to perform various operations on player classes",
17-
version = "0.1.1",
18-
url = ""
19-
}
20-
21-
char ADMIN_MENU[] = "adminmenu";
22-
TopMenu g_adminMenu = null;
25+
version = "1.0.0",
26+
url = "https://github.com/dronelektron/class-manager"
27+
};
2328

2429
public void OnPluginStart() {
25-
FindClassLimitConVars();
30+
Variable_FindClassLimits();
31+
AdminMenu_Create();
2632
LoadTranslations("class-manager.phrases");
27-
28-
TopMenu topMenu;
29-
30-
if (LibraryExists(ADMIN_MENU) && (topMenu = GetAdminTopMenu()) != null) {
31-
OnAdminMenuReady(topMenu);
32-
}
3333
}
3434

3535
public void OnLibraryRemoved(const char[] name) {
36-
if (StrEqual(name, ADMIN_MENU, false)) {
37-
g_adminMenu = null;
36+
if (strcmp(name, ADMIN_MENU) == 0) {
37+
AdminMenu_Destroy();
3838
}
3939
}
4040

41-
public void OnAdminMenuReady(Handle aTopMenu) {
42-
TopMenu topMenu = TopMenu.FromHandle(aTopMenu);
43-
44-
if (topMenu == g_adminMenu) {
45-
return;
46-
}
47-
48-
g_adminMenu = topMenu;
49-
50-
AddClassManagerToAdminMenu();
41+
public void OnAdminMenuReady(Handle topMenu) {
42+
AdminMenu_OnReady(topMenu);
5143
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
#endif
44
#define _class_included
55

6+
#define CLASS_NAME_SIZE 32
7+
#define CLASS_DISABLED 0
8+
#define CLASS_UNLIMITED -1
9+
610
enum {
711
Class_Unknown = -1,
812
Class_Rifleman,
@@ -11,4 +15,4 @@ enum {
1115
Class_Sniper,
1216
Class_Mg,
1317
Class_Rocket
14-
}
18+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,5 @@
2020
#define ALLIES "Allies"
2121
#define AXIS "Axis"
2222
#define BOTH_TEAMS "Both teams"
23+
24+
#define ADMIN_MENU "adminmenu"
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
#endif
44
#define _team_included
55

6+
#define TEAM_NAME_SIZE 32
7+
68
enum {
79
Team_Unassigned = 0,
810
Team_Spectator,
911
Team_Allies,
1012
Team_Axis
11-
}
13+
};

scripting/modules/class.sp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
static char g_classNames[][] = {RIFLEMAN, ASSAULT, SUPPORT, SNIPER, MG, ROCKET};
2+
3+
void Class_GetName(int class, char[] className) {
4+
strcopy(className, CLASS_NAME_SIZE, g_classNames[class]);
5+
}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,26 @@ static char g_limitAxisConVarNames[][] = {
1919
static ConVar g_limitAlliesConVars[Class_Rocket + 1] = {null, ...};
2020
static ConVar g_limitAxisConVars[Class_Rocket + 1] = {null, ...};
2121

22-
void FindClassLimitConVars() {
22+
void Variable_FindClassLimits() {
2323
for (int i = Class_Rifleman; i <= Class_Rocket; i++) {
2424
g_limitAlliesConVars[i] = FindConVar(g_limitAlliesConVarNames[i]);
2525
g_limitAxisConVars[i] = FindConVar(g_limitAxisConVarNames[i]);
2626

27-
g_limitAlliesConVars[i].AddChangeHook(ConVarChanged_ClassLimit);
28-
g_limitAxisConVars[i].AddChangeHook(ConVarChanged_ClassLimit);
27+
g_limitAlliesConVars[i].AddChangeHook(Variable_ClassLimitChanged);
28+
g_limitAxisConVars[i].AddChangeHook(Variable_ClassLimitChanged);
2929
}
3030
}
3131

32-
void ConVarChanged_ClassLimit(ConVar conVar, char[] oldValue, char[] newValue) {
32+
void Variable_ClassLimitChanged(ConVar conVar, char[] oldValue, char[] newValue) {
3333
int team;
3434
int class;
3535
int limit = StringToInt(newValue);
3636

37-
GetConVarTeamAndClass(conVar, team, class);
38-
MovePlayersToSpectator(team, class, limit);
37+
Variable_GetTeamAndClass(conVar, team, class);
38+
UseCase_MoveToSpectator(team, class, limit);
3939
}
4040

41-
void GetConVarTeamAndClass(ConVar conVar, int& team, int& class) {
41+
void Variable_GetTeamAndClass(ConVar conVar, int& team, int& class) {
4242
team = Team_Unassigned;
4343
class = Class_Unknown;
4444

@@ -59,7 +59,7 @@ void GetConVarTeamAndClass(ConVar conVar, int& team, int& class) {
5959
}
6060
}
6161

62-
void SetConVarValue(int team, int class, int limit) {
62+
void Variable_SetClassLimit(int team, int class, int limit) {
6363
if (team == Team_Allies) {
6464
g_limitAlliesConVars[class].SetInt(limit);
6565
} else if (team == Team_Axis) {

scripting/modules/menu.sp

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,65 @@
1+
static TopMenu g_adminMenu = null;
2+
13
static TopMenuObject g_classManagerCategory = INVALID_TOPMENUOBJECT;
24
static TopMenuObject g_menuItemClasses[Class_Rocket + 1] = {INVALID_TOPMENUOBJECT, ...};
35

46
static int g_selectedClass[MAXPLAYERS + 1] = {Class_Unknown, ...};
57
static int g_selectedLimit[MAXPLAYERS + 1] = {-1, ...};
68

7-
static char teamNames[][] = {ALLIES, AXIS};
8-
static char classNames[][] = {RIFLEMAN, ASSAULT, SUPPORT, SNIPER, MG, ROCKET};
9+
void AdminMenu_Create() {
10+
TopMenu topMenu = GetAdminTopMenu();
11+
12+
if (LibraryExists(ADMIN_MENU) && topMenu != null) {
13+
OnAdminMenuReady(topMenu);
14+
}
15+
}
16+
17+
void AdminMenu_Destroy() {
18+
g_adminMenu = null;
19+
}
20+
21+
void AdminMenu_OnReady(Handle topMenuHandle) {
22+
TopMenu topMenu = TopMenu.FromHandle(topMenuHandle);
23+
24+
if (topMenu == g_adminMenu) {
25+
return;
26+
}
27+
28+
g_adminMenu = topMenu;
29+
30+
AdminMenu_Fill();
31+
}
932

10-
void AddClassManagerToAdminMenu() {
11-
g_classManagerCategory = g_adminMenu.AddCategory(CLASS_MANAGER, TopMenuHandler_ClassManager);
33+
void AdminMenu_Fill() {
34+
g_classManagerCategory = g_adminMenu.AddCategory(CLASS_MANAGER, AdminMenuHandler_ClassManager);
1235

1336
if (g_classManagerCategory == INVALID_TOPMENUOBJECT) {
1437
return;
1538
}
1639

40+
char className[CLASS_NAME_SIZE];
41+
1742
for (int class = Class_Rifleman; class <= Class_Rocket; class++) {
18-
g_menuItemClasses[class] = g_adminMenu.AddItem(classNames[class], TopMenuHandler_ClassManager, g_classManagerCategory);
43+
Class_GetName(class, className);
44+
45+
g_menuItemClasses[class] = g_adminMenu.AddItem(className, AdminMenuHandler_ClassManager, g_classManagerCategory);
1946
}
2047
}
2148

22-
public void TopMenuHandler_ClassManager(TopMenu topmenu, TopMenuAction action, TopMenuObject topobj_id, int param, char[] buffer, int maxlength) {
49+
public void AdminMenuHandler_ClassManager(TopMenu topmenu, TopMenuAction action, TopMenuObject topobj_id, int param, char[] buffer, int maxlength) {
2350
if (action == TopMenuAction_DisplayOption) {
2451
if (topobj_id == g_classManagerCategory) {
2552
Format(buffer, maxlength, "%T", CLASS_MANAGER, param);
2653

2754
return;
2855
}
2956

57+
char className[CLASS_NAME_SIZE];
58+
3059
for (int class = Class_Rifleman; class <= Class_Rocket; class++) {
3160
if (topobj_id == g_menuItemClasses[class]) {
32-
Format(buffer, maxlength, "%T", classNames[class], param);
61+
Class_GetName(class, className);
62+
Format(buffer, maxlength, "%T", className, param);
3363

3464
break;
3565
}
@@ -42,22 +72,22 @@ public void TopMenuHandler_ClassManager(TopMenu topmenu, TopMenuAction action, T
4272
for (int class = Class_Rifleman; class <= Class_Rocket; class++) {
4373
if (topobj_id == g_menuItemClasses[class]) {
4474
g_selectedClass[param] = class;
45-
CreateClassActionMenu(param);
75+
Menu_ClassAction(param);
4676

4777
break;
4878
}
4979
}
5080
}
5181
}
5282

53-
void CreateClassActionMenu(int client) {
83+
void Menu_ClassAction(int client) {
5484
Menu menu = new Menu(MenuHandler_ClassAction);
5585

5686
menu.SetTitle("%T", SELECT_ACTION, client);
5787

58-
AddTranslatedMenuItem(menu, ENABLE_CLASS, ENABLE_CLASS, client);
59-
AddTranslatedMenuItem(menu, DISABLE_CLASS, DISABLE_CLASS, client);
60-
AddTranslatedMenuItem(menu, SET_CLASS_LIMIT, SET_CLASS_LIMIT, client);
88+
Menu_AddItem(menu, ENABLE_CLASS, ENABLE_CLASS, client);
89+
Menu_AddItem(menu, DISABLE_CLASS, DISABLE_CLASS, client);
90+
Menu_AddItem(menu, SET_CLASS_LIMIT, SET_CLASS_LIMIT, client);
6191

6292
menu.ExitBackButton = true;
6393
menu.Display(client, MENU_TIME_FOREVER);
@@ -70,15 +100,15 @@ int MenuHandler_ClassAction(Menu menu, MenuAction action, int param1, int param2
70100
menu.GetItem(param2, info, sizeof(info));
71101

72102
if (StrEqual(info, ENABLE_CLASS)) {
73-
g_selectedLimit[param1] = -1;
103+
g_selectedLimit[param1] = CLASS_UNLIMITED;
74104

75-
CreateTeamMenu(param1);
105+
Menu_TeamAction(param1);
76106
} else if (StrEqual(info, DISABLE_CLASS)) {
77-
g_selectedLimit[param1] = 0;
107+
g_selectedLimit[param1] = CLASS_DISABLED;
78108

79-
CreateTeamMenu(param1);
109+
Menu_TeamAction(param1);
80110
} else if (StrEqual(info, SET_CLASS_LIMIT)) {
81-
CreateClassLimitMenu(param1);
111+
Menu_ClassLimit(param1);
82112
}
83113
} else {
84114
MenuHandler_Default(menu, action, param1, param2);
@@ -87,7 +117,7 @@ int MenuHandler_ClassAction(Menu menu, MenuAction action, int param1, int param2
87117
return 0;
88118
}
89119

90-
void CreateClassLimitMenu(int client) {
120+
void Menu_ClassLimit(int client) {
91121
Menu menu = new Menu(MenuHandler_ClassLimit);
92122
char info[TEXT_BUFFER_MAX_SIZE];
93123

@@ -110,22 +140,22 @@ int MenuHandler_ClassLimit(Menu menu, MenuAction action, int param1, int param2)
110140
menu.GetItem(param2, info, sizeof(info));
111141
g_selectedLimit[param1] = StringToInt(info);
112142

113-
CreateTeamMenu(param1);
143+
Menu_TeamAction(param1);
114144
} else {
115145
MenuHandler_Default(menu, action, param1, param2);
116146
}
117147

118148
return 0;
119149
}
120150

121-
void CreateTeamMenu(int client) {
151+
void Menu_TeamAction(int client) {
122152
Menu menu = new Menu(MenuHandler_TeamAction);
123153

124154
menu.SetTitle("%T", "Select team", client);
125155

126-
AddTranslatedMenuItem(menu, ALLIES, ALLIES, client);
127-
AddTranslatedMenuItem(menu, AXIS, AXIS, client);
128-
AddTranslatedMenuItem(menu, BOTH_TEAMS, BOTH_TEAMS, client);
156+
Menu_AddItem(menu, ALLIES, ALLIES, client);
157+
Menu_AddItem(menu, AXIS, AXIS, client);
158+
Menu_AddItem(menu, BOTH_TEAMS, BOTH_TEAMS, client);
129159

130160
menu.ExitBackButton = true;
131161
menu.Display(client, MENU_TIME_FOREVER);
@@ -140,16 +170,12 @@ int MenuHandler_TeamAction(Menu menu, MenuAction action, int param1, int param2)
140170
menu.GetItem(param2, info, sizeof(info));
141171

142172
if (StrEqual(info, ALLIES)) {
143-
SetConVarValue(Team_Allies, class, limit);
144-
NotifyAboutClassLimitChange(param1, Team_Allies, class, limit);
173+
UseCase_ChangeClassLimit(param1, Team_Allies, class, limit);
145174
} else if (StrEqual(info, AXIS)) {
146-
SetConVarValue(Team_Axis, class, limit);
147-
NotifyAboutClassLimitChange(param1, Team_Axis, class, limit);
175+
UseCase_ChangeClassLimit(param1, Team_Axis, class, limit);
148176
} else if (StrEqual(info, BOTH_TEAMS)) {
149-
SetConVarValue(Team_Allies, class, limit);
150-
NotifyAboutClassLimitChange(param1, Team_Allies, class, limit);
151-
SetConVarValue(Team_Axis, class, limit);
152-
NotifyAboutClassLimitChange(param1, Team_Axis, class, limit);
177+
UseCase_ChangeClassLimit(param1, Team_Allies, class, limit);
178+
UseCase_ChangeClassLimit(param1, Team_Axis, class, limit);
153179
}
154180
} else {
155181
MenuHandler_Default(menu, action, param1, param2);
@@ -168,7 +194,7 @@ void MenuHandler_Default(Menu menu, MenuAction action, int param1, int param2) {
168194
}
169195
}
170196

171-
void AddTranslatedMenuItem(Menu menu, char[] info, any ...) {
197+
void Menu_AddItem(Menu menu, char[] info, any ...) {
172198
char item[TEXT_BUFFER_MAX_SIZE];
173199

174200
VFormat(item, sizeof(item), "%T", 3);

scripting/modules/message.sp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1-
void NotifyAboutClassLimitChange(int client, int team, int class, int limit) {
2-
ShowActivity2(client, PREFIX, "%t", "Class limit was changed", classNames[class], teamNames[team - 2], limit);
3-
LogAction(client, -1, "\"%L\" changed class limit of '%s' in team '%s' to '%d'", client, classNames[class], teamNames[team - 2], limit);
1+
void Message_ClassLimitChanged(int client, int team, int class, int limit) {
2+
char teamName[TEAM_NAME_SIZE];
3+
char className[CLASS_NAME_SIZE];
4+
5+
Team_GetName(team - 2, teamName);
6+
Class_GetName(class, className);
7+
MessageActivity_ClassLimitChanged(client, teamName, className, limit);
8+
MessageLog_ClassLimitChanged(client, teamName, className, limit);
9+
}
10+
11+
void MessageActivity_ClassLimitChanged(int client, const char[] teamName, const char[] className, int limit) {
12+
ShowActivity2(client, PREFIX, "%t", "Class limit was changed", className, teamName, limit);
13+
}
14+
15+
void MessageLog_ClassLimitChanged(int client, const char[] teamName, const char[] className, int limit) {
16+
LogAction(client, -1, "\"%L\" changed class limit of '%s' in team '%s' to '%d'", client, className, teamName, limit);
417
}
518

6-
void NotifyAboutSpectatorTeam(int client) {
19+
void MessagePrint_YouWasMovedToSpectators(int client) {
720
PrintToChat(client, "%s%t", PREFIX, "You was moved to spectator team");
821
}

0 commit comments

Comments
 (0)