I tried to find it too, here's the "
CInput->ProcessInput()" function peudocode (0.3.7 R1 samp version):
C++:
void __fastcall CInput->ProcessInput_10065d30(int iParm1)
{
char cVar1;
undefined4 uVar2;
code *pcVar3;
char *pcVar4;
char *pcVar5;
char local_84 [132];
char *szInputBuffer;
char *2ndCharPointer;
if (*(int *)(iParm1 + 8) == 0) {
return;
}
/* 0x14e4 = CInput->szInputBuffer[129] */
szInputBuffer = (char *)(iParm1 + 0x14e4);
uVar2 = FUN_10081030(0x80);
FUN_100b6090(szInputBuffer,uVar2);
/* 0x1564 = last char of CInput->szInputBuffer[129] */
*(undefined *)(iParm1 + 0x1564) = 0;
2ndCharPointer = szInputBuffer;
do {
cVar1 = *2ndCharPointer;
2ndCharPointer = 2ndCharPointer + 1;
} while (cVar1 != '\0');
/* 0x14e4 = CInput->szInputBuffer[129]
so it's 2nd character */
if (2ndCharPointer == (char *)(iParm1 + 0x14e5)) goto LAB_10065e74;
CInput->AddRecall_10065930(szInputBuffer);
/* 0x1af0 = CInput->iCurrentRecall */
*(undefined4 *)(iParm1 + 0x1af0) = 0xffffffff;
if (*szInputBuffer != '/') {
/* 0x1af8 = CMDPROC CInput->pszDefaultCMD */
if (*(code **)(iParm1 + 0x1af8) != (code *)0x0) {
(**(code **)(iParm1 + 0x1af8))(szInputBuffer);
}
goto LAB_10065e62;
}
/* 0x14e4 = CInput->szInputBuffer[129]
so it's 2nd character */
2ndCharPointer = (char *)(iParm1 + 0x14e5);
pcVar5 = 2ndCharPointer;
if (*2ndCharPointer == '\0') {
LAB_10065dd4:
pcVar3 = (code *)CInput->GetCommandHandler_10065a70(2ndCharPointer);
if (pcVar3 == (code *)0x0) {
if (DAT_1021a0f8 == 0) goto LAB_10065e58;
SendCommandToServer_10065c60(szInputBuffer);
}
else {
(*pcVar3)(&DAT_100d39c5);
}
}
else {
do {
if (*pcVar5 == ' ') break;
pcVar4 = pcVar5 + 1;
pcVar5 = pcVar5 + 1;
} while (*pcVar4 != '\0');
if (*pcVar5 == '\0') goto LAB_10065dd4;
pcVar4 = szInputBuffer;
do {
cVar1 = *pcVar4;
pcVar4[(int)(local_84 + -(int)szInputBuffer)] = cVar1;
pcVar4 = pcVar4 + 1;
} while (cVar1 != '\0');
*pcVar5 = '\0';
pcVar3 = (code *)CInput->GetCommandHandler_10065a70(2ndCharPointer);
if (pcVar3 == (code *)0x0) {
if (DAT_1021a0f8 != 0) {
SendCommandToServer_10065c60(local_84);
goto LAB_10065e62;
}
LAB_10065e58:
FUN_10064520(DAT_1021a0e4,"I don\'t know that command.");
}
else {
(*pcVar3)(pcVar5 + 1);
}
}
LAB_10065e62:
*szInputBuffer = '\0';
FUN_10080f60(&DAT_100d39c5,0);
LAB_10065e74:
/* 0x14e0 = CInput->iInputEnabled */
if (*(int *)(iParm1 + 0x14e0) != 0) {
if (DAT_1021a0e4 != 0) {
CChat->ScrollToBottom_100637c0();
}
CInput->Close_100658e0();
}
return;
}
I found out that nop'ing samp+0x80f60 function results in the chat input box not being cleared (despite processing the command/text itself), so I assume it has something to do with it. I noticed the same behaviour when noping the first function that is called within 0x80f60:
Code:
10080f6b 50 PUSH EAX
10080f6c 8b cf MOV ECX,EDI
10080f6e e8 bd 69 CALL FUN_10097930
01 00
But I didn't have much luck trying to call 0x80f60 "remotely"...
Edit: It certainly looks like some kind of "cleanup" function for the input box:
C++:
void __thiscall FUN_10080f60(int iParm1,undefined4 param_1)
{
undefined4 uVar1;
FUN_10097930(param_1);
/* 0x122 = CInput->szInputBox->horizontalScrollOffset (a.k.a. how many
characters are hidden on the left side) */
*(undefined4 *)(iParm1 + 0x122) = 0;
uVar1 = (*(code *)0xeacf4)(*(undefined4 *)(iParm1 + 0x4d));
FUN_10080e50(uVar1);
if ((char)param_1 != '\0') {
/* Set cursor pos to the begining */
*(undefined4 *)(iParm1 + 0x11e) = 0;
return;
}
/* 0x119 = CInput->stInputBox->markedTextEndOffset */
/* 0x11e = CInput->szInputBox->textCursorPos */
*(undefined4 *)(iParm1 + 0x11e) = *(undefined4 *)(iParm1 + 0x119);
return;
}