Skip to content

Commit 7b8fce2

Browse files
authored
Merge branch 'master' into master
2 parents 1b0249f + e702a2b commit 7b8fce2

12 files changed

Lines changed: 226 additions & 38 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Ignore a pasta plugins
2+
plugins

addons/sourcemod/scripting/weapons.sp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
/* CS:GO Weapons&Knives SourceMod Plugin
1+
/* CS:GO Weapons&Knives SourceMod Plugin
22
*
3-
* Copyright (C) 2017 Kağan 'kgns' Üstüngel
3+
* Copyright (C) 2017 Kağan 'kgns' Üstüngel
44
*
55
* This program is free software: you can redistribute it and/or modify it
66
* under the terms of the GNU General Public License as published by the Free
@@ -39,15 +39,14 @@
3939

4040
#define UPDATE_URL "https://raw.githubusercontent.com/kgns/weapons/master/addons/sourcemod/updatefile.txt"
4141

42-
4342
//#define DEBUG
4443

4544
public Plugin myinfo =
4645
{
4746
name = "Weapons & Knives",
4847
author = "kgns | oyunhost.net",
4948
description = "All in one CS:GO weapon skin management",
50-
version = "1.7.7",
49+
version = "1.7.8",
5150
url = "https://github.com/kgns"
5251
};
5352

@@ -81,30 +80,31 @@ public void OnPluginStart()
8180

8281
LoadTranslations("weapons.phrases");
8382

84-
g_Cvar_DBConnection = CreateConVar("sm_weapons_db_connection", "storage-local", "Database connection name in databases.cfg to use");
85-
g_Cvar_TablePrefix = CreateConVar("sm_weapons_table_prefix", "", "Prefix for database table (example: 'xyz_')");
86-
g_Cvar_ChatPrefix = CreateConVar("sm_weapons_chat_prefix", "[oyunhost.net]", "Prefix for chat messages");
87-
g_Cvar_KnifeStatTrakMode = CreateConVar("sm_weapons_knife_stattrak_mode", "0", "0: All knives show the same StatTrak counter (total knife kills) 1: Each type of knife shows its own separate StatTrak counter");
88-
g_Cvar_EnableFloat = CreateConVar("sm_weapons_enable_float", "1", "Enable/Disable weapon float options");
89-
g_Cvar_EnableNameTag = CreateConVar("sm_weapons_enable_nametag", "1", "Enable/Disable name tag options");
90-
g_Cvar_EnableStatTrak = CreateConVar("sm_weapons_enable_stattrak", "1", "Enable/Disable StatTrak options");
83+
g_Cvar_DBConnection = CreateConVar("sm_weapons_db_connection", "storage-local", "Database connection name in databases.cfg to use");
84+
g_Cvar_TablePrefix = CreateConVar("sm_weapons_table_prefix", "", "Prefix for database table (example: 'xyz_')");
85+
g_Cvar_ChatPrefix = CreateConVar("sm_weapons_chat_prefix", "[oyunhost.net]", "Prefix for chat messages");
86+
g_Cvar_KnifeStatTrakMode = CreateConVar("sm_weapons_knife_stattrak_mode", "0", "0: All knives show the same StatTrak counter (total knife kills) 1: Each type of knife shows its own separate StatTrak counter");
87+
g_Cvar_EnableFloat = CreateConVar("sm_weapons_enable_float", "1", "Enable/Disable weapon float options");
88+
g_Cvar_EnableNameTag = CreateConVar("sm_weapons_enable_nametag", "1", "Enable/Disable name tag options");
89+
g_Cvar_EnableStatTrak = CreateConVar("sm_weapons_enable_stattrak", "1", "Enable/Disable StatTrak options");
9190
g_Cvar_EnableSeed = CreateConVar("sm_weapons_enable_seed", "1", "Enable/Disable Seed options");
9291
g_Cvar_EnableSearch = CreateConVar("sm_weapons_enable_search", "1", "Enable/Disable Search Function");
9392
g_Cvar_FloatIncrementSize = CreateConVar("sm_weapons_float_increment_size", "0.05", "Increase/Decrease by value for weapon float");
9493
g_Cvar_EnableWeaponOverwrite = CreateConVar("sm_weapons_enable_overwrite", "1", "Enable/Disable players overwriting other players' weapons (picked up from the ground) by using !ws command");
9594
g_Cvar_GracePeriod = CreateConVar("sm_weapons_grace_period", "0", "Grace period in terms of seconds counted after round start for allowing the use of !ws command. 0 means no restrictions");
9695
g_Cvar_InactiveDays = CreateConVar("sm_weapons_inactive_days", "30", "Number of days before a player (SteamID) is marked as inactive and his data is deleted. (0 or any negative value to disable deleting)");
96+
g_Cvar_EnableC4 = CreateConVar("sm_weapons_enable_c4", "1", "Enable/Disable C4 Skins");
97+
g_Cvar_EnableAllSkins = CreateConVar("sm_weapons_enable_all_skins", "1", "Enable/Disable showing all skins in menu");
9798

9899
AutoExecConfig(true, "weapons");
99100

100-
RegConsoleCmd("buyammo1", CommandWeaponSkins);
101101
RegConsoleCmd("sm_ws", CommandWeaponSkins);
102-
RegConsoleCmd("buyammo2", CommandKnife);
103102
RegConsoleCmd("sm_knife", CommandKnife);
104103
RegConsoleCmd("sm_kf", CommandKnife);
105104
RegConsoleCmd("sm_nametag", CommandNameTag);
106105
RegConsoleCmd("sm_wslang", CommandWSLang);
107106
RegConsoleCmd("sm_seed", CommandSeedMenu);
107+
108108
RegAdminCmd("sm_wsreset", CommandResetWeaponSkins, ADMFLAG_ROOT, "Resets weapon skins and knife of a specific player.");
109109

110110
PTaH(PTaH_GiveNamedItemPre, Hook, GiveNamedItemPre);
@@ -332,7 +332,7 @@ void SetWeaponProps(int client, int entity)
332332
static int IDHigh = 16384;
333333
SetEntProp(entity, Prop_Send, "m_iItemIDLow", -1);
334334
SetEntProp(entity, Prop_Send, "m_iItemIDHigh", IDHigh++);
335-
SetEntProp(entity, Prop_Send, "m_nFallbackPaintKit", g_iSkins[client][index] == -1 ? GetRandomSkin(client, index) : g_iSkins[client][index]);
335+
SetEntProp(entity, Prop_Send, "m_nFallbackPaintKit", g_iSkins[client][index] == -1 ? GetRandomSkin(client, index) : g_iSkins[client][index] == -2 ? GetRandomAllSkin(client, index) : g_iSkins[client][index]);
336336
SetEntPropFloat(entity, Prop_Send, "m_flFallbackWear", !g_bEnableFloat || g_fFloatValue[client][index] == 0.0 ? 0.000001 : g_fFloatValue[client][index] == 1.0 ? 0.999999 : g_fFloatValue[client][index]);
337337
if (g_bEnableSeed && g_iWeaponSeed[client][index] != -1)
338338
{

addons/sourcemod/scripting/weapons/config.sp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,21 @@ public void ReadConfig()
7070
menuWeapons[langCounter][k].AddItem("-1", "Random");
7171
menuWeapons[langCounter][k].ExitBackButton = true;
7272
}
73+
74+
if(g_bAllSkins) {
75+
for (int k = 0; k < sizeof(g_WeaponClasses); k++)
76+
{
77+
if(menuWeaponsAll[langCounter][k] != null)
78+
{
79+
delete menuWeaponsAll[langCounter][k];
80+
}
81+
menuWeaponsAll[langCounter][k] = new Menu(WeaponsMenuAllHandler, MENU_ACTIONS_DEFAULT|MenuAction_DisplayItem);
82+
menuWeaponsAll[langCounter][k].SetTitle("%T (%T)", g_WeaponClasses[k], LANG_SERVER, "AllSkins", LANG_SERVER);
83+
menuWeaponsAll[langCounter][k].AddItem("0", "Default");
84+
menuWeaponsAll[langCounter][k].AddItem("-2", "Random");
85+
menuWeaponsAll[langCounter][k].ExitBackButton = true;
86+
}
87+
}
7388

7489
int counter = 0;
7590
char weaponTemp[20];
@@ -78,6 +93,7 @@ public void ReadConfig()
7893
char name[64];
7994
char index[5];
8095
char classes[1024];
96+
int weaponIndex;
8197

8298
KvGetSectionName(kv, name, sizeof(name));
8399
KvGetString(kv, "classes", classes, sizeof(classes));
@@ -110,6 +126,16 @@ public void ReadConfig()
110126
menuSkins[counter].AddItem(weaponIndexStr, weaponName);
111127
}
112128

129+
weaponIndex = k;
130+
}
131+
}
132+
133+
if(g_bAllSkins) {
134+
char nameWeapon[64];
135+
Format(nameWeapon, sizeof(nameWeapon), "%s (%T)", name, g_WeaponClasses[weaponIndex], LANG_SERVER);
136+
for (int k = 0; k < sizeof(g_WeaponClasses); k++)
137+
{
138+
menuWeaponsAll[langCounter][k].AddItem(index, nameWeapon);
113139
}
114140
}
115141

addons/sourcemod/scripting/weapons/database.sp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,14 @@ void CreateMainTable(bool mysql, bool recreate = false)
485485
knife_skeleton_trak int(1) NOT NULL DEFAULT '0', \
486486
knife_skeleton_trak_count int(10) NOT NULL DEFAULT '0', \
487487
knife_skeleton_tag varchar(256) NOT NULL DEFAULT '', \
488-
knife_skeleton_seed int(10) NOT NULL DEFAULT '-1')");
488+
knife_skeleton_seed int(10) NOT NULL DEFAULT '-1', ");
489+
index += FormatEx(createQuery[index], sizeof(createQuery) - index, " \
490+
c4 int(4) NOT NULL DEFAULT '0', \
491+
c4_float decimal(3,2) NOT NULL DEFAULT '0.0', \
492+
c4_trak int(1) NOT NULL DEFAULT '0', \
493+
c4_trak_count int(10) NOT NULL DEFAULT '0', \
494+
c4_tag varchar(256) NOT NULL DEFAULT '', \
495+
c4_seed int(10) NOT NULL DEFAULT '-1')");
489496

490497
if (mysql)
491498
{
@@ -552,7 +559,10 @@ public void T_ReCreateMainTableCallback(Database database, DBResultSet results,
552559
knife_gypsy_jackknife_trak_count, knife_gypsy_jackknife_tag, knife_stiletto, knife_stiletto_float, knife_stiletto_trak, \
553560
knife_stiletto_trak_count, knife_stiletto_tag, knife_widowmaker, knife_widowmaker_float, knife_widowmaker_trak, \
554561
knife_widowmaker_trak_count, knife_widowmaker_tag, mp5sd, mp5sd_float, mp5sd_trak, mp5sd_trak_count, mp5sd_tag, knife_css, \
555-
knife_css_float, knife_css_trak, knife_css_trak_count, knife_css_tag, knife_css_seed) \
562+
knife_css_float, knife_css_trak, knife_css_trak_count, knife_css_tag, knife_css_seed, ");
563+
index += FormatEx(migrateQuery[index], sizeof(migrateQuery) - index, " \
564+
c4, \
565+
c4_float, c4_trak, c4_trak_count, c4_tag, c4_seed) \
556566
SELECT * FROM %sweapons_tmp", g_TablePrefix);
557567

558568
db.Query(T_MigrateOldDataCallback, migrateQuery, mysql, DBPrio_High);
@@ -609,6 +619,7 @@ public void T_CreateMainTableCallback(Database database, DBResultSet results, co
609619
{
610620
g_iMigrationStep = 0;
611621
AddWeaponColumns(mysql, "knife_ursus", false);
622+
AddWeaponColumns(mysql, "c4", true);
612623

613624
char createQuery[512];
614625
Format(createQuery, sizeof(createQuery), " \
@@ -695,7 +706,8 @@ public void T_SeedColumnCallback(Database database, DBResultSet results, const c
695706
ADD COLUMN knife_gypsy_jackknife_seed int(10) NOT NULL DEFAULT '-1' AFTER knife_gypsy_jackknife_tag, \
696707
ADD COLUMN knife_stiletto_seed int(10) NOT NULL DEFAULT '-1' AFTER knife_stiletto_tag, \
697708
ADD COLUMN knife_widowmaker_seed int(10) NOT NULL DEFAULT '-1' AFTER knife_widowmaker_tag, \
698-
ADD COLUMN mp5sd_seed int(10) NOT NULL DEFAULT '-1' AFTER mp5sd_tag");
709+
ADD COLUMN mp5sd_seed int(10) NOT NULL DEFAULT '-1' AFTER mp5sd_tag, \
710+
ADD COLUMN c4_seed int(10) NOT NULL DEFAULT '-1' AFTER c4_tag");
699711

700712
db.Query(T_SeedConfirmationCallback, seedColumnsQuery, mysql, DBPrio_High);
701713
}

addons/sourcemod/scripting/weapons/forwards.sp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public void OnConfigsExecuted()
4949
g_iFloatIncrementPercentage = RoundFloat(g_fFloatIncrementSize * 100.0);
5050
g_bOverwriteEnabled = g_Cvar_EnableWeaponOverwrite.BoolValue;
5151
g_iGracePeriod = g_Cvar_GracePeriod.IntValue;
52+
g_bEnableC4 = g_Cvar_EnableC4.BoolValue;
53+
g_bAllSkins = g_Cvar_EnableAllSkins.BoolValue;
5254
if(g_iGracePeriod > 0)
5355
{
5456
HookEvent("round_start", OnRoundStart, EventHookMode_PostNoCopy);

addons/sourcemod/scripting/weapons/globals.sp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ char g_WeaponClasses[][] = {
2222
/*28*/ "weapon_ssg08", /*29*/ "weapon_aug", /*30*/ "weapon_sg556", /*31*/ "weapon_scar20", /*32*/ "weapon_g3sg1", /*33*/ "weapon_knife_karambit", /*34*/ "weapon_knife_m9_bayonet", /*35*/ "weapon_bayonet",
2323
/*36*/ "weapon_knife_survival_bowie", /*37*/ "weapon_knife_butterfly", /*38*/ "weapon_knife_flip", /*39*/ "weapon_knife_push", /*40*/ "weapon_knife_tactical", /*41*/ "weapon_knife_falchion", /*42*/ "weapon_knife_gut",
2424
/*43*/ "weapon_knife_ursus", /*44*/ "weapon_knife_gypsy_jackknife", /*45*/ "weapon_knife_stiletto", /*46*/ "weapon_knife_widowmaker", /*47*/ "weapon_mp5sd", /*48*/ "weapon_knife_css", /*49*/ "weapon_knife_cord",
25-
/*50*/ "weapon_knife_canis", /*51*/ "weapon_knife_outdoor", /*52*/ "weapon_knife_skeleton"
25+
/*50*/ "weapon_knife_canis", /*51*/ "weapon_knife_outdoor", /*52*/ "weapon_knife_skeleton", /*53*/ "weapon_c4"
2626
};
2727

2828
int g_iWeaponDefIndex[] = {
@@ -32,7 +32,7 @@ int g_iWeaponDefIndex[] = {
3232
/*28*/ 40, /*29*/ 8, /*30*/ 39, /*31*/ 38, /*32*/ 11, /*33*/ 507, /*34*/ 508, /*35*/ 500,
3333
/*36*/ 514, /*37*/ 515, /*38*/ 505, /*39*/ 516, /*40*/ 509, /*41*/ 512, /*42*/ 506,
3434
/*43*/ 519, /*44*/ 520, /*45*/ 522, /*46*/ 523, /*47*/ 23, /*48*/ 503, /*49*/ 517,
35-
/*50*/ 518, /*51*/ 521, /*52*/ 525
35+
/*50*/ 518, /*51*/ 521, /*52*/ 525, /*53*/ 49
3636
};
3737

3838
int g_iKnifeIndices[] = {
@@ -87,6 +87,12 @@ int g_iGracePeriod;
8787
ConVar g_Cvar_InactiveDays;
8888
int g_iGraceInactiveDays;
8989

90+
ConVar g_Cvar_EnableC4;
91+
int g_bEnableC4;
92+
93+
ConVar g_Cvar_EnableAllSkins;
94+
int g_bAllSkins;
95+
9096
int g_iSkins[MAXPLAYERS+1][sizeof(g_WeaponClasses)];
9197
int g_iStatTrak[MAXPLAYERS+1][sizeof(g_WeaponClasses)];
9298
int g_iStatTrakCount[MAXPLAYERS+1][sizeof(g_WeaponClasses)];
@@ -124,6 +130,7 @@ char g_MigrationWeapons[][] = {
124130
char g_Language[MAX_LANG][32];
125131
int g_iClientLanguage[MAXPLAYERS+1];
126132
Menu menuWeapons[MAX_LANG][sizeof(g_WeaponClasses)];
133+
Menu menuWeaponsAll[MAX_LANG][sizeof(g_WeaponClasses)];
127134
Menu menuPlayerSearchTemp[MAXPLAYERS+1];
128135

129136
StringMap g_smWeaponIndex;

addons/sourcemod/scripting/weapons/helpers.sp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ int GetRandomSkin(int client, int index)
4848
return StringToInt(idStr);
4949
}
5050

51+
int GetRandomAllSkin(int client, int index)
52+
{
53+
int max = menuWeaponsAll[g_iClientLanguage[client]][index].ItemCount;
54+
int random = GetRandomInt(2, max);
55+
char idStr[6];
56+
menuWeaponsAll[g_iClientLanguage[client]][index].GetItem(random, idStr, sizeof(idStr));
57+
return StringToInt(idStr);
58+
}
59+
5160
int GetRandomKnife()
5261
{
5362
return g_iKnifeIndices[GetRandomInt(0, sizeof(g_iKnifeIndices) - 1)];

addons/sourcemod/scripting/weapons/menus.sp

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
/* CS:GO Weapons&Knives SourceMod Plugin
1+
/* CS:GO Weapons&Knives SourceMod Plugin
22
*
3-
* Copyright (C) 2017 Kağan 'kgns' Üstüngel
3+
* Copyright (C) 2017 Kağan 'kgns' Üstüngel
44
*
55
* This program is free software: you can redistribute it and/or modify it
66
* under the terms of the GNU General Public License as published by the Free
@@ -63,6 +63,76 @@ public int WeaponsMenuHandler(Menu menu, MenuAction action, int client, int sele
6363
Format(display, sizeof(display), "%T", "RandomSkin", client);
6464
return RedrawMenuItem(display);
6565
}
66+
else if (StrEqual(info, "-2"))
67+
{
68+
Format(display, sizeof(display), "%T", "RandomAllSkin", client);
69+
return RedrawMenuItem(display);
70+
}
71+
}
72+
}
73+
case MenuAction_Cancel:
74+
{
75+
if (IsClientInGame(client) && selection == MenuCancel_ExitBack)
76+
{
77+
int menuTime;
78+
if((menuTime = GetRemainingGracePeriodSeconds(client)) >= 0)
79+
{
80+
CreateWeaponMenu(client).Display(client, menuTime);
81+
}
82+
}
83+
}
84+
}
85+
return 0;
86+
}
87+
88+
public int WeaponsMenuAllHandler(Menu menu, MenuAction action, int client, int selection)
89+
{
90+
switch(action)
91+
{
92+
case MenuAction_Select:
93+
{
94+
if(IsClientInGame(client))
95+
{
96+
int index = g_iIndex[client];
97+
98+
char skinIdStr[32];
99+
menu.GetItem(selection, skinIdStr, sizeof(skinIdStr));
100+
int skinId = StringToInt(skinIdStr);
101+
102+
g_iSkins[client][index] = skinId;
103+
char updateFields[256];
104+
char weaponName[32];
105+
RemoveWeaponPrefix(g_WeaponClasses[index], weaponName, sizeof(weaponName));
106+
Format(updateFields, sizeof(updateFields), "%s = %d", weaponName, skinId);
107+
UpdatePlayerData(client, updateFields);
108+
109+
RefreshWeapon(client, index);
110+
111+
DataPack pack;
112+
CreateDataTimer(0.5, WeaponsMenuTimer, pack);
113+
pack.WriteCell(menu);
114+
pack.WriteCell(GetClientUserId(client));
115+
pack.WriteCell(GetMenuSelectionPosition());
116+
}
117+
}
118+
case MenuAction_DisplayItem:
119+
{
120+
if(IsClientInGame(client))
121+
{
122+
char info[32];
123+
char display[64];
124+
menu.GetItem(selection, info, sizeof(info));
125+
126+
if (StrEqual(info, "0"))
127+
{
128+
Format(display, sizeof(display), "%T", "DefaultSkin", client);
129+
return RedrawMenuItem(display);
130+
}
131+
else if (StrEqual(info, "-2"))
132+
{
133+
Format(display, sizeof(display), "%T", "RandomSkin", client);
134+
return RedrawMenuItem(display);
135+
}
66136
}
67137
}
68138
case MenuAction_Cancel:
@@ -115,6 +185,14 @@ public int WeaponMenuHandler(Menu menu, MenuAction action, int client, int selec
115185
menuWeapons[g_iClientLanguage[client]][g_iIndex[client]].Display(client, menuTime);
116186
}
117187
}
188+
if(StrEqual(buffer, "skinall"))
189+
{
190+
int menuTime;
191+
if((menuTime = GetRemainingGracePeriodSeconds(client)) >= 0)
192+
{
193+
menuWeaponsAll[g_iClientLanguage[client]][g_iIndex[client]].Display(client, menuTime);
194+
}
195+
}
118196
else if(StrEqual(buffer, "float"))
119197
{
120198
int menuTime;
@@ -291,7 +369,6 @@ public int FloatMenuHandler(Menu menu, MenuAction action, int client, int select
291369

292370
public Action FloatTimer(Handle timer, DataPack pack)
293371
{
294-
295372
ResetPack(pack);
296373
int clientIndex = GetClientOfUserId(pack.ReadCell());
297374
int index = pack.ReadCell();
@@ -632,6 +709,7 @@ Menu CreateAllWeaponsMenu(int client)
632709
char name[32];
633710
for (int i = 0; i < sizeof(g_WeaponClasses); i++)
634711
{
712+
if (!g_bEnableC4 && StrEqual(g_WeaponClasses[i], "weapon_c4")) continue;
635713
Format(name, sizeof(name), "%T", g_WeaponClasses[i], client);
636714
menu.AddItem(g_WeaponClasses[i], name);
637715
}
@@ -689,6 +767,14 @@ Menu CreateWeaponMenu(int client)
689767

690768
Format(buffer, sizeof(buffer), "%T", "SetSkin", client);
691769
menu.AddItem("skin", buffer);
770+
771+
// VIP Access - Thanks to Kento(https://github.com/rogeraabbccdd)
772+
if(g_bAllSkins){
773+
if(CheckCommandAccess (client, "sm_weapons_all_vip", ADMFLAG_RESERVATION, true)){
774+
Format(buffer, sizeof(buffer), "%T (%T)", "SetSkin", client, "AllSkins", client);
775+
menu.AddItem("skinall", buffer);
776+
}
777+
}
692778

693779
bool weaponHasSkin = (g_iSkins[client][index] != 0);
694780

@@ -797,6 +883,7 @@ Menu CreateMainMenu(int client)
797883
int weaponEntity = GetEntPropEnt(client, Prop_Send, "m_hMyWeapons", i);
798884
if(weaponEntity != -1 && GetWeaponClass(weaponEntity, weaponClass, sizeof(weaponClass)))
799885
{
886+
if (!g_bEnableC4 && StrEqual(weaponClass, "weapon_c4")) continue;
800887
Format(weaponName, sizeof(weaponName), "%T", weaponClass, client);
801888
menu.AddItem(weaponClass, weaponName, (IsKnifeClass(weaponClass) && g_iKnife[client] == 0) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT);
802889
}

0 commit comments

Comments
 (0)