banid
0x001f0ce0 · 1890 bytes · __cdecl
_ZL5banidRK8CCommand
Decompiled
undefined (1 param)
/* banid(CCommand const&) */
void banid(CCommand *param_1)
{
code *pcVar1;
code *pcVar2;
bool bVar3;
char cVar4;
int iVar5;
int iVar6;
undefined4 uVar7;
undefined4 *puVar8;
int *piVar9;
uint uVar10;
int *piVar11;
int *piVar12;
int *piVar13;
char *pcVar14;
int iVar15;
int in_GS_OFFSET;
bool bVar16;
longdouble lVar17;
undefined4 local_1d0;
undefined1 *local_1a4;
undefined4 *local_1a0;
undefined4 local_188 [4];
undefined4 local_178 [6];
char local_160 [64];
undefined1 local_120 [256];
int local_20;
piVar13 = (int *)&stack0xfffffe34;
piVar12 = (int *)&stack0xfffffe34;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_1d0 = 0x1f0cff;
iVar5 = Steam3Server();
if (*(int *)(iVar5 + 0x98) == 1) {
local_1d0 = 0x1f127c;
ConMsg("Can\'t ban users on a LAN\n");
goto LAB_001f0e78;
}
if (5 < *(int *)param_1 - 3U) {
local_1d0 = 0x1f0e6c;
ConMsg("Usage: banid < minutes > < userid | uniqueid > { kick }\n");
local_1d0 = 0x1f0e78;
ConMsg("Use 0 minutes for permanent\n");
piVar12 = (int *)&stack0xfffffe34;
goto LAB_001f0e78;
}
local_1d0 = 0x1f0d28;
lVar17 = (longdouble)V_atof(*(char **)(param_1 + 0x40c));
local_1a4 = (undefined1 *)(float)lVar17;
if ((float)local_1a4 < 0.01) {
local_1a4 = (undefined1 *)0x0;
}
pcVar14 = "";
if (2 < *(int *)param_1) {
pcVar14 = *(char **)(param_1 + 0x410);
}
local_1d0 = 0x1f0d85;
iVar5 = V_strncmp(pcVar14,"#",1);
if (iVar5 == 0) {
local_1d0 = 0x1f125c;
ConMsg("Usage: banid < minutes > < userid | uniqueid > { kick }\n");
local_1d0 = 0x1f1268;
ConMsg("No # necessary\n");
piVar12 = (int *)&stack0xfffffe34;
goto LAB_001f0e78;
}
bVar16 = false;
if (3 < *(int *)param_1) {
local_1d0 = 0x1f0db2;
iVar5 = V_strcasecmp(*(char **)(param_1 + *(int *)param_1 * 4 + 0x404),"kick");
bVar16 = iVar5 == 0;
}
if ((byte)(*pcVar14 - 0x30U) < 10) {
local_1d0 = 0x1f0e98;
iVar5 = V_atoi(pcVar14);
LAB_001f0e9a:
if (DAT_003b8080 < 1) {
piVar11 = (int *)0x0;
}
else {
iVar15 = 0;
do {
piVar11 = *(int **)(DAT_003b8074 + iVar15 * 4);
if (piVar11 != (int *)0x0) {
local_1d0 = 0x1f0ed3;
cVar4 = (**(code **)(*piVar11 + 0x74))();
if (cVar4 != '\0') {
local_1d0 = 0x1f0edf;
cVar4 = (**(code **)(*piVar11 + 0x6c))();
if (cVar4 != '\0') {
local_1d0 = 0x1f0eeb;
cVar4 = (**(code **)(*piVar11 + 0x70))();
if (cVar4 != '\0') {
local_1d0 = 0x1f0ef7;
cVar4 = (**(code **)(*piVar11 + 0x78))();
if (cVar4 == '\0') {
if (iVar5 == -1) {
local_1d0 = 0x1f11fb;
pcVar14 = (char *)(**(code **)(*piVar11 + 0x2c))();
local_1d0 = 0x1f120d;
iVar6 = _V_stricmp(pcVar14,local_160);
if (iVar6 == 0) goto LAB_001f0f10;
}
else {
local_1d0 = 0x1f0f0c;
iVar6 = (**(code **)(*piVar11 + 0x14))();
if (iVar5 == iVar6) {
LAB_001f0f10:
local_1d0 = 0x1f0f22;
(**(code **)(*piVar11 + 0x18))();
bVar3 = true;
piVar13 = &local_1d0;
local_1a0 = local_188;
goto LAB_001f0f68;
}
}
}
}
}
}
}
iVar15 = iVar15 + 1;
} while (iVar15 < DAT_003b8080);
}
if (iVar5 == -1) {
local_1d0 = 0x1f1413;
local_1a0 = (undefined4 *)Filter_StringToUserID(local_160);
bVar3 = false;
if (local_1a0 == (undefined4 *)0x0) {
local_1d0 = 0x1f1438;
ConMsg("banid: Couldn\'t resolve uniqueid \"%s\".\n");
local_1d0 = 0x1f1444;
ConMsg("Usage: banid < minutes > < userid | uniqueid > { kick }\n");
local_1d0 = 0x1f1450;
ConMsg("Use 0 minutes for permanent\n");
piVar12 = (int *)&stack0xfffffe34;
}
else {
LAB_001f0f68:
piVar12 = piVar13;
if (0 < DAT_003b244c) {
iVar5 = 0;
iVar15 = 0;
do {
iVar6 = g_UserFilters;
piVar13[-1] = 0x1f0fa6;
uVar7 = Steam3Server();
*piVar13 = uVar7;
piVar13[2] = (int)local_1a0;
piVar13[1] = iVar6 + iVar5;
piVar13[-1] = 0x1f0fbe;
cVar4 = CSteam3Server::CompareUserID
((CSteam3Server *)*piVar13,(USERID_s *)piVar13[1],
(USERID_s *)piVar13[2]);
if (cVar4 != '\0') {
if (iVar15 < DAT_003b244c) goto LAB_001f0fd7;
break;
}
iVar15 = iVar15 + 1;
iVar5 = iVar5 + 0x18;
} while (iVar15 < DAT_003b244c);
}
if (DAT_003b244c < 0x8000) {
if (*(int *)(sv_banid_enabled._28_4_ + 0x30) == 0) {
piVar13[1] = 0;
*piVar13 = (int)"banid: disabled on server (sv_banid_enabled = %d)\n";
piVar13[-1] = 0x1f12bd;
ConMsg((char *)*piVar13);
}
else {
piVar13[-1] = 0x1f1374;
iVar5 = GetSteamUniverse();
if ((iVar5 == 2) && (*(int *)(sv_banid_dev_enabled._28_4_ + 0x30) == 0)) {
*piVar13 = (int)"banid: disabled in dev mode\n";
piVar13[-1] = 0x1f13d0;
ConMsg((char *)*piVar13);
}
else {
uVar10 = 0;
do {
*(undefined4 *)((int)local_178 + uVar10) = 0;
uVar10 = uVar10 + 4;
} while (uVar10 < 0x18);
*piVar13 = (int)&g_UserFilters;
piVar13[2] = (int)local_178;
piVar13[1] = DAT_003b244c;
piVar13[-1] = 0x1f13b9;
iVar5 = CUtlVector<userfilter_t,CUtlMemory<userfilter_t,int>>::InsertBefore
((CUtlVector<userfilter_t,CUtlMemory<userfilter_t,int>> *)*piVar13,
piVar13[1],(userfilter_t *)piVar13[2]);
iVar5 = iVar5 * 0x18;
LAB_001f0fd7:
puVar8 = (undefined4 *)(g_UserFilters + iVar5);
puVar8[5] = local_1a4;
if ((float)local_1a4 == 0.0) {
puVar8[4] = 0;
*puVar8 = *local_1a0;
puVar8[1] = local_1a0[1];
puVar8[2] = local_1a0[2];
puVar8[3] = local_1a0[3];
piVar13[2] = (int)"permanently";
piVar13[1] = 0x100;
*piVar13 = (int)local_120;
piVar13[-1] = 0x1f1307;
V_snprintf((char *)*piVar13,piVar13[1],(char *)piVar13[2]);
}
else {
puVar8[4] = (float)((double)(float)local_1a4 * 60.0 + (double)realtime);
*puVar8 = *local_1a0;
puVar8[1] = local_1a0[1];
puVar8[2] = local_1a0[2];
puVar8[3] = local_1a0[3];
*(double *)(piVar13 + 3) = (double)(float)local_1a4;
piVar13[2] = (int)"for %.2f minutes";
piVar13[1] = 0x100;
*piVar13 = (int)local_120;
piVar13[-1] = 0x1f106e;
V_snprintf((char *)*piVar13,piVar13[1],(char *)piVar13[2]);
}
local_1a4 = local_120;
piVar13[3] = 0;
piVar13[2] = 0;
piVar13[1] = (int)"server_addban";
*piVar13 = (int)&s_GameEventManager;
pcVar1 = *(code **)(s_GameEventManager + 0x1c);
piVar13[-1] = 0x1f1099;
piVar9 = (int *)(*pcVar1)();
if (piVar9 != (int *)0x0) {
iVar5 = *piVar9;
if (bVar3) {
piVar13[1] = (int)"name";
piVar13[2] = (int)(piVar11 + 0xf);
*piVar13 = (int)piVar9;
pcVar1 = *(code **)(iVar5 + 0x3c);
piVar13[-1] = 0x1f10c7;
(*pcVar1)();
pcVar1 = *(code **)(*piVar9 + 0x30);
iVar5 = *piVar11;
*piVar13 = (int)piVar11;
pcVar2 = *(code **)(iVar5 + 0x14);
piVar13[-1] = 0x1f10d4;
iVar5 = (*pcVar2)();
piVar13[1] = (int)"userid";
piVar13[2] = iVar5;
*piVar13 = (int)piVar9;
piVar13[-1] = 0x1f10e5;
(*pcVar1)();
pcVar1 = *(code **)(*piVar9 + 0x3c);
iVar5 = *piVar11;
*piVar13 = (int)piVar11;
pcVar2 = *(code **)(iVar5 + 0x2c);
piVar13[-1] = 0x1f10f2;
iVar5 = (*pcVar2)();
piVar13[1] = (int)"networkid";
piVar13[2] = iVar5;
*piVar13 = (int)piVar9;
piVar13[-1] = 0x1f1103;
(*pcVar1)();
}
else {
piVar13[2] = (int)&DAT_002c79d4;
piVar13[1] = (int)"name";
*piVar13 = (int)piVar9;
pcVar1 = *(code **)(iVar5 + 0x3c);
piVar13[-1] = 0x1f1322;
(*pcVar1)();
iVar5 = *piVar9;
piVar13[2] = 0;
piVar13[1] = (int)"userid";
*piVar13 = (int)piVar9;
pcVar1 = *(code **)(iVar5 + 0x30);
piVar13[-1] = 0x1f133a;
(*pcVar1)();
pcVar1 = *(code **)(*piVar9 + 0x3c);
*piVar13 = (int)local_1a0;
piVar13[-1] = 0x1f1353;
iVar5 = GetUserIDString((USERID_s *)*piVar13);
*piVar13 = (int)piVar9;
piVar13[2] = iVar5;
piVar13[1] = (int)"networkid";
piVar13[-1] = 0x1f136a;
(*pcVar1)();
}
iVar5 = *piVar9;
piVar13[2] = (int)&DAT_002c79d4;
piVar13[1] = (int)"ip";
*piVar13 = (int)piVar9;
pcVar1 = *(code **)(iVar5 + 0x3c);
piVar13[-1] = 0x1f111b;
(*pcVar1)();
iVar5 = *piVar9;
piVar13[1] = (int)"duration";
*piVar13 = (int)piVar9;
piVar13[2] = (int)local_1a4;
pcVar1 = *(code **)(iVar5 + 0x3c);
piVar13[-1] = 0x1f1135;
(*pcVar1)();
pcVar1 = *(code **)(*piVar9 + 0x3c);
pcVar14 = "Console";
if (cmd_source != 1) {
pcVar14 = (char *)(host_client + 0x3c);
}
piVar13[2] = (int)pcVar14;
piVar13[1] = (int)"by";
*piVar13 = (int)piVar9;
piVar13[-1] = 0x1f1161;
(*pcVar1)();
pcVar1 = *(code **)(*piVar9 + 0x30);
uVar10 = 0;
if ((bool)(bVar3 & bVar16)) {
uVar10 = (uint)(piVar11 != (int *)0x0);
}
piVar13[2] = uVar10;
piVar13[1] = (int)"kicked";
*piVar13 = (int)piVar9;
piVar13[-1] = 0x1f1191;
(*pcVar1)();
piVar13[2] = 0;
piVar13[1] = (int)piVar9;
*piVar13 = (int)&s_GameEventManager;
pcVar1 = *(code **)(s_GameEventManager + 0x20);
piVar13[-1] = 0x1f11b0;
(*pcVar1)();
}
if (((bool)(bVar3 & bVar16)) && (piVar11 != (int *)0x0)) {
iVar5 = *piVar11;
piVar13[1] = (int)"You have been kicked and banned %s by the server.\n";
*piVar13 = (int)piVar11;
piVar13[2] = (int)local_1a4;
pcVar1 = *(code **)(iVar5 + 0x68);
piVar13[-1] = 0x1f11dc;
(*pcVar1)();
iVar5 = *piVar11;
piVar13[1] = (int)"Kicked and banned";
*piVar13 = (int)piVar11;
pcVar1 = *(code **)(iVar5 + 0x3c);
piVar13[-1] = 0x1f11ec;
(*pcVar1)();
}
}
}
}
else {
*piVar13 = (int)"banid: user filter list is full\n";
piVar13[-1] = 0x1f13e1;
ConMsg((char *)*piVar13);
}
}
}
else {
local_1d0 = 0x1f1468;
ConMsg("banid: couldn\'t find userid %d\n");
piVar12 = (int *)&stack0xfffffe34;
}
}
else {
local_1d0 = 0x1f0de1;
iVar5 = V_strnicmp(pcVar14,"STEAM_",6);
if (iVar5 == 0) {
pcVar14 = "";
if (3 < *(int *)param_1) {
pcVar14 = *(char **)(param_1 + 0x414);
}
local_1d0 = 0x1f0e09;
iVar5 = _V_strstr(pcVar14,":");
if (iVar5 != 0) {
iVar5 = -1;
local_1d0 = 0x1f0e57;
V_snprintf(local_160,0x40,"%s:%s:%s");
goto LAB_001f0e9a;
}
}
local_1d0 = 0x1f1230;
ConMsg("Can\'t ban users with ID \"%s\"\n");
piVar12 = (int *)&stack0xfffffe34;
}
LAB_001f0e78:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined **)((int)piVar12 + -4) = &UNK_001f1472;
__stack_chk_fail();
}
return;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.